最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go/Python/Erlang編程語言對比分析及示例代碼

 更新時間:2018年04月23日 09:16:34   作者:Write the code, change the world.  
這篇文章主要介紹了Go/Python/Erlang編程語言對比分析及示例代碼,本文重點是給大家介紹go語言,從語言對比分析的角度切入介紹,需要的朋友可以參考下

本文主要是介紹Go,從語言對比分析的角度切入。之所以選擇與Python、Erlang對比,是因為做為高級語言,它們語言特性上有較大的相似性,不過最主要的原因是這幾個我比較熟悉。

Go的很多語言特性借鑒與它的三個祖先:C,Pascal和CSP。Go的語法、數(shù)據(jù)類型、控制流等繼承于C,Go的包、面對對象等思想來源于Pascal分支,而Go最大的語言特色,基于管道通信的協(xié)程并發(fā)模型,則借鑒于CSP分支。

Go/Python/Erlang語言特性對比

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

圖中我們可以看出,相比于Python的40個特性,Go只有31個,可以說Go在語言設(shè)計上是相當(dāng)克制的。比如,它沒有隱式的數(shù)值轉(zhuǎn)換,沒有構(gòu)造函數(shù)和析構(gòu)函數(shù),沒有運算符重載,沒有默認參數(shù),也沒有繼承,沒有泛型,沒有異常,沒有宏,沒有函數(shù)修飾,更沒有線程局部存儲。

但是Go的特點也很鮮明,比如,它擁有協(xié)程、自動垃圾回收、包管理系統(tǒng)、一等公民的函數(shù)、??臻g管理等。

Go作為靜態(tài)類型語言,保證了Go在運行效率、內(nèi)存用量、類型安全都要強于Python和Erlang。

Go的數(shù)據(jù)類型也更加豐富,除了支持表、字典等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),還支持指針和接口類型,這是Python和Erlang所沒有的。特別是接口類型特別強大,它提供了管理類型系統(tǒng)的手段。而指針類型提供了管理內(nèi)存的手段,這讓Go進入底層軟件開發(fā)提供了強有力的支持。

Go在面對對象的特性支持上做了很多反思和取舍,它沒有類、虛函數(shù)、繼承、泛型等特性。Go語言中面向?qū)ο缶幊痰暮诵氖墙M合和方法(function)。組合很類似于C語言的struct結(jié)構(gòu)體的組合方式,方法類似于Java的接口(Interface),但是使用方法上與對象更加解耦,減少了對對象內(nèi)部的侵入。Erlang則不支持面對對象編程范式,相比而言,Python對面對對象范式的支持最為全面。

在函數(shù)式編程的特性支持上,Erlang作為函數(shù)式語言,支持最為全面。但是基本的函數(shù)式語言特性,如lambda、高階函數(shù)、curry等,三種語言都支持。

控制流的特性支持上,三種語言都差不多。Erlang支持尾遞歸優(yōu)化,這給它在函數(shù)式編程上帶來便利。而Go在通過動態(tài)擴展協(xié)程棧的方式來支持深度遞歸調(diào)用。Python則在深度遞歸調(diào)用上經(jīng)常被爆棧。

Go和Erlang的并發(fā)模型都來源于CSP,但是Erlang是基于actor和消息傳遞(mailbox)的并發(fā)實現(xiàn),Go是基于goroutine和管道(channel)的并發(fā)實現(xiàn)。不管Erlang的actor還是Go的goroutine,都滿足協(xié)程的特點:由編程語言實現(xiàn)和調(diào)度,切換在用戶態(tài)完成,創(chuàng)建銷毀開銷很小。至于Python,其多線程的切換和調(diào)度是基于操作系統(tǒng)實現(xiàn),而且因為GIL的大坑級存在,無法真正做到并行。

而且從筆者的并發(fā)編程體驗上看,Erlang的函數(shù)式編程語法風(fēng)格和其OTP behavior框架提供的晦澀的回調(diào)(callback)使用方法,對大部分的程序員,如C/C++和Java出身的程序員來說,有一定的入門門檻和挑戰(zhàn)。而被稱為“互聯(lián)網(wǎng)時代的C”的Go,其類C的語法和控制流,以及面對對象的編程范式,編程體驗則好很多。

Go/Python/Erlang語言語法對比

所有的語言特性都需要有形式化的表示方式,Go、Python、Erlang三種語言語法的詳細對比如下(點擊見完整大圖第一部分,第二部分,第三部分)。這里(鏈接)有一個詳細的Go 與 C 的語法對比,這也是我沒有做Go vs. C對比的一個原因。

正如Go語言的設(shè)計者之一Rob Pike所說,“軟件的復(fù)雜性是乘法級相關(guān)的”。這充分體現(xiàn)在語言關(guān)鍵詞(keyword)數(shù)量的控制上,Go的關(guān)鍵詞是最少的,只有25個,而Erlang是27個,Python是31個。從根本上保證了Go語言的簡單易學(xué)。

