Go 博客
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 的官方二进制下载,主要用于树莓派系统。
- 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
博客索引