標籤:

Go 語言的面世是為了解決什麼問題,新的語言出現的動力是什麼?

很好理解微軟大力推廣C#時因為可以微軟的IDE和服務都可以給微軟帶來大量的現金;Java的出現把程序員從內存管理上釋放出來;Erlang解決並發和多核。Go有真正去解決哪些當前語言無法解決的問題?

開發和維護一個新的語言,資金流從哪裡來?收益在哪裡?


0. 語義化更精確(功能更為正交)的關鍵字,簡短而清晰,用於對特定程序邏輯的封裝與語法糖化,減少工作量;
1. 內建對多核與並行計算的支持(與Erlang類似),以管道形式描述並行邏輯,將串列、並行邏輯很自然地揉合到一起,強化可讀性和理解效率;
2. 與C相近的語法習慣與性能,通過GC機制去除惱人的指針管理,通過意義明確語法去除低級Bug;
3. 兼容Java那種量級的企業應用或工業應用的開發能力與開發效率。


go 是一個相對較新的語言,編程語言的發展的一個趨勢就是把一些發現被經常使用的功能或者操作從語言級別進行支持,從而使用這些功能的時候非常的方便。同時,對於一些複雜的情況,語言級別的支持還可以更容易保證一些細節的正確性。

以下是一些我覺得比較特別的設計:

  1. 並發編程先進的支持。既然叫 go 語言,go routine 是核心的亮點肯定不奇怪。用go來寫並發的邏輯,用語言原生支持的 go routine、channel 和原生 select 語句,加上利用閉包處理上下文,使得之前並發處理的一些需要比較高的技巧和瑣碎的事情消失了(共享資源、數據序列化、數據完整性、鎖、信號燈、通知機制、sleep等等等等)所以,很容易正確的寫出並發程序。
  2. defer 是個很好的想法,try ... finally 的升級版,更加靈活,可以更容易的讓資源的分配與釋放代碼放在一起。
  3. 其他保留了一些現代語言的特點:GC,map的原生支持,for/if/switch 等語法的優化,都很不錯

編程語言作為工具和其他所有工具的目的是一樣的,就是為了提高生產力。Go語言也不例外,Go語言也有GC、也支持Erlang式的輕量級並發,Go語言最有價值的地方是對現有OOP的改進,現在無論什麼語言只要支持OOP就一定會有一個龐大的繼承樹,但是無論這個樹設計的多龐大多精巧它仍然是一個靜態的結構,一旦和實際問題不匹配就要寫一堆Adapter。而Go語言採用完全不用的方法,類之間不存在靜態的繼承或者實現關係,這種關係直到使用它的時候才確定,比如java中FileInputStream實現了InputStream介面,這個關係在定義FileInputStream的時候就要確定,而Go語言中定義FileInputStream時不需要指定它要實現的介面,如果這個類裡面實現的方法剛好和滿足InputStream那你就可以認為實現了InputStream介面。這種實現方式意味著Go語言不再有傳統的OOP存在的各種煩惱,同時又提供了相同的表達能力,而且更優雅。

圖靈等價的編程語言之間不存在一個語言能解決而另外一個語言不能解決的問題,只能說一個語言比另外一個語言解決某種問題更優雅,Go語言因對OOP做的創新,在對象建模上更容易,類似Erlang的並發某行讓開發高並發網路應用時可以大幅降低邏輯複雜性。

提高了生產力就是收益。


首先是跨平台的問題,go語言直接從語言層面上,消除了平台差異,同一份代碼,在不同平台不需要做修改,直接編譯即可使用。聽上去和Java很像,但go最終構建出平台的二進位代碼,效率更高。如果使用c/c++語言,你需要一個跨平台的網路庫,一個跨平台的i/o庫(epoll/iocp),壓縮,加密,更是需要外界庫的支持。

編譯速度,go語言承諾編譯大型項目,也能在短時間內完成。我們公司做一個中型c++項目,用30+核心編譯鏈接一次,需要3-5分鐘。一天花在這些事情上的時間太多。