Go語言將數(shù)據(jù)類型分為四類:基礎(chǔ)類型、復(fù)合類型、引用類型和接口類型。基礎(chǔ)類型包括:整型、浮點型、復(fù)數(shù)、字符串和布爾型。復(fù)合數(shù)據(jù)類型有數(shù)組和結(jié)構(gòu)體。引用類型包括指針、切片、字典、函數(shù)、通道。其他數(shù)據(jù)類型,如原子(atom)、比特(binary)、元組(tuple)、集合(set)、記錄(record),Go則沒有支持。

Go對C語言的很多語法特性做了改良,正如Rob Pike在《Less is Exponentially More》中提到,Go的“起點: C語言,解決一些明顯的瑕疵、刪除雜質(zhì)、增加一些缺少的特性?!保热?,switch/case的case子程序段默認break跳出,case語句支持數(shù)值范圍、條件判斷語句;所有類型默認初始化為0,沒有未初始化變量;把類型放在變量后面的聲明語法(鏈接),使復(fù)雜聲明更加清晰易懂;沒有頭文件,文件的編譯以包組織,改善封裝能力;用空接口(interface {})代替void *,提高類型系統(tǒng)能力等等。

Go對函數(shù),方法,接口做了清晰的區(qū)分。與Erlang類似,Go的函數(shù)作為第一公民。函數(shù)可以讓我們將一個語句序列打包為一個單元,然后可以從程序中其它地方多次調(diào)用。函數(shù)和方法的區(qū)別是指有沒有接收器,而不像其他語言那樣是指有沒有返回值。接口類型具體描述了一系列方法的集合,而空接口interfac{}表示可以接收任意類型。接口的這2中使用方式,用面對對象編程范式來類比的話,可以類比于subtype polymorphism(子類型多態(tài))和ad hoc polymorphism(非參數(shù)多態(tài))。

從圖中示例可以看出,Go的goroutine就是一個函數(shù),以及在堆上為其分配的一個堆棧。所以其系統(tǒng)開銷很小,可以輕松的創(chuàng)建上萬個goroutine,并且它們并不是被操作系統(tǒng)所調(diào)度執(zhí)行。goroutine只能使用channel來發(fā)送給指定的goroutine請求來查詢更新變量。這也就是Go的口頭禪“不要使用共享數(shù)據(jù)來通信,使用通信來共享數(shù)據(jù)”。channel支持容量限制和range迭代器。

Go/Python/Erlang語言詞法對比

Go、Python、Erlang三種語言詞法符號的詳細對比如下(點擊見完整大圖)。Go的詞法符號是3個語言中最多的,有41個,而且符號復(fù)用的情況也較多。相對來說,Python最少,只有31個。

Go語言在詞法和代碼格式上采取了很強硬的態(tài)度。Go語言只有一種控制可見性的手段:大寫首字母的標(biāo)識符會從定義它們的包中被導(dǎo)出,小寫字母的則不會。這種限制包內(nèi)成員的方式同樣適用于struct或者一個類型的方法。

在文件命名上,Go也有一定的規(guī)范要求,如以_test.go為后綴名的源文件是測試文件,它們是go test測試的一部分;測試文件中以Test為函數(shù)名前綴的函數(shù)是測試函數(shù),用于測試程序的一些邏輯行為是否正確;以Benchmark為函數(shù)名前綴的函數(shù)是基準(zhǔn)測試函數(shù),它們用于衡量一些函數(shù)的性能。

除了關(guān)鍵字,此外,Go還有大約30多個預(yù)定義的名字,比如int和true等,主要對應(yīng)內(nèi)建的常量、類型和函數(shù)。

TDD Go編程示例

本小節(jié)以TDD方式4次重構(gòu)開發(fā)一個斐波那契算法的方式,來簡單展示Go的特性、語法和使用方式,如Go的單元測試技術(shù),并發(fā)編程、匿名函數(shù)、閉包等。

首先,看一下TDD最終形成的單元測試文件:

package main
import (
  "testing"
)
func TestFib(t *testing.T) {
  var testdatas = []struct {
    n  int
    want int64
  }{
    {0, 0},
    {1, 1},
    {2, 1},
    {3, 2},
    {4, 3},
    {16, 987},
    {32, 2178309},
    {45, 1134903170},
  }
  for _, test := range testdatas {
    n := test.n
    want := test.want
    got := fib(n)
    if got != want {
      t.Errorf("fib(%d)=%d, want %d\n", n, got, want)
    }
  }
}

基于遞歸的實現(xiàn)方案:

func fib1(n int) int64 {
  if n == 0 || n == 1 {
    return int64(n)
  }
  return fib1(n-1) + fib1(n-2)
}

測試結(jié)果:

crbsp@fib$ time go test
PASS
ok _/home/crbsp/alex/go/fib 9.705s
real 0m10.045s
user 0m9.968s
sys 0m0.068s

基于goroutine實現(xiàn)的并發(fā)方案:

