Go 团队核心开发者 Russ Cox 表示自己看到最近业界对非 x86 架构处理器的讨论沸沸扬扬,所以值得发表一篇关于 Go 对非 x86 架构处理器的支持的文章。
Russ 表示,他们十分看重 Go 的可移植性,因此一直在避免让 Go 过度适应任何特定的操作系统或架构。Go 最早的开源版本包括对两种操作系统(Linux 和 Mac OS X)和三种架构(64 位 x86、32 位 x86 和 32 位 ARM)的支持。
发展到现在,Go 增加了对更多操作系统和架构组合的支持:
- 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,例如 Raspberry Pi 3。此外还支持基于 64 位 PowerPC 架构的 AIX
- Go 1.14(2019年2月)支持基于 64 位 RISC-V 架构的 Linux
Russ 认为,虽然 Go 在早期凭借对 x86-64 port 的支持收获了很多关注,但如今,他们所有基于 SSA 的编译器后端都很好地支持了所有目标架构,并产出了许多优秀的代码。
他指出 Go 提供了十分方便使用的交叉编译。例如,要从 64 位 Linux 系统为基于 32 位 x86 架构的 Windows 构建应用程序只需使用以下命令:
GOARCH=386 GOOS=windows go build myapp # writes myapp.exe
因此,Go 总能很好适应各种硬件环境。Russ 表示,多年来 Go 一直在 ARM64 Linux 服务器上为 Docker 、Kubernetes 和 Go 生态的其他部分,以及 ARM64 Android 和 iOS 设备上的移动应用提供支持。
苹果宣布 Apple silicon 后,谷歌很快就和他们开始了合作,以确保 Go 和更广泛的 Go 生态能良好地运行在其设备上。最近发布的 Go 1.16 测试版已原生支持 M1 芯片。
Russ 认为,在本地开发时使用与生产环境相同的 CPU 架构当然是最好的,这样可以消除两种环境之间的差异。但对于 Go 来说,无论是在 x86 系统上开发然后部署到 ARM 上,还是在 Windows 上开发然后部署到 Linux 上,或者其他组合,在一个系统上开发然后交叉编译部署到另一个系统,Go 都可以轻易且方便地胜任。
最后 Russ 提到了 Go 的未来移植计划,他们的下一个目标是支持 ARM64 Windows 10。如果你对此感兴趣并愿意提供帮助,访问 https://github.com/golang/go/issues/36439。
猜你喜欢: