乾貨 | Go/Python/Erlang程式語言對比分析及示例

2021-02-13 21CTO

作者簡介:

陳彬是一名程序語言愛好者,認證技術教練,致力於軟體開發團隊的技術能力提升和項目的軟體質量改善。隨著Docker、k8s等應用的火熱,其開發語言Go也受到越來越多的關注。本文對Go和Python、Erlang做了一些有趣的分析對比,相信大家能從中感受到Go語言的強大和與眾不同。

本文主要是介紹Go,從語言對比分析的角度切入。之所以選擇與Python、Erlang對比,是因為做為高級語言,它們語言特性上有較大的相似性,不過最 主要的原因是這幾個我比較熟悉。 Go的很多語言特性借鑑與它的三個祖先:C,Pascal和CSP。Go的語法、數據類型、控制流等繼承於C,Go的包、面對對象等思想來源於Pascal分支, 而Go最大的語言特色,基於管道通信的協程並發模型,則借鑑於CSP分支。

Go/Python/Erlang語言特性對比 

如《 程式語言與範式 》一文所說,不管語言如何層出不窮,所有語言的設計離不開2個基本面:控制流和數據類型。為了提升語言描述能力,語言一般都提供控制抽象和數據抽象。本小節的語言特性對比也從這4個維度入手,詳見下圖( 點擊見大圖 )。

 圖中我們可以看出,相比於Python的40個特性,Go只有31個,可以說Go在語言設計上是相當克制的。

比如,它沒有隱式的數值轉換,沒有構造函數和 析構函數,沒有運算符重載,沒有默認參數,也沒有繼承,沒有泛型,沒有異常,沒有宏,沒有函數修飾,更沒有線程局部存儲。 

但是Go的特點也很鮮明,比如,它擁有協程、自動垃圾回收、包管理系統、一等公民的函數、棧空間管理等。 

Go作為靜態類型語言,保證了Go在運行效率、內存用量、類型安全都要強於Python和Erlang。 

Go的數據類型也更加豐富,除了支持表、字典等複雜的數據結構,還支持指針和接口類型,這是Python和Erlang所沒有的。特別是接口類型特別強大, 它提供了管理類型系統的手段。

而指針類型提供了管理內存的手段,這讓Go進入底層軟體開發提供了強有力的支持。 

Go在面對對象的特性支持上做了很多反思和取捨,它沒有類、虛函數、繼承、泛型等特性。

Go語言中面向對象編程的核心是組合和方法(function)。

組合很類似於C語言的struct結構體的組合方式,方法類似於Java的接口(Interface),但是使用方法上與對象更加解耦,減少了對對象內部的侵入。

Erlang 則不支持面對對象編程範式,相比而言,Python對面對對象範式的支持最為全面。 

在函數式編程的特性支持上,Erlang作為函數式語言,支持最為全面。

但是基本的函數式語言特性,如lambda、高階函數、curry等,三種語言都支持。 控制流的特性支持上,三種語言都差不多。

Erlang支持尾遞歸優化,這給它在函數式編程上帶來便利。而Go在通過動態擴展協程棧的方式來支持深度遞 歸調用。Python則在深度遞歸調用上經常被爆棧。 Go和Erlang的並發模型都來源於CSP,但是Erlang是基於actor和消息傳遞(mailbox)的並發實現,Go是基於goroutine和管道(channel)的並發實 現。

不管Erlang的actor還是Go的goroutine,都滿足協程的特點:由程式語言實現和調度,切換在用戶態完成,創建銷毀開銷很小。

至於Python,其多 線程的切換和調度是基於作業系統實現,而且因為GIL的大坑級存在,無法真正做到並行。 

而且從筆者的並發編程體驗上看,Erlang的函數式編程語法風格和其OTP behavior框架提供的晦澀的回調(callback)使用方法,對大部分的程式設計師, 如C/C++和Java出身的程式設計師來說,有一定的入門門檻和挑戰。而被稱為「網際網路時代的C」的Go,其類C的語法和控制流,以及面對對象的編程範式, 編程體驗則好很多。

Go/Python/Erlang語言語法對比


所有的語言特性都需要有形式化的表示方式,Go、Python、Erlang三種語言語法的詳細對比如下(點擊見完整大圖 第一部分 , 第二部分 , 第三部 分 )。

正如Go語言的設計者之一Rob Pike所說,「軟體的複雜性是乘法級相關的」。

這充分體現在語言關鍵詞(keyword)數量的控制上,Go的關鍵詞是最少 的,只有25個,而Erlang是27個,Python是31個。

從根本上保證了Go語言的簡單易學。 

Go語言將數據類型分為四類:基礎類型、複合類型、引用類型和接口類型。

基礎類型包括:整型、浮點型、複數、字符串和布爾型。

複合數據類型有數 組和結構體。引用類型包括指針、切片、字典、函數、通道。

其他數據類型,如原子(atom)、比特(binary)、元組(tuple)、集合(set)、記錄 (record),Go則沒有支持。

