Go 1 及 Go 程式的未來

簡介

推出 Go 版本 1(簡稱 Go 1)是該語言發展中的一個重要里程碑。Go 1 是使用 Go 編寫的程式和專案成長的穩定平台。

Go 1 定義了兩個項目:第一,語言的規格;第二,一組核心 API 的規格,也就是 Go 函式庫的「標準套件」。Go 1 版本包含了透過兩個編譯器套件 (gc 和 gccgo),以及核心函式庫本身來執行的程式。

預期根據 Go 1 規格編寫的程式會繼續在該規格的生命週期中,不變更地正確編譯和執行。在某個不確定的時間點,可能會出現 Go 2 規格,但在那之前,現今可以正常運作的 Go 程式,即使未來出現 Go 1 的「重點」版本(例如 Go 1.1、Go 1.2 等),也應該可以繼續運作。

相容性在原始程式碼層級。編譯套件的二進位相容性無法在各版本之間保證。在重點版本之後,Go 原始程式碼將需要重新編譯才能連結至新版本。

這些 API 可能會大量增加,取得新的套件和功能,但並不會破壞現有的 Go 1 程式碼。

預期

雖然我們預期絕大部分程式將會在之後保持此相容性,但無法保證未來的變更不會損壞任何程式。本文件是嘗試設定 Go 1 軟體在未來相容性的期望。有些程式今天編譯並執行後,可能因為未來重點版本而無法執行。它們都是不太可能發生,但值得記錄一下。

當然,對於所有這些可能性,如果發生,我們會盡力在可行的情況下,在不影響現有程式碼的情況下更新規格、編譯器或函式庫。

這些考量也適用於後續的次要版本。例如,在 Go 1.2 下執行的程式碼應與 Go 1.2.1、Go 1.3、Go 1.4 等相容,但未必與 Go 1.1 相容,因為它可能會使用僅在 Go 1.2 中新增的功能

在版本之間新增的功能,出現在原始程式庫中,但不是編號二進制版本的一部分,都正在積極開發中。對於使用此類功能的軟體,在這些功能已發行之前,不會做出任何相容性的保證。

最後,雖然這不是正確性問題,但程式的執行效能仍可能受到其依賴的編譯器或函式庫實作的變更而影響。對於發行版本之間的特定程式的執行效能,無法提出保證。

儘管這些期望適用於 Go 1 本身,但我們希望在基於 Go 1 的外部開發軟體的開發中,也會考慮類似的考量。

子存放庫

在主要 go 樹的子存放庫中的程式碼,例如 golang.org/x/net,可能會在較寬鬆的相容性需求下開發。不過,子存放庫會加以標記,以找出與 Go 1 次要版本相容的版本。

作業系統

無法保證與作業系統介面的長期相容性,因為這些介面會由外部單位於進行變更。因此,syscall 套件不屬於在此所提供的保證範圍內。從 Go 版本 1.4 開始,syscall 套件已凍結。系統呼叫介面的任何演進都必須在其他地方支援,例如在 go.sys 子存放庫中。如需詳細資料和背景,請參閱 此文件

工具

最後,Go 工具鏈(編譯器、連結器、建構工具等)正在積極開發中,可能會改變行為。這表示,例如,依賴工具位置和屬性的腳本可能會因要點發行而中斷。

撇開這些警告不談,我們相信 Go 1 將成為 Go 及其生態系開發的堅實基礎。