Go 部落格
探索 ARM 及其他領域
最近產業圈熱烈討論非 x86 處理器,因此我們認為有必要針對 Go 對此類處理器的支援撰寫一篇簡短文章。
對我們來說,Go 的可移植性一直非常重要,不致過度依賴任何特定作業系統或架構。Go 的 初始開放原始碼版本包含對兩個作業系統 (Linux 和 Mac OS X) 及三個架構 (64 位元 x86、32 位元 x86 和 32 位元 ARM) 的支援。
多年來,我們新增了許多其他作業系統和架構組合的支援
- Go 1 (2012 年 3 月) 支援原本的系統,以及 64 位元和 32 位元 x86 上的 FreeBSD、NetBSD 和 OpenBSD,以及 32 位元 x86 上的 Plan 9。
- Go 1.3 (2014 年 6 月) 新增對 64 位元 x86 上的 Solaris 的支援。
- Go 1.4 (2014 年 12 月) 新增對 32 位元 ARM 上的 Android 和 64 位元 x86 上的 Plan 9 的支援。
- Go 1.5 (2015 年 8 月) 新增對 64 位元 ARM 和 64 位元 PowerPC 上的 Linux,以及 32 位元和 64 位元 ARM 上的 iOS 的支援。
- Go 1.6(2016 年 2 月)增加了對 64 位元 MIPS 的 Linux 以及 32 位元 x86 的 Android 支援。它還增加了對 32 位元 ARM 上的 Linux 的官方二進位下載,主要用於 Raspberry Pi 系統。
- Go 1.7(2016 年 8 月)增加了對 z 系統 (S390x) 上的 Linux 以及 32 位元 ARM 上的第 9 號計劃支援。
- Go 1.8(2017 年 2 月)增加了對 32 位元 MIPS 的 Linux 支援,並增加了對 64 位元 PowerPC 和 z 系統上 Linux 的官方二進位下載。
- Go 1.9(2017 年 8 月)增加了對 64 位元 ARM 上 Linux 的官方二進位下載。
- Go 1.12(2018 年 2 月)增加了對 32 位元 ARM 上 Windows 10 IoT Core 的支援,例如 Raspberry Pi 3。它還增加了對 64 位元 PowerPC 上的 AIX 支援。
- Go 1.14(2019 年 2 月)增加了對 64 位元 RISC-V 上 Linux 的支援。
儘管 x86-64 埠在 Go 的早期階段獲得了大部分關注,但今天我們所有的目標架構都得到了我們的 基於 SSA 的編譯器後端 的良好支援,並產出優異的程式碼。我們得到了許多協力人員的協助,包括來自 Amazon、ARM、Atos、IBM、Intel 和 MIPS 的工程師。
Go 支援為所有這些系統進行交叉編譯,而且輕而易舉。例如,要從 64 位元 Linux 系統為 32 位元 x86 基於 Windows 的應用程式建置,
GOARCH=386 GOOS=windows go build myapp # writes myapp.exe
在過去一年中,幾家主要供應商宣布了新的 ARM64 硬體,適用於伺服器、筆記型電腦和開發人員電腦。Go 為此做好了充分的準備。多年來,Go 一直在 ARM64 Linux 伺服器上為 Docker、Kubernetes 和其他 Go 生態系統提供支援,並在 ARM64 Android 和 iOS 裝置上執行行動應用程式。
自從 Apple 宣布今年夏季 Mac 將轉移到 Apple Silicon 後,Apple 和 Google 便開始合作,以確保 Go 和更廣泛的 Go 生態系統都能順利在它們上執行,無論是使用 Rosetta 2 執行 Go x86 二進位檔案,還是執行本機 Go ARM64 二進位檔案。在本週稍早,我們發布了第一個 Go 1.16 測試版,其中包含對使用 M1 晶片的 Mac 的本機支援。您可以到 Go 下載頁面 下載並嘗試 Go 1.16 測試版,適用於 M1 Mac 和您所有其他系統。(當然,這是一個測試版本,與所有測試版一樣,它肯定有一些我們不知道的錯誤。如果您遇到任何問題,請在 golang.org/issue/new 報告這些問題。)
使用與在生產環境中相同的 CPU 架構進行本地開發總是很好,以消除這兩種環境之間的一個變異。如果您部署到 ARM64 生產伺服器,Go 也會讓您輕鬆地在 ARM64 Linux 和 Mac 系統上進行開發。但當然,在一個系統上工作並交叉編譯以部署到另一個系統,依然像以往一樣簡單,無論您是在 x86 系統上工作並部署到 ARM,還是在 Windows 上工作並部署到 Linux,或其他組合。
我們想要為 ARM64 Windows 10 系統新增支援,這是接下來的目標。如果您具備專業知識並且願意提供協助,我們會在 golang.org/issue/36439 中協調作業。