雲服務,結合上面兩點來設想一下。我在國內寫了一個很好用的網路應用,上傳到國內的一個伺服器上,這時,遠在大洋彼岸的一個巴西朋友想用一下我的這個網路應用,怎麼辦?他需要通過網路,經過重重艱險,把請求發到國內的伺服器,然後回復再原路返回,延遲巨大而且缺乏穩定性。一種解決方案是,乾脆,我就把go原代碼直接上傳,巴西的朋友想用,這個好辦,通過網路,將源代碼下載到巴西那裡的伺服器節點,編譯鏈接生成應用,相當於直接在他國內使用,網路環境好了很多。

但是,我在國內的伺服器用的是windows server2008 64bit,巴西那邊用的是freebsd 32bit,沒關係go跨平台。

但是,我就是要用這個軟體算幾個矩陣乘法的最優解1分鐘之內就應該解決,你該不會要讓我等2-3分鐘的編譯時間吧,不會的,下載加編譯,一共5秒,你還沒刷新,我就編好了。

那麼,這個全球的,雲伺服器誰提供比較好?可以是Google。


好的,go語言,簡潔,富含表達性,這些特點我就不多說了。還有一個特點是嚴格。

什麼是嚴格?一種嚴格叫做「代碼規範」,這是一種花了大力氣定出來而被完全無視又沒有人去管的東西。我曾用astyle來規範自己的c++代碼,每次保存就調用astyle來格式化代碼,可是有用嗎?就你一個人用,其他人不用,有意義嗎?

go從根本上解決了問題,你不按規矩來,就編譯不過,我有官方提供gofmt你用不用?

多人構建大型軟體項目時,代碼看上去就像是一個人寫的,沒錯,這是真正的代碼規範,而不是一份虛無的電子文檔。


沒有哪個語言能夠解決其它語言無法解決的問題,只要它是可圖靈的。
Go沒有多少新東西,即使是語法也都是從其它語言學來的。但它讓你更好的並發更好的利用多核資源,更方便的在線程/協程之間通信,更好的管理內存。


新的語言出現的動力:
0. 腦殘粉: C和面向對象狂熱粉絲, 把面向對象嫁接到C裡面發明C++。
1. 腦殘黑: 某C++語言腦殘黑,發明一種新的語言JAVA與之競爭。
2. 錢錢錢: 產生新的賣點,甩賣古董SPARC小型機,賣JAVA培訓教材,賣JAVA認證。
3. 輪迴:解決實際問題,產生新的實際問題,為新語言的發明提供理由和動力。


直接看官網給的答案吧
http://golang.org/doc/go_faq.html#What_is_the_purpose_of_the_project

再參見Rob Pike的演講"public static void"
http://www.youtube.com/watch?v=5kj5ApnhPAE (需翻牆, 有英文字幕)
http://v.youku.com/v_show/id_XMTkzOTM4OTA4.html (無字幕)


語言的終極目標:
開發(包括維護)高效,運行(包括部署)高效

目前,基本沒有什麼語言能同時滿足這2個高效(除了delphi,但它只限於win平台,而且已經被冷落多年)
所以google(相當於各個公司的奇客形象)自創了go這一個新語言


歸根結底,還是為了提高開發效率,在基本不損失運行效率的前提下。


為了讓語言更加容易使用!編程更加容易!


為了降低c/c++那些語言的複雜度,又需要一個高性能的語言.提高生存力..具體對google自己的利益最直接的是能讓用戶在其產品里得到更大更好的開發空間.比如google app engine
我覺得算是編譯型的腳本語言,因為他能像腳本簡短又干大事,性能又不差.所以我學來做為服務端開發的第2語言.


Go解決的是編程語言本身的問題。
Go是系統級編程語言,是跟C和C++比較的。
C生產效率比較低。C++寫起來太正兒八經,程序員很痛苦。Go是程序員為程序員開發的語言,代碼寫起來很舒服。


推薦閱讀:

很多西方人念漢語的「窩們歪果人」這樣的聲調是因為什麼?
哪些翻譯讓你感嘆「語言是如此之美」?
現在有必要區分「的」、「地」、「得」嗎?
想用 GO 寫一個開源分散式數據處理相關的系統,並學習 GO,有什麼建議?
只用同一聲調的字可以造出哪些句子?

TAG:Go 語言 |