不同程式語言有哪些差異?如何選擇入門語言?

刀法如飛 發佈 2022-07-23T20:27:23.101907+00:00

例如:20 = 2 * 2 * 5;algorithms/factor at master · microwind/algorithms · GitHub。

不同程式語言有不同的差異,但本質上都相同,都有著流程控制語句和循環、加減乘除運算等,都是通過批量處理來完成重複性的工作。一門好的語言要符合人性,讓人使用起來順手,還不容易出錯,寫的代碼還易於維護和擴展,同時運行速度要足夠快。這個世界上並沒有完美的語言,不同語言在不同環境下有著不同的優勢。以下讓我們通過一個算法實例來理解不同語言之間的差異。

算法例子:質因數分解算法

我們通過這個算法例子來簡單弄明白各語言之間的差異,以下給出的是部分實現代碼,更詳細代碼需要查看源文件。

首先什麼是質因數分解算法?即任意一個合數可以分解為多個質數相乘。

例如:20 = 2 * 2 * 5; 30 = 2 * 3 * 5; 100 = 2 * 2 * 5 * 5。

按數學運算:列豎式或左右分解,拿能被整除的最小的質數做除數,不斷整除得到新的得數,最後把所有的除數和最後的得數連起來就是。

代碼實現思路:

  1. 先設立一個除數,從最小的質數開始,也就是2;
  2. 當能夠被當前除數整除時,該除數就是因數,將原數字設為被整除後的結果;
  3. 繼續從該除數開始整除新的結果,並不斷循環;
  4. 當無法被整除時,則遞增得到新的除數,繼續第2步;
  5. 直到除數的平方大於要分解的值,終止循環。 最後所有的除數與剩下的大於1的那個得數就是分解結果。

各種程式語言的比較:

一、C語言

C語言是面向過程的靜態編譯型語言,也是一切高級語言的鼻祖,可以說如今幾乎所有流行的語言都有C語言的影子。C語言在底層開發,包括作業系統、驅動、中間件、圖形庫、資料庫、網絡庫等開發等有著無可替代的作用。

C語言的生命力也是最長的,流行了近50年,至今還是開發排行榜前3的位置。C語言足夠簡潔清晰,沒有那麼多概念,也沒有那麼多API,性能極好,它是所有編程人員都應該掌握的語言。

C語言代碼實現如下,該factorize可以返回一個分解後的數組。從代碼里可以看出,首先需要申請一個動態數組result,長度為len的內存空間。該數組用來保存分解數,每分解出一個數字時則追加到數組中去,數組下標也隨之增加。當分解完成後,最後返回分解數的數組。

代碼邏輯:

  1. 建立雙循環,自最小的質數2開始不斷遞增遍歷。
  2. 外層循環為是否繼續分解的條件,當i的乘方小於等於要分解的數字時,說明還可以分解。i不斷遞增,直到i的平方大於num為止。
  3. 內循環則不斷用num來除以約數,看能否除盡,能除盡則以得數作為新的num來繼續分解,並將剛才的除數i追加到分解結果中。當i無法整除num時,說明當前i分解完成,則跳出內循環。
  4. 當循環終止後,最後分解的得數如果小於i的平方就沒法繼續分解,如果i大於1那剩下的num就是最後一個分解數。

二、C++語言

C++語言是C語言的超集,它擴充和完善了C語言。增加了類的概念,並引進了運算符重載、引用、虛函數等。C++做什麼都離不開對象和類,其核心思想是多態,繼承,封裝。C++的語法與C幾乎一致,基本上C的代碼可以在C++下運行,但是C++比C語言要複雜和更難掌握,相對來講C更加清晰易懂。

由於C語言相對簡單,且是過程式,開發大型複雜系統或者大型軟體界面時會力不從心,於是C++應運而生。其實我並不覺得C++比C好或強大,大型系統完全可以通過自己組織代碼來得到良好架構,也有很多單獨C語言UI庫。

C++的生命力也很強大,幾乎是很多中大型系統、遊戲、桌面軟體、服務端、網絡通信等的首選語言,至今也在開發排行榜前5的位置。

這裡C++代碼實現與C語言一致,因為沒有用到面向對象,所以沒有任何區別。其他差異可以從github倉庫里查看。

三、Java語言

Java語言發明於上世紀90年代,由Sun公司推出,後被Oracle收購。Java是一門面向對象程式語言,吸收了C++的各種優點,但放棄了C++里難以理解的多繼承、指針等概念。同時提供了垃圾自動回收的能力,程式設計師再也不用手動釋放內存了。

Java的語法與C基本一致,除了增加了類以及集合相關的概念。Java主要面向的領域是後台開發、中間件開發、Android開發、大數據開發等,目前Java是編程排行榜排名第一的語言,非常流行,作為入門學習語言非常不錯。不過由於設計的過於嚴謹刻板導致有些臃腫,目前已有下滑的跡象。後起之秀Go、Kotlin、NodeJS、Dart無不在蠶食Java的地盤。

相信不久的將來,Java開發排行榜老大的地位將面臨很大的挑戰。跟Java非常像的是它的老對手C#,這個語言在Windows環境下那是絕對的老大,但可惜在Linux以及Mac、iOS、Android等系統下,C#幾乎無人問津。Java地位岌岌可危,但C#進化得不錯,前景很好,這裡不再贅述。

這裡Java版使用了ArrayList,是長度可變的列表,相比C語言使用數組來講要方便些。代碼上基本一樣,如果也使用int數組,那代碼就幾乎一樣了。Java里一切都是以Class為基礎,所有內容都必須放在Class內,方法(函數)、屬性(變量)不能獨立於外。

四、JavaScript語言

JavaScript是網景公司在90年代不經意間發明的一種語言,起初是為了解決瀏覽器內交互的問題。最初的名字是LiveScript,但當時Java剛剛推出,因為從語法上也參考了Java,因此就借鑑了Java的名字,改為JavaScript。但實際上它的語言本質更接近Self及Scheme,JavaScript是一門基於對象的函數式動態程式語言。它非常靈活,語法越來越完善,看起來非常簡單,但是要想真的搞明白原理,卻並不容易。

中國有句話叫「無心插柳柳成蔭」,這句話用在JavaScript身上再合適不過了。JavaScript博採眾長,吸收了Self、Scheme、Java、C等語言的優勢,目前已經發展成為全球使用人數最多的程式語言,在開發排行榜上也在不斷攀升。

JavaScript是弱類型語言,其數組不限類型,也無需指定長度,使用起來非常簡單易懂。整個代碼寫法與Java也非常像,只不過簡潔了許多。

JavaScript除了獨占瀏覽器編程之外,在後台開發、移動開發、桌面開發、嵌入式開發等領域均有所發揮,可以說未來不可限量。甚至有人說凡是可以用JavaScript實現的應用,最終都會用JavaScript實現。

五、TypeScript語言

Typescript是微軟在2012年推出的基於JavaScript的一個變種或者稱之為超集語言,完全兼容JavaScript,最後會編譯成JS來執行。它主要增加了強類型和增強了面向對象,集成了接口和Type等概念,寫法上與JS幾無差異,有點類似於C++之於C的感覺。

TypeScript的發展態勢也很好,在使用大型工程時,強類型和面向對象的確有些好處。隨著前端工程越來越龐大,TypeScript也越來越受到歡迎。只是TypeScript由微軟開發,而JS來自ECMA這個國際化標準組織。

且JavaScript正在不斷發展變化,也在不斷增加TS的那些語法糖。存在一個可能是將來有一天JS跟TS非常接近,甚至完全一致,那時候TS可能面臨退出編程舞台。但JS或許並不一定會那麼發展,因為那跟靈活多變的動態思路有悖。

因此TypeScript並不適合作為入門學習語言,而是在已經比較熟悉JavaScript的基礎上再來學習TypeScript會比較好。

六、Python語言

Python是支持面向對象和面向過程,也支持函數式編程的解釋型程式語言,它在語法風格上也屬於C語言系。但它與其他語言所不同的是採用縮進來表示包含關係,而不是花括號。喜歡這種風格的人對此愛得要命,不喜歡的人則反感至極。

從語言特性上來講,可以說Python與JS最為接近,既可以採用面向對象,也可以採用函數式。它與Java不同,沒有變量類型聲明關鍵詞,方法也可以脫離於類存在。Python總體上是一個強類型語言(但因為無需明確變量類型,以及存在自動類型轉換,所以也不是嚴格意義的強類型)。

看Python代碼,可以說是最簡單明了,最易懂。與JavaScript一樣,Python也是動態腳本語言,列表(數組)也是動態可變的,其列表操作非常好用。Python很適合新手學習,因為簡單,同時含括了編程的幾乎所有概念。

Python自90年代推出,早期為增強Shell腳本,後來發展為Web後台語言,一直不溫不火,後來隨著大數據和人工智慧的流行,Python在這兩個領域裡大放光彩,未來前景非常好,是最值得推薦學習的入門語言。

看下Python的代碼量是否最少(跟JS差不多),也最好懂?

七、Go語言

Go語言是靜態編譯強類型語言,由Google於2009年推出,其初衷是替代C語言做系統開發,但目前來看更多是替代Java做服務端開發。其語法風格與C十分接近,在C語言基礎上增加了內存安全和垃圾自動回收功能。

Go語言不以類為依賴,語言非常簡練,語法風格上是C和JS的混合體,變量聲明是var,數組空間需要提前申請,無需括號和分號。從這段代碼來看與C語言差異不大,本質上是C的變體。

Go語言目前在微服務和雲原生領域頗受歡迎,在高並發、高可用Web應用中發揮著良好的作用,這部分有取代Java的趨勢。Go語言在分布式系統、網絡編程領域表現良好,目前最流行的容器編排系統Kubernetes就是Go語言編寫,未來更多雲原生應用會逐漸採用Go語言。

Go作為新貴,這幾年開始在服務端大放異彩,因此如果您是新一代的開發者,那麼跳過C++和Java,直接學習Go也是值得推薦的。看下Go的代碼風格,您感覺舒服嗎?我感覺比起Java好一些。

八、Kotlin語言

Kotlin是JetBrains公司於2011年推出的程式語言,這是一個面向JVM的新語言。JetBrains就是開發IDEA編輯器的公司。

Kotlin代碼最終編譯成Java字節碼class執行,也可以編譯成JavaScript,以方便在沒有JVM的設備上運行。除此之外Kotlin還可以編譯成二進位代碼直接在作業系統上運行。

Kotlin也可以看成是一種Java語法糖,是完全兼容Java語法的。Kotlin相當於是簡化版的Java,的確Java太臃腫了,Kotlin提供了變量類型、高階函數、函數獨立等,可以說使得編程更接近於JS和Python。

在Kotlin 中沒有原始類型,一切都是對象。參數一旦將值分配給val,就無法更改。如果想重新分配它,則必須將其聲明為var,而在Kotlin的方法中,參數隱式聲明為final val,也無法更改參數。因此,這裡將number賦值給變量num。

Kotlin語言設計的確很優秀,目前已正式成為Android官方支持的開發語言,所以如果做Android開發,那麼直接學Kotlin吧,沒必要學Java了。看以下代碼是否有Java和JS的影子?

九、Dart語言

Dart是支持即時編譯和提前編譯的強類型語言,於2011年由Google推出。主要針對JavaScript,對JavaScript一些不適合的特性進行改進,如弱類型,非完全面向對象等。Dart的理念是借鑑Java 語言的數據類型和內存管理機制和面向對象的特徵,同時借鑑 Scheme 語言,將函數提升到「第一等公民」(first class),再就是參考 Self 語言,使用基於原型(prototype)的繼承機制。這麼看來幾乎就是JavaScript的翻版或者說是JavaScript增強實現,跟TypeScript不同的時,它並不兼容JavaScript。

Dart語法與JS幾乎一致,只不過需要提前編譯並且是嚴格數據類型。但在實際使用上與JS可謂非常接近,熟悉JS或TS的開發者上手幾乎零成本。

Dart目前主要用在Flutter框架下,用於Android系統開發App,目前來看未來存在較大不確定性。因此Dart不太適合作為入門語言,而是在你充分掌握JavaScript或Java的前提下去學習它。

注意這裡取整除法與其他語言略有不同,如果不加~則得到小數了。

十、Swift語言

Swift是蘋果於2014年推出的旨在替代Objective-C的語言,主要用於iOS開發。Swift是靜態編譯強類型語言,但從語法風格上跟JS有點相似,用var聲明,function第一型,結尾不要分號,function縮寫為func。似乎也跟Go語言有點像。可以說Swift具有腳本語言的表現力和趣味性,同時具備系統程式語言的嚴肅性和高性能,取代Objective-C指日可待。但是Swift似乎領域有限,僅限於Mac和iOS客戶端開發。

