Go 部落格

Go on ARM and Beyond

Russ Cox
2020 年 12 月 17 日

最近業界都在熱議非 x86 處理器,所以我們認為有必要簡要介紹一下 Go 對它們的[支援](https://zh.wikipedia.org/wiki/Go%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80)。

對我們來說,Go 的可移植性一直很重要,不應該過度偏向於任何特定的作業系統或架構。Go 的[首個開源版本](https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html)包含了對兩個作業系統(Linux 和 Mac OS X)以及三種架構(64 位 x86、32 位 x86 和 32 位 ARM)的支援。

多年來,我們增加了對更多作業系統和架構組合的支援。

  • Go 1(2012 年 3 月)支援最初的系統,以及 FreeBSD、NetBSD 和 OpenBSD 的 64 位和 32 位 x86,以及 Plan 9 的 32 位 x86。
  • Go 1.3(2014 年 6 月)增加了對 Solaris 的 64 位 x86 支援。
  • Go 1.4(2014 年 12 月)增加了對 Android 的 32 位 ARM 支援,以及 Plan 9 的 64 位 x86 支援。
  • Go 1.5(2015 年 8 月)增加了對 Linux 的 64 位 ARM 和 64 位 PowerPC 支援,以及 iOS 的 32 位和 64 位 ARM 支援。
  • Go 1.6(2016 年 2 月)增加了對 Linux 的 64 位 MIPS 支援,以及 Android 的 32 位 x86 支援。它還為 Linux 的 32 位 ARM 添加了官方二進位制下載,主要用於 Raspberry Pi 系統。
  • Go 1.7(2016 年 8 月)增加了對 Linux 的 z Systems (S390x) 支援,以及 Plan 9 的 32 位 ARM 支援。
  • Go 1.8(2017 年 2 月)增加了對 Linux 的 32 位 MIPS 支援,併為 Linux 的 64 位 PowerPC 和 z Systems 添加了官方二進位制下載。
  • Go 1.9(2017 年 8 月)為 Linux 的 64 位 ARM 添加了官方二進位制下載。
  • Go 1.12(2018 年 2 月)增加了對 Windows 10 IoT Core 的 32 位 ARM 支援,例如 Raspberry Pi 3。它還增加了對 AIX 的 64 位 PowerPC 支援。
  • Go 1.14(2019 年 2 月)增加了對 Linux 的 64 位 RISC-V 支援。

儘管 Go 早期的注意力主要集中在 x86-64 移植上,但如今我們所有的目標架構都得到了我們[基於 SSA 的編譯器後端](https://www.youtube.com/watch?v=uTMvKVma5ms)的良好支援,並能生成出色的程式碼。一路上,我們得到了許多貢獻者的幫助,包括來自 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 一直為 Docker、Kubernetes 以及 ARM64 Linux 伺服器上的其他 Go 生態系統提供支援,同時也在 ARM64 Android 和 iOS 裝置上支援移動應用。

自從蘋果公司今年夏天宣佈 Mac 將過渡到 Apple Silicon 以來,蘋果和 Google 一直在合作,以確保 Go 和更廣泛的 Go 生態系統在這類裝置上執行良好,包括透過 Rosetta 2 執行 Go x86 二進位制檔案,以及執行原生的 Go ARM64 二進位制檔案。本週早些時候,我們釋出了第一個 Go 1.16 beta 版本,其中包含對使用 M1 晶片的 Mac 的原生支援。您可以在 [Go 下載頁面](https://golang.org.tw/dl/#go1.16beta1) 下載並試用 Go 1.16 beta 版,適用於 M1 Mac 以及您所有的其他系統。(當然,這是一個 beta 版本,和所有 beta 版本一樣,肯定存在我們尚未發現的 bug。如果您遇到任何問題,請在 [golang.org/issue/new](https://golang.org.tw/issue/new) 報告。)

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

我們接下來希望新增支援的目標是 ARM64 Windows 10 系統。如果您有相關專業知識並希望提供幫助,我們正在 [golang.org/issue/36439](https://golang.org.tw/issue/36439) 協調相關工作。

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