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 月)支持最初的系统以及 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 系统(S390x)上的支持,以及 Plan 9 在 32 位 ARM 上的支持。
  • Go 1.8(2017 年 2 月)增加了对 Linux 在 32 位 MIPS 上的支持,并且为 Linux 在 64 位 PowerPC 和 z 系统上添加了官方二进制下载。
  • 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 的编译器后端的良好支持,并能够生成优秀的代码。在此过程中,我们得到了许多贡献者的帮助,包括来自 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 beta 版本,其中包括对使用 M1 芯片的 Mac 的原生支持。您可以在Go 下载页面上下载并试用适用于 M1 Mac 和所有其他系统的 Go 1.16 beta 版。(当然,这是一个 beta 版本,与所有 beta 版本一样,它肯定存在我们不知道的错误。如果您遇到任何问题,请在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
博客索引