雲端運算時代,我與Go語言難解的緣分

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。


來源:http://www.ituring.com.cn/article/14092


文/許式偉

我在新浪微博、《Go語言編程》一書中下了一個論斷:Go語言將超過C、Java,成為未來十年最流行的語言。

              

我曾在2007年第2屆ECUG大會上提到了我對未來軟體產業趨勢的判斷:儲存與計算將向服務端轉移;PC單機轉換為強悍的伺服器+多元化的終端。這個趨勢判斷對我的職業生涯其實影響非常重大。

從業務角度講,正因為這個判斷,促使我選擇成立金山實驗室研究雲端儲存技術;也促使我關注Erlang這門面向分布式編程的領域性語言;促使我舉辦了一屆屆的ECUG大會;促使我加入盛大創新院,發起祥雲計劃(盛大雲前 身),做盛大網盤;促使我們成立了七牛,有了七牛雲端儲存。

從技術角度來講,它促使我放棄了近10年的案頭開發經驗,轉向服務端開發。正如我在《我為什麼選擇了Erlang》中建議的那樣:

要麼不寫程式,要麼就寫伺服器端程式;當然,你也可以去撰寫移動終端裝置上的代碼,在PC平台上做開發的空間很小。

在金山實驗室時,我選擇了Java語言,並積極關注Erlang語言,對其進行小範圍試用,以及大規模使用的可行性評估。我的結論是:

Erlang風格的並行思想真的很棒;Erlang語言優勢與劣勢同樣明顯,這門語言不適合規模化推廣使用。

Erlang的困難之處在於它是FP語言。我們缺乏深入人心的FP編程理論。我們並不瞭解FP“資料結構”學。這是Erlang語言無法逾越的門檻,決定了它只能是小眾化語言。

進入盛大創新院後,我選擇了C++,原因是我個人更喜歡C++,而對Java的設計哲學非常不感興趣。出於對Erlang風格的並行思想的喜愛,我建立了一個名為CERL的項目,取義Erlang Model for C++,表明我希望能夠把Erlang那一套並行編程模型搬到 C++中來,降低分布式編程的負擔。

接觸Go語言後,我發現CERL 2.0的並發編程模型,其實就是一個雛形版的Go語言並行存取模型,兩者從理念上來說完全一致。

七牛公司成立於2011年5月底,我們選擇了Go語言作為七牛雲端儲存體服務端的主體語言。當時Go語言甚至文法都還沒完全穩定下來。為什麼我可以如此堅定地相信,選擇Go語言不會有錯,並且相信Go語言會成為未來十年最流行的語言?除了Go語言的並發編程模型深得我心外,Go語言的各種文法特性顯得那麼深思熟慮、卓絕不凡,其對軟體系統架構的領悟,處處帶給我驚喜。

Go語言給我的第一個意外驚喜,是介面。當然,我意外的不是Go的非侵入式介面。在介面(或契約)的表達上,我一直認為Java和C#這些主流的靜態類型語言都走錯了方向。C++的模板儘管機制複雜,但走在了正確的方向上。但Go語言的介面遠不是非侵入式介面那麼簡單,它是Go語言類型系統的綱。除了支援反射等進階特性外,Go語言還支援介面查詢。

Go語言給我的第二個意外驚喜,是極度簡化但完備的“物件導向編程”方法。Go語言廢棄大量的OOP特性,如繼承、構造/解構函式、虛函數、函數重載、預設參數等;簡化的符號存取權限控制、將隱藏的this指標改為顯式定義的receiver對象。讓我看到了OOP編程核心價值原來如此簡單—只是多數人都無法看透。

Go語言帶給我的第三個驚喜,是它的函數多反回值和錯誤處理規範。函數多傳回值比較容易想到,只有這樣函數的輸入輸出才能清晰呈現,語義表達上才會足夠清晰。不過讓我沒想到的是,Go引入了內建的error類型以及defer關鍵字來編寫異常安全的程式碼,讓人拍案叫絕。