從語言趨勢上看,C+Java+JS的結合體會是大勢所趨。尤其是類JS和Python語法,幾乎所有最新的高級語言都在吸收JS或Python的簡潔優雅特性,當然都摒棄了JS弱類型的特點。從Swift看數組聲明也非常方便,無需申請空間和指定長度,可以任意append與移除。看看以下代碼,是否與JS幾乎一致了?

Swift是所有做蘋果和iOS開發所必須學習的語言,但不適合作為編程新手入門學習。因此編程入門還是學更大眾和流行的語言為好。

十一、Objective-C語言

Objective-C(簡稱OC)是蘋果原生的開發語言,衍生於C語言,在Mac下就像Windows裡面的VC++一樣。但說實話OC的語法看起來並不是很友好,從變量聲明到對象調用,看起來與其他語言不是很一致,使用起來覺得和彆扭。雖然語法風格上有點彆扭,但總體上來也是類C的,所以本質上區別不大。

OC的類聲明是Interface,然後通過implementation來實現類。OC的方法如果寫在類里,則是方法,如果寫在外面就是函數。其數組要申請分配空間,但長度無需指定。其數組操作和對象引用的寫法上與其他語言差異較大,但從本質上來講也是一致的,只是語言風格有所差異,所以習慣了也還好。

看一下OC的這個類和方法,相比其他語言來講總體結構一致,但是語言風格上要顯得囉嗦。所以,OC不適合作為入門學習語言,甚至可以不去專門研究,直接學習Swift即可。

十二、Rust語言

Rust最初由Mozilla研究院提出,後經多方改良,於2015年正式發布。Rust的語法和C、C++非常類似,它的目標就是替代C和C++。

Rust的目標是高安全、高性能、高並發,它拋棄了影響性能的垃圾回收器,通過變量所有權的方式來自動釋放內存,同時提供多線程支持,Rust是內存安全的。

Rust 雖然沒有沒有專門的Class來聲明對象,但它支持面向對象。Rust可通過結構體來定義類,再通過impl來實現。在 Rust 中雖沒有extends,但可以通過特性(trait)實現多態。

Rust從語法上足夠精煉,風格比較像簡練的高級語言,提供的元組(Tuple)和動態數組(Vector)、切片(Slice)模式非常方便,沒有C/C++操作數據那麼繁瑣,但同時其又保持了底層語言的優越性能,能看得出來Rust是牛人精心打造的。所以未來,很可能Rust會取代C、C++以及Go和Java。

因此Rust是個非常值得學習的語言,但是不太適合新手入門。當你掌握了Python、Java或JavaScript的任意一種,這時候非常有必要學習Rust。

總結

以上分析了目前流行的幾門語言的特點,包括C、C++、Java、JS、Python等流行語言,同時也研究了Swift、Go、Kotlin、Dart、Rust等新型語言。

以上這些語言在未來長時間內都會有著不錯的發展,暫時來看都不會被其他語言所替代(已被替代或將會被替代的語言我都沒有提及),其中C、Java、Python、JavaScript/TypeScript、Go、Kotlin、Swift都有著不錯的就業前景,如果要找工作,這幾門語言都不錯。

如果想要學習編程,由簡到難地熟練掌握一門程式語言。那麼Python、Java或JavaScript、Go,都是不錯的選擇。

源碼下載:

https://github.com/microwind/algorithms/tree/master/factor

algorithms/factor at master · microwind/algorithms · GitHub

https://github.com/microwind/algorithms

GitHub - microwind/algorithms: Some algorithm code for JS/Java/C/Python and other programming languages


相關閱讀

不同語言實現質因數分解算法的差異

一看就懂:Go語言實現合併排序算法,就這麼簡單

Go語言數組切片去重複的幾種算法

堆排序算法詳解

JavaScript桶排序算法詳解

Java合併已排序數組算法,就是這麼簡單

JavaScript快速排序遞歸版與非遞歸版實現

Flutter Dart數組去重的幾種算法對比

JavaScript插入排序算法通俗說明

關鍵字: