Thursday, December 10, 2009

Google 的開放源碼程式語言 Go 起跑

Google 似乎永不滿足於現狀,已經是搜尋、線上文件協同合作、電子郵件等領域的領導者,這次跨足到程式設計上。Google 發表了新的開放源碼物件導向程式語言 Go,強調能夠與 C 匹敵的執行效率,語法的表達能力更為強大,編譯速度也更快。

每個電腦程式設計者針對所使用的程式語言,都可以列出一大串有待改進的選項。畢竟語法甜頭 (syntactic sugar)、更好的執行效能、更快的編譯速度,有誰不想要?因為如此,才會有這麼多種程式語言。更別提軟體產業中不少領導廠商會打造自己的程式語言,或是擴展現有的程式語言。

Google 認為,現有的主要程式語言如 C/C++、Java、C#,都是基於類似的語法,這些語言的更新與加強只有不斷增加的程式庫,鮮少對語言核心做出改變。Google 所想要的,並非只是添加新的程式庫。

自從 C 語言出現以來,電腦運算的面貌已經改變許多。Google 認為現在的電腦速度大幅提升,相對的軟體開發並沒有隨之加速。程式語言必須改變以支援如平行處理等概念。

根據 Google 的部落格,Go 結合了 Python 等動態語言的開發速度,以及 C 或 C++ 等編譯語言的效能與安全性。Go 提供了表達式型別系統、快速編譯、高執行效能,以及有助簡化多緒程式設計與並行處理的內建語言功能。

Go 程式語言從 2007 年 9 月開始發展,一開始是 Google 的 20% 專案,也就是 Google 工程師允許投入自由選擇的實驗專案。專案最後成了全時的任務項目。Google 以 BSD 授權釋出 Go 的原始程式碼,希望藉此形成參與該計畫的社群,讓該程式語言成為軟體開發的新選擇。

Google 釋出的 Go 編譯器,包括針對 64 位元架構的 6g 與 x86 的 8g,執行速度飛快,此外,也有基於 GNU Compiler Collection (GCC) 的編譯器 Gccgo。基於 GCC 的編譯器雖然速度不快,但可以產生更有效率的程式碼。令人訝異的是,精通 Low-Level Virtual Machine (LLVM) 編譯器架構,並且在 Python 最佳化上大量運用 LLVM 的 Google,並沒有在 Go 編譯器上使用 LLVM。Google 工程師 Rob Pike 表示,Go 專案的初期階段考慮過 LLVM,但其編譯時期效能仍不足。

Pike 表示,Go 語言與其現有實作已經相對成熟,但仍不適於在產品環境中使用。程式語言整套開發系統尚未完備,目前沒有 IDE 整合,標準程式庫仍過於單薄,也沒有足夠的實際程式碼範例。將 Go 開放給程式開發社群將有助加速上述部份的發展。

Go 有許多令人印象深刻的特色。該語言編譯快速,可以在數秒內於單一機器上編譯大型程式。其設計可簡化運用到現今多核處理器之應用軟體的編寫。Go 支援並行執行,和並行程序間的原生通訊,以及完整的垃圾回收 (garbage collection) 功能。

並行化是 Go 的設計重點,該語言引入了可並行執行的 goroutine 概念。任何函式在呼叫前加上 “go” 關鍵字,即可以 goroutine 形式執行。該語言提供了 “channel” 機制,讓 goroutine 彼此進行安全的資料傳輸。

不像其他物件導向語言,Go 大幅簡化了型別結構,不提供物件繼承功能。開發者可以定義結構型別,然後建立操作該型別的方法。像 Java 一樣,Go 允許定義介面 (interface),不過,開發者無法手動指定一個類別所實作的介面。Pike 表示,此一介面機制給予開發者鴨子型別 (duck-typing) 的部份彈性,但是進一步提供了編譯時期檢查的好處。

除此之外,Go 的語法乍看與 C 相似,for 迴圈、函式、標準條件表示式等功能都存在,只不過或多或少加入了一些修改。例如支援簡單型別推斷 (type inference) 的變數指定簡略語法。Go 也擁有了匿名函式提供 closure 功能。似乎是受到 Python 的影響,而且 Python 又是 Google 偏好的程式語言之一,Go 語言也有 array slice 與 map 型別等類似 Python 的特色。

作為語言的展示,Google 開發者運用 Go 寫了運行該專案網站的 Web 伺服器。除此之外,Go 尚未運用在 Google 其他產品中。就如 Google 所有產品一樣,Go 處於 beta 階段而不適用於產品使用。透過釋出 Go,Google 希望藉此拉攏圍繞 Go 語言的社群,並且該語言最終能作為該公司廣泛運用的 C++ 語言的替代方案。

No comments: