“本文是國內Go語言大中華區首席布道師——許式偉,在QCon2015上海站上的分享。他預測Go語言10年內一定會超過C和java,並且統治這一個10年。
Go語言語法及標准庫變化
Go從1.0版本到現在(2015年)已經有三年多的時間,大的版本發布了五個,下面大家一起看看每個大版本分別都改了什么,當然這里不可能把所有的細節都提到,但我認為重要的會提出來。
首先是Go1.1,Go1.0於2012年4月發布,此后基本維持了每半年發布一個新版本的時間間隔。Go1.5比較例外,在Go1.5的拖累下,Go並沒有堅持半年發布一個版本的慣例,因為Go1.5的變化非常大。大家如果對Go有所了解,就會知道Go1.5將基礎的實現用Go語言重新寫了一遍,但之前是用C寫的。
Go1.1是Go1.0之后比較大的版本,相對於后面幾個版本而言,里面有更多的語法變更。例如,它最重要的功能是支持方法值,如有一個Foo類型,假設里面有個寫的方法,我直接定義一個p的變量,就是訪問了這個函數,等價於一個閉包、並調用p.Write(),相當於把第一個參數直接通過p綁定了。有點類似閉包,假設N個變量,少了一個就變成了N-1,第一個參數綁定一個就變成了一個新的閉包。這樣的好處是,Go里面大量的函數有上下文,p.Write方式非常適合代入上下文,而且是非常優雅的。
區別於方法表達式(*Foo).Write,結果類型為func(p*Foo,b[]byte)(int,error),方法表達式非常簡潔,而且容易理解。
另外,Go1.1的改進還包括int、uint類型長度調整。自Go1.1后,int、uint的尺寸統一是64位(即使在32位平台下)。Go1.1的編譯條件也有變化,需要在Go1.1或以上的版本編譯。
Go1.1相比后面的版本,除語法變化比較巨大外,還做了很多性能的優化。如:
更多內聯,如Append,接類型轉換;
全新實現了Map,更小的內存占用和CPU開銷;
網絡庫性能優化,減少了上下文切換;
在標准庫/工具上面,Go1.1將一些尚未穩定的庫從標准庫中移除,遷移到codewww.176yjfg.com
Go1.2語法增加了三下標切片(Three-indexslices):arry[www.176yjfg.com1.2增加了測試覆蓋率。
Go1.3,該版本幾乎沒有語法變化,更多的是實現細節的變化,尤其是GC。最早期的Go被詬病最多的就是GC,這和Go的策略有關系,Go較強調編程范式的穩定。和大家平常做項目一樣,需要研發穩定下來的是模塊之間的接,語言的編程范式相當於大家交互的接,該接如穩定不下來,對后面的迭代非常有害。所以在Go1.3的版本中,有做大量針對GC的調整,基本上做了小范圍的重寫。
Go在1.3之前有大量的C代碼,所以它的GC其實是經驗性的,如果某個整數的值恰巧是一個合法的指針,那么它會被當做一個指針來處理,這樣會導致一些內存本來應該釋放,當時為了安全不釋放,有了這樣的經驗性,大部分情況已經夠用。Go1.3調整為精確GC,這會導致以前的編程手法失效。即如果有人意圖把指針存儲到uintptr而不是unsafe.pointer,那么這塊內存無法保證不被回收;使用unsafe.pointer存儲整數也不會是一個好主意,因為這會干擾GC對真相的理解。
在Map的遍歷次序上,Go1.3也做了調整,Go1標准指出,對Map的多次遍歷不應該假設有同樣的次序,為了避免這樣的假設發生,Go1.0遍歷Map選擇起點時用了隨機數。Go1.1重新實現Map后,小Map的遍歷沒有引入隨機數,Go1.3重新引入,以消滅此類潛在Bug。
cgo在Go1.3中也有變化,類型不再允許跨包訪問。例如,如果某個函數有*C.FILE參數,那么這個函數無法在其他包中使用(會編譯失敗),如果認為此代碼是合理的,可將其調整為unsafe.pointer。
性能方面,Go1.3大大降低了defer的內存開銷;引入並行GC算法,大幅改善GC效率;競爭檢測算法(racedetector)大幅提速;優化regexp包,改善大部分簡單正則表達式的性能。在標准庫/工具上,Go1.3新增了debug/plan9obj包。
Go1.4的變化看似很多,但大部分都無關痛癢。它增加了一種非常小概率使用的forrange語法;不再自動對**T進行解引用(dereference);引入internalpackage概念;引入canonicalimportpaths(權威導入路徑)概念。實現細節上,它開始支持安卓(編譯出binary或.so);運行時(runtime)大部分用Go重寫(以前是C),使得GC更加精確,同時,運行時放棄了分段棧(segmentedstack)。
Go1.5在語法上,Map字面量化寫法做了變更;實現細節上,它把所有對C的依賴全部消除掉,不需要新的編譯器去編Go的代碼,只需要用Go的編譯器,所以1.5以后編譯Go的代碼必須用Go,這是一個很重要的變化;GC被重寫,進一步降低了GC的latency;GOMAXPROCS默認是調整為CPU數(以前是1);另外,Go1.5開始支持iOS,為此Goteam還提交了第一個Go寫的AppStore應用lvy。
Go語言演進回顧
根據Go語言的幾個版本,這里總結一下它的演進。
語法變化:幾乎沒有增加什么明顯的語法特性,變化主要圍繞:降低心智負擔、細節完善、工程化;
Go本身迭代的核心是實現優化,主要圍繞:性能、性能、性能!(重要的事情說三遍),性能的優化尤其體現在GC上,此外,還圍繞更多的平台移植及更進一步的標准化,以強化社區約定。
Go和Java不一樣的地方在於,Go保留了比較大的靈活性的因素。我個人對Go語言未來有這樣的判斷:Go介於Java和很多靈活性的語言之間。Go的語言特性,三年雖然發布了五個大版本,但其實沒有什么語言的實質性變化,我見到有人噴Go時,認為Go語言太不思進取了,也有人認為Go社區對好的想法不思進取、不願意吸收。
我認為其實不然,不止三年,哪怕是十年,Go語言的語法變化也別指望有大的改進,它基本上只會修補一些很小的地方,我覺得與其說是不思進取,不如說是它對如何寫好代碼這樣的需求理解的自信,這是其他語言遠不能企及的,也是我對Go最佩服的地方。
我為什么選Go?並不是因為Go有多好,七牛是做雲服務的,雲服務特別依賴並行支持,而Go可能是這世界上對並行支持的先行者。
最早七牛用Go的時候,Go1.0還未發布,我當時對語法變化的判斷不是特別高,這自信有點類似C,C到現在已經十幾年了,但C到現在變過嗎?幾乎沒什么改變,哪怕有C99之類的,變化都很小。Go語言的想法和C很類似,我覺得很難預期Go的語法特性變化很劇烈,但這恰恰是這個語言發展的魅力所在,因為你不用擔心你寫的代碼三十年后會過時。從某種意義上講,這是一種自信,它已經知道這個世界未來就應該這個樣子。
Go語言的研究方向
大家都很關心Go語言未來會如何發展,我覺得三到五年內Go語言的主攻方向仍然是服務端開發,這不會有太大的變化。比如內建HTTP2.0的支持(更多的支持會以獨立的開源庫的方式提供,未必直接包含在Go的發布包);另外,盡管Go已經開始支持桌面端(Mobile)的開發,但這仍然是探索性和試驗性的,如果站在10年的維度上,Go語言會在桌面端(Mobile)大放異彩,占據重要地位。
很有意思的是,全球對Go最感興趣的是中國,進一步來講其實是華人,為什么?因為對Go感興趣排第二的是香港,第三是新加坡,這些地方都是華人聚集地,所以Go語言在中國發展或者在華人圈發展非常不錯,比在美國本土還牛很多(當然這僅僅是搜索,其實我是開玩笑的)。從開源項目的角度看,Go在國外發展的其實非常好,剛才所講的語法特性,大家覺得發展好像很慢,但其實不然,因為它在1.0的時候就把后面的所有做的事情都想好了,后面所要做的就是優化。
下面關於Go,有一些公開的預測:
第一個預測,我最早在2012年新浪微博里提過,Go語言10年內一定會超過C和Java,變成排行榜第一的語言。今天大家可能會略相信,但在2012年的時候沒有多少人會相信,即使今天講出來,絕大部分人都會覺得太早,畢竟它還沒有排進前五。
第二個預測,Go語言將在兩年內制霸雲計算領域。
第三個預測,Go將統治下一個10年。(來自於Deferpanic創始人LanEyberg)。
接下來一個問題,非技術人怎么看Go?第一是國外的投資人怎么看Go,我覺得國外的投資人和中國投資人不一樣,他們挺技術范兒的,他們認為“開源的Go語言將成為最持久、最有廣泛影響力的開源系統之一”。另外,有商務開發人士認為,“這個世界上好像幾乎所有新的、有趣的項目都是用Go寫的”。
Go語言開源項目介紹
Go語言的開源項目非常多,而且絕大部分和雲計算相關,我這里大致把它分為幾類:一類和容器相關,第二類與微服務相關,第三類是數據庫類。這三類都是基礎設施,以前,大家可能認為基礎設施就是操作系統、數據庫,但今天的基礎設施是什么?數據庫和OS依然是,但雲服務IaaS、PaaS也是。
大家可以看一下數據庫,以前它們都是用C、C++寫的(絕大部分最優廣泛影響的都是用C寫的),但你能想到的數據庫並不多。今天,大家能看到的用Go寫的數據庫有多少?非常多,有鍵值對的、有時間序列的,還有cockrouchdb(名為小強,因為無論發生什么情況,它都不會死)等。
所以,我們今天看到,基礎設施的定義已經發生了變化,實現基礎設施最好的方式也發生了變化,不再是以前大家所認為的那樣,系統級的東西一定是C開發的,而今天絕大部分新興的雲基礎設施(甚至可以認為幾乎全部都是)都是Go語言開發的。
那么,Go語言到底發展的怎么樣?從Go對自己的定位來講,它一直關注在服務端開發,服務端開發和今天的主題“雲計算時代”有着非常密切的關系,Go想成為雲計算時代的核心,成為大家最廣泛使用的語言,從某種意義上來講,它已經達到了。
延展閱讀(點擊標題):
你天天低頭寫代碼,卻未必知道什么在驅動軟件開發?
在線支付事故頻發,風控系統真的靠譜?
前Facebook早期員工:我是如何肉身翻牆,又回國創業的?|大咖說回放
號外!號外!
阿里巴巴CTO王堅加入GTLC,全球技術領導力峰會講師陣容再添重磅嘉賓!想一睹王堅博士風采嗎?想在現場傾聽他的技術領袖之道嗎?就在8月GTLC全球技術領導力峰會!
點擊閱讀原文或掃描二維碼進入GTLC官網,截止6月19日前購票,可享受7折特惠票價,此外還有雙重半價優惠,更多信息,詳見GTLC官網。
本文系InfoQ原創首發,未經授權謝絕轉載。
原始網絡: http://www.176yjfg.com/archiver/tid-2713.html Go將統治下一個10年?Go語言發展現狀分析