原文鏈接? ? ? ? ??原文作者:Keval Patel
今天在Medium看到一篇“Why should you learn Go?”的文章阁苞,自己也是處在學(xué)習(xí)Golang的初級(jí)階段,覺得這篇文章對(duì)初學(xué)者有很大的益處崩溪,獲得原作者的同意后苏潜,決定把它翻譯成中文步责。譯者水平可能不高,文章如有錯(cuò)誤鹅搪,請(qǐng)指正刻帚,本人感激不盡。
“Go will be the server language of the future.”?—?Tobias Lütke, Shopify
在過去的幾年里涩嚣,有一種新的編程語言的熱度在持續(xù)地上漲:Go或者叫Golang崇众。唯一能讓程序員瘋狂的事,只有新出的編程語言了航厚,對(duì)吧顷歌?因此,四五個(gè)月之前我就開始學(xué)習(xí)Go語言幔睬,并且打算告訴你為什么你也應(yīng)該學(xué)習(xí)這門新語言眯漩。
在這篇文章中,我不是要教你如何寫”Hello World麻顶!“赦抖,網(wǎng)上有很多這樣的教程。接下來我將闡述當(dāng)前計(jì)算機(jī)硬件-軟件所處的階段以及為什么我們需要類似Go的新語言辅肾。也許我們認(rèn)為队萤,沒有出現(xiàn)問題,所以我們也不需要解決矫钓,這樣的想法對(duì)嗎要尔?
硬件限制:
摩爾定律?正在失效舍杜。
2004年英特爾推出了第一款具有3.0GHz速度的Pentium 4處理器。今天赵辕,我的Macbook Pro 2016已經(jīng)有了2.9GHz的速度既绩。在這十年間,原生的處理速度并沒有多大的進(jìn)步还惠。在下表中你可以看到這期間處理能力的對(duì)照情況饲握。
從上圖可以看出,單線程性能和處理器的頻率在近十年內(nèi)保持穩(wěn)定蚕键。如果你認(rèn)為增加更多的晶體管是解決方案救欧,那么你就錯(cuò)了。這是因?yàn)樵诟∫?guī)模的情況下一些量子特性開始出現(xiàn)(如隧道)嚎幸,并且它實(shí)際上要投入更多的晶體管(為什么?)寄猩,每美元增加晶體管的數(shù)量開始下降嫉晶。
因此,對(duì)于上述問題的解決方案田篇,
? ? · 制造商開始加入越來越多內(nèi)核處理器√娣希現(xiàn)在我們有四核和八核CPU可用。
? ? · 我們還推出了超線程技術(shù)泊柬。
? ? · 為處理器增加更多的緩存提高性能椎镣。
但是,上述的解決方案本身的局限性太大兽赁。我們不能通過為處理器添加越來越多的緩存來提高性能状答,因?yàn)榫彺嬗形锢順O限:緩存越大,速度越慢刀崖。處理器增加更多內(nèi)核也有其成本惊科。此外,內(nèi)核數(shù)量不能擴(kuò)展到無限亮钦。這些多核處理器可以同時(shí)運(yùn)行多個(gè)線程馆截,并帶來并發(fā)。我們將在后面討論蜂莉。
所以蜡娶,如果我們不能依靠硬件的改進(jìn),提高性能的唯一辦法就是更有效的軟件映穗。但可悲的是窖张,現(xiàn)代的編程語言的效率都不太高。
“現(xiàn)代處理器就像加滿硝基燃料的汽車蚁滋,它他們擅長(zhǎng)的四分之一英里荤堪。不幸的是現(xiàn)代編程語言都像蒙特卡洛合陵,他們充滿曲折〕窝簦“ —?David Ungar
Go有go協(xié)程S抵!
正如我們上面所討論的碎赢,硬件廠商正在給處理器增加更多內(nèi)核數(shù)量來提高性能低剔。所有的數(shù)據(jù)中心都在這些處理器上運(yùn)行,我們應(yīng)該期待在未來幾年核心數(shù)量能夠增加肮塞。如今的應(yīng)用更多地使用多個(gè)微服務(wù)維護(hù)的數(shù)據(jù)庫連接襟齿,消息隊(duì)列和維護(hù)緩存。因此枕赵,我們開發(fā)的軟件和編程語言應(yīng)該很支持并發(fā)猜欺,并且它們應(yīng)該支持內(nèi)核的數(shù)量的擴(kuò)展。
但是拷窜,大多數(shù)現(xiàn)代編程語言(如Java开皿,Python等)誕生于上世紀(jì)90年代的單線程環(huán)境,這些編程語言大多數(shù)支持多線程篮昧。但真正的問題是并發(fā)執(zhí)行赋荆,線程鎖,競(jìng)爭(zhēng)條件和死鎖懊昨。這些問題導(dǎo)致了很難用那些語言創(chuàng)建多線程應(yīng)用程序窄潭。
舉個(gè)例子,使用Java創(chuàng)建新的線程在內(nèi)存上并不高效酵颁。每個(gè)線程占用的內(nèi)存堆大小約為1MB嫉你,如果你開啟數(shù)千個(gè)線程,就會(huì)讓堆承受巨大的壓力躏惋,將會(huì)由于內(nèi)存不足導(dǎo)致關(guān)閉均抽。另外,如果你想兩個(gè)或多個(gè)線程之間進(jìn)行通信其掂,這是非常困難的油挥。
另一方面,Go語言是在2009年發(fā)布的款熬,此時(shí)多核心處理器已經(jīng)可用深寥。這就是為什么Go在語言層次上支持并發(fā),Go有g(shù)o協(xié)程而不是線程贤牛。他們消耗的堆內(nèi)存幾乎只有2KB惋鹅。所以,你可以隨時(shí)啟動(dòng)數(shù)百萬的go協(xié)程殉簸。
其他的優(yōu)點(diǎn):
? ? · go協(xié)程有可增長(zhǎng)的分段堆棧闰集。這意味著沽讹,他們只在需要的時(shí)候才會(huì)使用更多的內(nèi)存。
? ? · go協(xié)程比線程啟動(dòng)更快武鲁。
? ? · go協(xié)程配備了內(nèi)置的原語爽雄,可以使它們(通道)之間的通信變得安全。
? ? ·?go協(xié)程讓你避免在共享數(shù)據(jù)結(jié)構(gòu)時(shí)采取互斥鎖沐鼠。
? ? ·?此外挚瘟,夠程和OS線程不必1對(duì)1的映射。單個(gè)go協(xié)程可以在多個(gè)線程運(yùn)行饲梭。go協(xié)程可以復(fù)用成少數(shù)OS線程乘盖。
你可以在的Rob Pike的演講并發(fā)不是并行 獲得關(guān)于go協(xié)程更深的理解。
以上各點(diǎn)憔涉,讓Go可以像Java订框,C和C ++高效處理并發(fā),同時(shí)像Earlang以簡(jiǎn)潔直觀的代碼執(zhí)行并發(fā)兜叨。
Go直接在底層運(yùn)行
使用C纵揍,C ++而不是其他現(xiàn)代高級(jí)語言如Java / Python中的一個(gè)最顯著的好處是它們的性能顿乒,因?yàn)镃 / C ++編譯型的而不是解釋解釋型的议街。
處理器對(duì)二進(jìn)制友好。一般來說璧榄,當(dāng)你建立一個(gè)使用Java或其他基于JVM的語言的程序特漩,當(dāng)你編譯你的項(xiàng)目,它把人類可讀的代碼編譯成JVM或于底層的操作系統(tǒng)上運(yùn)行的其他虛擬機(jī)可以理解的字節(jié)碼骨杂。執(zhí)行期間涂身,虛擬機(jī)解釋那些字節(jié)碼并將它們轉(zhuǎn)換成可以被處理器理解的二進(jìn)制文件。
另一方面搓蚪,C / C ++不在虛擬機(jī)上執(zhí)行并且去除這一層次以提高性能蛤售。編譯器直接把人類可讀代碼編譯成二進(jìn)制文件。
然而妒潭,在這些語言中釋放和分配變量是一個(gè)巨大的痛苦悴能,盡管大多數(shù)編程語言使用垃圾收集器或引用計(jì)數(shù)算法來處理對(duì)象的分配和釋放。
Go語言兼顧了這兩個(gè)方面雳灾。Go像C / C ++等低級(jí)語言漠酿,是編譯型語言。這意味著性能幾乎接近低級(jí)語言谎亩。它還使用垃圾收集來分配和清除的對(duì)象炒嘲。因此宇姚,沒有更多的malloc()和free()語句!酷7蛲埂;肜汀!
Go代碼易于維護(hù)
讓我告訴你一件事寸痢,Go沒有其它語言一樣瘋狂的編程語法呀洲。它的語法非常整潔,干凈啼止。
Go語言的谷歌設(shè)計(jì)者在創(chuàng)造這門語言的時(shí)候已經(jīng)想到了這個(gè)事情道逗。隨著谷歌有非常龐大的代碼庫和數(shù)以千計(jì)的開發(fā)人員正在處理相同的代碼庫,代碼應(yīng)該很簡(jiǎn)單讓其他開發(fā)人員理解并且一個(gè)代碼段應(yīng)該對(duì)代碼的另一段的副作用應(yīng)當(dāng)最小献烦。這將使代碼易于維護(hù)滓窍,易于修改。
Go故意遺漏了現(xiàn)代OOP語言的許多特性巩那。
? ? ·?沒有類吏夯。所有的事情僅劃分成包。同時(shí)即横,Go用結(jié)構(gòu)體替代了類噪生。
? ? · 不支持繼承。這將使代碼易于修改东囚。像Java / Python語言跺嗽,如果ABC類繼承的XYZ類并且你改動(dòng)了XYZ類,那么可能在繼承了XYZ的其他類中產(chǎn)生一些副作用页藻。通過刪除繼承桨嫁,我們可以很容易地理解代碼同時(shí)(因?yàn)楫?dāng)看一段代碼時(shí),不用當(dāng)成超類來看待)份帐。
? ? ·?沒有構(gòu)造函數(shù)璃吧。
? ? ·?沒有注解。
? ? ·?沒有泛型废境。
? ? ·?沒有exceptions(應(yīng)該指的是像Java的錯(cuò)誤類型)畜挨。
上述變化使Go與其他語言非常不同,也使使用Go語言編程不同于其他編程語言噩凹。你可能不喜歡上面的幾點(diǎn)巴元。但是,如果沒有以上的幾點(diǎn)特性栓始,你不可能編寫你的程序务冕。你只需要做的是多寫2-3行。好處是幻赚,它會(huì)使你的代碼更加清晰禀忆。
上述圖顯示的是Go幾乎與C / C ++一樣高效臊旭,同時(shí)代碼語法像Ruby,Python和其他語言一樣簡(jiǎn)單箩退,這是對(duì)人類和處理器的雙贏离熏!
不同于其他的類似Swift的新語言,Go語法是非常穩(wěn)定的戴涝。它的語法從最初的2012年公開發(fā)行1.0之后一直未變滋戳,這使它支持向后兼容。
Go是Google支持的
? ? · 我知道這不是一個(gè)直接的技術(shù)優(yōu)勢(shì)啥刻。但是奸鸯,很重要的一點(diǎn)是,Go是谷歌設(shè)計(jì)并支持的可帽。谷歌擁有世界上最大的云基礎(chǔ)設(shè)施之一娄涩,并且它的規(guī)模不斷擴(kuò)大。Go是由谷歌設(shè)計(jì)來解決他們的支持可擴(kuò)展性和有效性問題映跟。在創(chuàng)建自己的服務(wù)器蓄拣,你將面臨同樣的問題。
? ? · 更多的大公司努隙,比如Adobe球恤,BBC,IBM荸镊,Intel甚至是Medium都在使用Go咽斧。(來源:https://github.com/golang/go/wiki/GoUsers)
結(jié)論:
? · 即使Go不用于其他面向?qū)ο蟮恼Z言,它仍然不可忽略贷洲。Go提供了像C / C ++一樣的性能收厨,像Java一樣的超高效的并發(fā)處理晋柱,像Python / Perl一樣有趣的代碼优构。
? ?·?如果你沒有任何計(jì)劃去學(xué)習(xí)Go,我依舊認(rèn)為硬件限制給了我們壓力雁竞,從而軟件開發(fā)人員可以編寫出超級(jí)高效的代碼钦椭。開發(fā)人員需要了解硬件,并對(duì)他們程序進(jìn)行相應(yīng)的優(yōu)化碑诉。優(yōu)化后的軟件可以運(yùn)行在更便宜和更慢的硬件上(如運(yùn)行IOT設(shè)備)和最終用戶的體驗(yàn)將得到更大的影響彪腔。
原文鏈接:https://www.codementor.io/kevalpatel2106/why-should-you-learn-go-csiq30zfg
如若有錯(cuò)誤之處,請(qǐng)指正~