Go 部落格

Go 在 ARM 及其他平臺上的發展

Russ Cox
2020 年 12 月 17 日

最近,業界對非 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 的官方二進位制下載,主要用於樹莓派系統。
  • Go 1.7(2016 年 8 月)增加了對 z Systems (S390x) 上的 Linux 和 32 位 ARM 上的 Plan 9 的支援。
  • Go 1.8(2017 年 2 月)增加了對 32 位 MIPS 上的 Linux 的支援,並增加了 64 位 PowerPC 和 z Systems 上的 Linux 的官方二進位制下載。
  • Go 1.9(2017 年 8 月)增加了 64 位 ARM 上的 Linux 的官方二進位制下載。
  • Go 1.12(2018 年 2 月)增加了對 32 位 ARM 上的 Windows 10 IoT Core 的支援,例如樹莓派 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 裝置上的移動應用程式提供支援。

自今年夏天蘋果宣佈 Mac 轉向 Apple Silicon 以來,蘋果和谷歌一直在合作,以確保 Go 和更廣泛的 Go 生態系統在其上執行良好,無論是透過 Rosetta 2 執行 Go x86 二進位制檔案,還是執行原生 Go ARM64 二進位制檔案。本週早些時候,我們釋出了首個 Go 1.16 測試版,其中包括對使用 M1 晶片的 Mac 的原生支援。您可以在Go 下載頁面下載並試用適用於 M1 Mac 和所有其他系統的 Go 1.16 測試版。(當然,這是一個測試版本,像所有測試版一樣,它肯定存在我們不知道的錯誤。如果您遇到任何問題,請在golang.org/issue/new報告。)

在本地開發中使用與生產環境相同的 CPU 架構總是好的,這可以減少兩個環境之間的一個差異。如果您部署到 ARM64 生產伺服器,Go 也可以輕鬆地在 ARM64 Linux 和 Mac 系統上進行開發。但當然,在某個系統上工作並交叉編譯部署到另一個系統仍然像以前一樣容易,無論您是在 x86 系統上工作並部署到 ARM,在 Windows 上工作並部署到 Linux,還是其他組合。

我們下一個希望新增支援的目標是 ARM64 Windows 10 系統。如果您具備相關專業知識並願意提供幫助,我們正在golang.org/issue/36439協調相關工作。

下一篇文章:Go 泛型新增提案
上一篇文章:將 godoc.org 請求重定向到 pkg.go.dev
部落格索引