為什么你要學(xué)習(xí)Go語言?「譯」

原文鏈接? ? ? ? ??原文作者: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兼顧了這兩方面的特點(diǎn)穿扳。容易編寫并發(fā),高效管理并發(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)制文件。


基于VM語言的執(zhí)行步驟

另一方面搓蚪,C / C ++不在虛擬機(jī)上執(zhí)行并且去除這一層次以提高性能蛤售。編譯器直接把人類可讀代碼編譯成二進(jìn)制文件。

基于二進(jìn)制文件的執(zhí)行步驟

然而妒潭,在這些語言中釋放和分配變量是一個(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ì)使你的代碼更加清晰禀忆。


代碼的可讀性VS效率

上述圖顯示的是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)指正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末进栽,一起剝皮案震驚了整個(gè)濱河市德挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌快毛,老刑警劉巖格嗅,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番挺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屯掖,警方通過查閱死者的電腦和手機(jī)玄柏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴铜,“玉大人粪摘,你說我怎么就攤上這事∩馨樱” “怎么了徘意?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)轩褐。 經(jīng)常有香客問我映砖,道長(zhǎng),這世上最難降的妖魔是什么灾挨? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任邑退,我火速辦了婚禮,結(jié)果婚禮上劳澄,老公的妹妹穿的比我還像新娘地技。我一直安慰自己,他們只是感情好秒拔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布莫矗。 她就那樣靜靜地躺著,像睡著了一般砂缩。 火紅的嫁衣襯著肌膚如雪作谚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天庵芭,我揣著相機(jī)與錄音妹懒,去河邊找鬼。 笑死双吆,一個(gè)胖子當(dāng)著我的面吹牛眨唬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播好乐,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼匾竿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蔚万?” 一聲冷哼從身側(cè)響起岭妖,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昵慌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苔巨,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年废离,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄泽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜻韭,死狀恐怖悼尾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肖方,我是刑警寧澤闺魏,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站俯画,受9級(jí)特大地震影響析桥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艰垂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一泡仗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猜憎,春花似錦娩怎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柬讨,卻和暖如春崩瓤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踩官。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工却桶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卖鲤。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓肾扰,卻偏偏與公主長(zhǎng)得像畴嘶,于是被迫代替她去往敵國和親蛋逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容