func fib2(n int) int64 {
  var got int64
  var channel = make(chan int64, 2)
  if n == 0 || n == 1 {
    return int64(n)
  }
  runtime.GOMAXPROCS(2)
  go func() { channel <- fib1(n - 2) }()
  go func() { channel <- fib1(n - 1) }()
  got = <-channel
  got += <-channel
  return got
}

測試結(jié)果:

crbsp@fib$ time go test
PASS
ok _/home/crbsp/alex/go/fib 6.118s
real 0m6.674s
user 0m10.268s
sys 0m0.148s

基于迭代的實現(xiàn)方案:

func fib3(n int) int64 {
  var a, b int64
  a, b = 0, 1
  for i := 0; i < n; i++ {
    a, b = b, a+b
  }
  return a
}

測試結(jié)果:

crbsp@fib$ time go test
PASS
ok _/home/crbsp/alex/go/fib 0.002s
real 0m0.547s
user 0m0.328s
sys 0m0.172s

基于閉包的實現(xiàn)方案:

func fibWrapper4() func() int64 {
  var a, b int64
  a, b = 0, 1
  return func() int64 {
    a, b = b, a+b
    return a
  }
}
func fib4(n int) int64 {
  var got int64
  got = 0
  f := fibWrapper4()
  for i := 0; i < n; i++ {
    got = f()
  }
  return got
}

測試結(jié)果:

crbsp@fib$ time go test
PAok _/home/crbsp/alex/go/fib 0.002s
real 0m0.411s
user 0m0.260s
sys 0m0.140s

總結(jié)

以上所述是小編給大家介紹的Go/Python/Erlang編程語言對比分析及示例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python實現(xiàn)?MK檢驗示例代碼

    Python實現(xiàn)?MK檢驗示例代碼

    這篇文章主要介紹了Python實現(xiàn)?MK檢驗,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Python字符串處理的8招秘籍(小結(jié))

    Python字符串處理的8招秘籍(小結(jié))

    這篇文章主要介紹了Python字符串處理的8招秘籍,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Django項目單字段區(qū)間查詢的實現(xiàn)

    Django項目單字段區(qū)間查詢的實現(xiàn)

    在Django項目中會碰到一些需求就是查詢某個表中的一些字段從某日到某日的數(shù)據(jù),你可以像在SQL中那樣使用SELECT語句來查找指定字段,本文就來介紹兩種方法,感興趣的可以了解一下
    2023-10-10
  • Django數(shù)據(jù)庫表反向生成實例解析

    Django數(shù)據(jù)庫表反向生成實例解析

    這篇文章主要介紹了Django數(shù)據(jù)庫表反向生成實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Python pyecharts Line折線圖的具體實現(xiàn)

    Python pyecharts Line折線圖的具體實現(xiàn)

    折線圖在很多圖標(biāo)中都有使用,本文主要介紹了Python pyecharts Line折線圖的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • python 爬取影視網(wǎng)站下載鏈接

    python 爬取影視網(wǎng)站下載鏈接

    一個簡單的爬取影視網(wǎng)站下載鏈接的爬蟲,非常適合新手學(xué)習(xí),感興趣的朋友可以參考下
    2021-05-05
  • Python神器之Pampy模式匹配庫的用法詳解

    Python神器之Pampy模式匹配庫的用法詳解

    Pampy是Python的一個模式匹配類庫,一個只有150行的類庫,該庫優(yōu)雅、高效值得廣大Python的碼農(nóng)加入自己基本開發(fā)棧中。本文就來講講Pampy的用法,需要的可以參考一下
    2022-07-07
  • 詳解python 發(fā)送郵件實例代碼

    詳解python 發(fā)送郵件實例代碼

    本篇文章主要介紹了python 發(fā)送郵件實例代碼,詳細的介紹了各種方式發(fā)送郵件,包括文件形式的郵件、HTML形式的郵件、帶圖片的HTML郵件等,有興趣的可以了解一下。
    2016-12-12
  • Python使用pyyaml模塊處理yaml數(shù)據(jù)

    Python使用pyyaml模塊處理yaml數(shù)據(jù)

    這篇文章主要介紹了Python使用pyyaml模塊處理yaml數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • iPython pylab模式啟動方式

    iPython pylab模式啟動方式

    這篇文章主要介紹了iPython pylab模式啟動方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

迁西县| 达拉特旗| 阿城市| 绵竹市| 仁化县| 宜兰县| 屯留县| 开封县| 岳西县| 富顺县| 醴陵市| 水城县| 房山区| 乾安县| 永胜县| 瑞金市| 沈阳市| 丹巴县| 岐山县| 乌兰浩特市| 敦煌市| 岢岚县| 渭源县| 密云县| 子洲县| 临桂县| 阜康市| 车致| 淮北市| 卫辉市| 古丈县| 咸阳市| 龙陵县| 建水县| 扶沟县| 宁德市| 宁乡县| 龙州县| 高青县| 东山县| 八宿县|