Go對C語言的很多語法特性做了改良,正如Rob Pike在《 Less is Exponentially More 》中提到,Go的「起點: C語言,解決一些明顯的瑕疵、刪除雜 質、增加一些缺少的特性。」

比如,switch/case的case子程序段默認break跳出,case語句支持數值範圍、條件判斷語句;所有類型默認初始化為0, 沒有未初始化變量;把類型放在變量後面的聲明語法( 連結 ),使複雜聲明更加清晰易懂;沒有頭文件,文件的編譯以包組織,改善封裝能力;用空接 口(interface {})代替void *,提高類型系統能力等等。 

Go對函數,方法,接口做了清晰的區分。

與Erlang類似,Go的函數作為第一公民。

函數可以讓我們將一個語句序列打包為一個單元,然後可以從程序中 其它地方多次調用。

函數和方法的區別是指有沒有接收器,而不像其他語言那樣是指有沒有返回值。

接口類型具體描述了一系列方法的集合,而空接口 interfac{}表示可以接收任意類型。

接口的這2中使用方式,用面對對象編程範式來類比的話,可以類比於subtypepolymorphism(子類型多態)和ad hoc polymorphism(非參數多態)。 

從圖中示例可以看出,Go的goroutine就是一個函數,以及在堆上為其分配的一個堆棧。所以其系統開銷很小,可以輕鬆的創建上萬個goroutine,並且 它們並不是被作業系統所調度執行。

goroutine只能使用channel來發送給指定的goroutine請求來查詢更新變量。這也就是Go的口頭禪「不要使用共享 數據來通信,使用通信來共享數據」。channel支持容量限制和range迭代器。

Go/Python/Erlang語言詞法對比


TDD Go編程示例


本小節以TDD方式4次重構開發一個斐波那契算法的方式,來簡單展示Go的特性、語法和使用方式,如Go的單元測試技術,並發編程、匿名函數、閉包 等。 首先,看一下TDD最終形成的單元測試文件:

基於遞歸的實現方案:

測試結果:

基於goroutine實現的並發方案:

測試結果:

基於迭代的實現方案:

測試結果:

基於閉包的實現方案:

測試結果:

作者:陳彬


