愛伊米

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

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

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

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

我們透過這個演算法例子來簡單弄明白各語言之間的差異,以下給出的是部分實現程式碼,更詳細程式碼需要檢視原始檔。

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

例如:20 = 2 * 2 * 5; 45 = 3 * 3 * 5; 210 = 2 * 3 * 5 * 7

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

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

質因數分解圖例

程式碼實現思路:

先設立一個除數,從最小的質數開始,也就是2;

當能夠被當前除數整除時,該除數就是因數,將原數字設為被整除後的結果;

繼續從該除數開始整除新的結果,並不斷迴圈;

當無法被整除時,則遞增得到新的除數,繼續第2步;

直到除數的平方大於要分解的值,終止迴圈。 最後所有的除數與剩下的大於1的那個得數就是分解結果。

各種程式語言的比較:

一、C語言

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

C語言的生命力也是最長的,流行了近50年,至今還是開發排行榜前3的位置。C語言足夠簡潔清晰,沒有那麼多概念,也沒有那麼多API,效能極好,它是所有程式設計人員都應該掌握的語言,可以作為計算機基礎來學。

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

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

程式碼邏輯:

建立雙迴圈,自最小的質數2開始不斷遞增遍歷。

外層迴圈為是否繼續分解的條件,當

i

的乘方小於等於要分解的數字時,說明還可以分解。

i

不斷遞增,直到

i

的平方大於

num

為止。

內迴圈則不斷用

num

來除以約數,看能否除盡,能除盡則以得數作為新的

num

來繼續分解,並將剛才的除數

i

追加到分解結果中。當

i

無法整除

num

時,說明當前

i

分解完成,則跳出內迴圈。

當迴圈終止後,最後分解的得數如果小於

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/C++、Java、Python、JavaScript/TypeScript、Go、Kotlin、Swift都有著不錯的就業前景,如果要找工作,這幾門語言都不錯。

如果想要學習程式設計,先要理解資料結構和演算法,可以由C語言開始,然後需要挑一門程式語言由淺入深,系統性地學習。那麼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

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

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

https://github。com/microwind/algorithms/blob/master/recommand-learning-languages。md

相關閱讀

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

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

Go語言陣列切片去重複的幾種演算法

堆排序演算法詳解

JavaScript桶排序演算法詳解

Java合併已排序陣列演算法,就是這麼簡單

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

Flutter Dart陣列去重的幾種演算法對比

JavaScript插入排序演算法通俗說明