Go語言帶給我的第四個驚喜,是它功能的內聚。一個最典型的案例是Go語言的組合功能。對於多數語言來說,組合只是形成複合類型的基本手段。但Go語言引入了匿名組合的概念,讓其他語言原本需要引入繼承甚至虛擬繼承這樣晦澀概念來完成的事情,統一到了組合這樣的一個基礎上。

Go語言帶給我的第五個驚喜,是消除了堆與棧的邊界。在Go語言之前,程式員是清楚地知道哪些變數在棧上,哪些變數在堆上。堆與棧是基於現代電腦系統的基礎工作模型上形成的概念,Go語言屏蔽了變數定義在堆還是棧上這樣的物理結構,相當於封裝了一個新的電腦工作模型。這一點看似與Go語言顯式表達的設計哲學不太一致,但我認為這是一項了不起的工作,且與Go語言的顯式表達並不矛盾。Go語言強調的是對開發人員的程式邏輯(語義)的顯式表達,而非對電腦硬體結構的顯示表達。對電腦硬體結構的高度抽象,將更有助於Go語言適應電腦硬體發展的變化。

Go語言帶給我的第六個驚喜,是Go語言對C語言的支援。可以這麼說,Go語言是除了Objective-C、C++這兩門以相容C為基礎目標的語言外的所有語言中,對C語言支援最友善的一個。什麼語言可以直接嵌入C代碼?沒有,除了Go。什麼語言可以無縫調用C函數?沒有,除了Go。對C語言的完美支援,是Go快速崛起的關鍵支撐。還有比C語言更讓人覬覦的社區財富嗎?那是一個取之不盡的金礦。

在《Go語言編程》一書的前言中,我談到Go語言的基礎哲學來源於C語言,而不是像Java、C#那樣,學的是C++。C語言的成功在於它足夠簡單,所以Go語言也要非常簡單。Go語言的定位就是成為互連網時代的C語言。本質上來說,Go語言的特性都圍繞著以下設計哲學:

大道至簡,顯式表達。任何封裝都是有漏洞的。最佳的表達方式就是最直白的表達方式,不試圖去做任何封裝。最少特性原則。如果一個功能不對解決任何問題有顯著價值,那麼就不提供。

儘管是40年來出現的語言非常之多,但我認為,談得上突破了C語言思想,將編程理念提高到一個新高度的,僅有Go語言而已。

Go語言是一門變革性的語言,要革的是C的命(順便革Java的命)。Go語言很簡單,但具備極強的表現力。從目前的狀態來說,Go語言主要關注伺服器領域的開發,但這不是Go語言的完整使命。

我們說Go語言適合服務端開發,僅是因為它的標準庫支援方面,目前是向服務端開發傾斜:

網路程式庫(包括 Socket、HTTP、RPC 等);編碼庫(包括 JSON、XML、GOB等);加密庫(各種密碼編譯演算法、摘要演算法);Web(包括 Template、HTML支援)。

而作為案頭開發的常規組件GDI和UI系統與事件處理,基本沒有涉及。

總之,我認為,Go語言將引領未來10年IT產業的發展。在最初5年內,Go語言會在伺服器端編程上大放異彩,而案頭端的開發則仍然處於探索和完善期,預計在後5年才趨於成熟,成為各種手持功能上的主流開發語言之一。

作者許式偉,七牛雲端儲存CEO,曾任盛大創新院資深研究員、金山軟體技術總監、WPS Office 2005首席架構師。開源愛好者,發布過包括WINX、TPL等十餘個C++開源項目,擁有超過15年的C/C++開發經驗。在接觸Go語言後即可被其大道至簡、少即是多的設計哲學所傾倒。七牛雲端儲存是國內第一個吃螃蟹的團隊,核心服務完全採用Go語言實現。

本文首發《程式員雜誌》經其允許轉載。 本文選自《程式員》雜誌2012年10期


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.