相關焦點

  • Go語言和Java、Python等其他語言的對比分析
    3、出身名門、血統純正之所以說Go出身名門,從Go語言的創造者就可見端倪,Go語言絕對血統純正。其次Go語言出自Google公司,Google在業界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種程式語言稱雄爭霸的局面下推出新的程式語言,自然有它的戰略考慮。
  • 無所不能的python編程是怎麼快速畫圖的呢?5分鐘學會!
    θɑ:n]),是一種面向對象、直譯式電腦程式語言,也是一種功能強大的通用型語言,已經具有近二十年的發展歷史,成熟且穩定。它包含了一組完善而且容易理解的標準庫,能夠輕鬆完成很多常見的任務。它的語法非常簡捷和清晰,與其它大多數程序設計語言不一樣,它使用縮進來定義語句。
  • 回顧Erlang簡要
    並發編程可以用來提升性能,創建可擴展和容錯的系統,以及編寫清晰和可理解的程序來控制現實世界裡的應用。並發程序是以一種並發程式語言編寫的程序,並發程式語言擁有用於編寫並發程序的語言結構。Erlang的並發程序是由互相通信的多組順序進程組成,一個進程就是一個輕量級的虛擬機,可以執行單個的Erlang函數,只能通過發送和接收消息來與其他進程通信。
  • 華為雲的Go語言編程的眾多乾貨
    華為雲的Go語言編程的眾多乾貨 華為云云原生 發表於 2020-12-17 17:59:11   近日,國內較權威的
  • 大話go 語言:談談 go 語言的類型系統
    引言:最近地鐵上沒事,準備花一點時間研究下 go 語言,分兩節來分享,這節首選『類型系統』因為我覺得類型系統是一門語言之核心。五年前,曾被面試官面試到 C 和 C++的區別。其中有被問到如何用 C 語言實現面向對象編程。
  • Python 編程 5 年後,我轉向了 Go!
    但是和 Google 的第二款開源程式語言 Go 相比,Python 的性能完全處於較弱一方。在此局面下,「棄 Python 而擁抱 Go」的言論不絕於耳,但是我們究竟該怎麼做才能遷移成功?其中又有哪些值得關注的點?在本文中,作者不論語言好壞,只談從 Python 到 Go 的經驗分享,希望對大家有所裨益。
  • 一個go和python有趣的例子
    今天在一博文中看到一個有趣的問題,分享給大家,曾經也通過自學學習過python程式語言,python是一門很簡煉、功能豐富的語言,目前已大量用於科學研究和網際網路開發各個領域
  • Python和Go都很火,我要怎麼選?
    在某些方面,其他語言真的不香嗎?本文作者對比了 Go 和 Python 的特點及測試結果,認為開發者應基於項目的屬性和規模以及所需技能組合,合理地選擇程式語言,而不是一味地將 Python 用在所有任務中。網際網路上有大量優秀的代碼,它們構成了多種基礎架構的基石。甚至本文所在網站的創建初衷也是創建優秀代碼。
  • 程式語言學哪個比較好?2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。2、python-最好的程式語言Python 是一種模塊化的、易於學習的、面向對象的解釋型電腦程式設計語言。Web應用、用戶界面、數據分析、數據統計——無論是什麼問題,Python都有框架可以解決。用Python編寫的許多開源庫能夠實現數據科學廣泛使用的一些核心的機器學習算法。
  • 2021年程式語言趨勢預測:Python和JavaScript仍火熱,Go不可小覷
    程式語言及框架似乎總是被人拿來比較,這裡我們只談語言。作為開發人員,在當今這個技術更迭飛快的時代要連年吃香並非易事,很多十年開發經驗以上的開發人員不知道經歷了多少語言的變化,今年還在用C語言,下一年就是D了。「PHP是世界上最好的程式語言」已被人忘卻,但「青春飯」和35歲「金龍躍魚門」的傳說確真實發生。
  • Hamler 0.2 正式發布,基於 Erlang 與 Haskell 的程式語言
    Hamler 是一門構建在 Erlang 虛擬機(VM)上的 Haskell 風格的強類型(Strongly-typed)程式語言,獨特地結合了編譯時的類型檢查推導,與對運行時高並發和軟實時能力的支持。
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?
  • 乾貨 | 摩根大通: 不懂Python=金融文盲?
    對於投行從業者來說,python對於創建分析工具和定量模型非常有用,投行和對衝基金交易策略都少不了它的幫助。像是高盛CEO Lloyd Blankfein 和 J.P. Morgan前CEO Marianne Lake都曾說過投行其實就是一家科技公司。而且,目前會編程的banker非常緊俏,尤其是會python。
  • Python已經成為排名第一的程式語言!附帶最新Python400集視頻教學
    1.Web應用開發  2.系統網絡運維  3.科學與數字計算  4.3D遊戲開發  5.圖形界面開發  6.網絡編程  Python已經成為最受歡迎的程序設計語言之一。2011年1月,它被TIOBE程式語言排行榜評為2010年度語言。
  • Python程式語言被納入浙江高考,小學生都開始學了
    其中,新初二將新增Python編程課程內容。新高一信息技術程式語言由VB替換為Python,大數據、人工智慧、程序設計與算法按照教材規劃五六年級開始接觸。這意味著執行同一個任務,python的幾行代碼就可以完成其他程式語言十幾行才能完成的事情。
  • 杭州少兒編程培訓機構哪家好?少兒編程Python語言好學嗎
    現在,人工智慧和數據分析正在蓬勃發展,python是一顆冉冉升起的新星。有人說python可能是所有語言中最適合人類編程的。為什麼?因為python比任何其他語言更高效、更快、更強大!少兒編程Python語言好學嗎開發更有效率有數據表明,python的效率是Java的兩倍,這意味著python的代碼行數更少,對於編程技能掌握方面
  • Python基礎知識——python面向對象的解釋型計算機程式語言
    python面向對象的解釋型計算機程式語言。,即彙編器高級程式語言,c語言,Java語言,Python語言,JavaScript語言高級計算機程式語言,分為:解釋型程式語言和編譯型程式語言(程序+翻譯器)翻譯軟體:一種稱為虛擬機,一種稱為解釋器c語言,c++語言,Go語言 屬於編譯型的寫好程序,通過編譯器把程序編程機器能執行的程序(含有機器碼),把程序給用戶即可。
  • python編程入門,零基礎學習Python基礎教程
    這裡推薦這門python編程入門基礎教程,適合零基礎的同學學習!python軟體工程師都學什麼?自學Python,看視頻學的更快、更透徹一些,給你個課程大綱!階段七:數據分析Python全棧開發與人工智慧之數據分析學習內容包括:金融量化分析。階段八:人工智慧Python全棧開發與人工智慧之人工智慧學習內容包括:機器學習、數據分析 、圖像識別、自然語言翻譯等。
  • 2020 沒能成為「年度程式語言」的Python,是要走php的老路嗎?
    年度程式語言?首先先解釋下年度程式語言,年度程式語言是對比當前這個語言對比去年同期的增長率,增長率最高的將獲得年度語言的稱號,那麼2020的程式語言是由誰獲得的?以下為TIBOE排行榜上的原文翻譯:每個人都認為Python將連續第二年成為TIOBE的年度程式語言。但這一次是老牌語言C憑藉2.4%的年增長率獲得了獎項。排名第二的是C#(+2.1%),Python(+ 1.4%)和Swift(+ 0.6%)。
  • 7個最佳的學習Python編程的開源庫
    它涵蓋了字符串和條件之類的基礎知識,然後討論了面向對象編程,以及如何處理異常和一些Python標準庫的特性等。每一個主題都有一個「notebook」連結,它會向你介紹該主題和一些示例代碼,當你完成這些內容之後,還有一個練習連結,點擊後你就可以做一些測試題。