一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Go/Python/Erlang編程語言對比分析及示例代碼

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

2021-02-04 00:38Write the code, change the wor Python

這篇文章主要介紹了Go/Python/Erlang編程語言對比分析及示例代碼,本文重點是給大家介紹go語言,從語言對比分析的角度切入介紹,需要的朋友可以參考下

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

go的很多語言特性借鑒與它的三個祖先:c,pascal和csp。go的語法、數據類型、控制流等繼承于c,go的包、面對對象等思想來源于pascal分支,而go最大的語言特色,基于管道通信的協程并發模型,則借鑒于csp分支。

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

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、python、erlang三種語言語法的詳細對比如下(點擊見完整大圖第一部分,第二部分,第三部分)。這里(鏈接)有一個詳細的go 與 c 的語法對比,這也是我沒有做go vs. c對比的一個原因。

正如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中使用方式,用面對對象編程范式來類比的話,可以類比于subtype polymorphism(子類型多態)和ad hoc polymorphism(非參數多態)。

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

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

go/python/erlang語言詞法對比

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

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

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

除了關鍵字,此外,go還有大約30多個預定義的名字,比如int和true等,主要對應內建的常量、類型和函數。

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

tdd go編程示例

本小節以tdd方式4次重構開發一個斐波那契算法的方式,來簡單展示go的特性、語法和使用方式,如go的單元測試技術,并發編程、匿名函數、閉包等。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main
import (
  "testing"
)
func testfib(t *testing.t) {
  var testdatas = []struct {
    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)
    }
  }
}

基于遞歸的實現方案:

?
1
2
3
4
5
6
func fib1(n int) int64 {
  if n == 0 || n == 1 {
    return int64(n)
  }
  return fib1(n-1) + fib1(n-2)
}

測試結果:

?
1
2
3
4
5
6
crbsp@fib$ time go test
pass
ok _/home/crbsp/alex/go/fib 9.705s
real 0m10.045s
user 0m9.968s
sys 0m0.068s

基于goroutine實現的并發方案:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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
}

測試結果:

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

基于迭代的實現方案:

?
1
2
3
4
5
6
7
8
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
}

測試結果:

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

基于閉包的實現方案:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
}

測試結果:

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

總結

以上所述是小編給大家介紹的go/python/erlang編程語言對比分析及示例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:https://www.cnblogs.com/wahaha02/p/8876445.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩国产成人精品视频人 | 日韩一级在线观看 | bestialitysex杂交| 白丝h视频 | 国产精品对白刺激久久久 | 欧美成人免费观看久久 | 亚洲视频久久 | 三级黄片毛片 | 99久久免费精品视频 | 欧洲老妇人70 | 岛国不卡| 5g影院天天影院天天爽影院网站 | 精品视频在线免费播放 | 果冻传媒和91制片厂网站软件 | 欧美一区二区三区免费高 | 久久视频这里只精品99热在线观看 | 色人阁图片 | 日韩专区在线观看 | 午夜精品久视频在线观看 | 免费一级日本c片完整版 | 午夜视频一区二区三区 | 日韩视频在线观看中字 | 亚洲国产99在线精品一区69堂 | 教室里的激情电影 | 久久精品人人做人人爽97 | 91亚洲视频在线观看 | 99精品免费在线观看 | 国产视频三区 | 欧美在线高清 | 国产综合亚洲欧美日韩一区二区 | 娇妻被又大又粗又长又硬好爽 | 黄蓉h系列| 红杏网 | 欧美vpswindowssex| 欧美春宫 | 久久亚洲电影www电影网 | 久久青草免费91线频观看站街 | 日本在线色 | 日本在线www | 韩国情事伦理片观看地址 | 亚洲羞羞裸色私人影院 |