:::info 日期:2020 年 12 月 17 日
    作者:Russ Cox
    原文链接:https://go.dev/blog/ports :::

    最近业界对非 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 添加了官方二进制下载,主要用于 Raspberry Pi 系统。
    • Go 1.7(2016 年 8 月)添加了对 Linux on z Systems (S390x) 和 32 位 ARM 上的 Plan 9 的支持。
    • Go 1.8(2017 年 2 月)添加了对 32 位 MIPS 上的 Linux 的支持,并添加了适用于 64 位 PowerPC 和 z 系统上的 Linux 的官方二进制下载。
    • Go 1.9(2017 年 8 月)为 64 位 ARM 上的 Linux 添加了官方二进制下载。
    • Go 1.12(2018 年 2 月)添加了对 32 位 ARM(例如 Raspberry Pi 3)上的 Windows 10 IoT Core 的支持。它还添加了对 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 系统为基于 x86 的 32 位 Windows 构建应用程序:

    1. GOARCH=386 GOOS=windows go build myapp # writes myapp.exe

    在过去的一年中,几家主要供应商都发布了用于服务器、笔记本电脑和开发人员机器的新 ARM64 硬件。 Go 在这方面处于有利地位。 多年来,Go 一直在为 Docker、Kubernetes 和 ARM64 Linux 服务器上的 Go 生态系统的其余部分以及 ARM64 Android 和 iOS 设备上的移动应用程序提供支持。

    自从今年夏天 Apple 宣布 Mac 过渡到 Apple 芯片以来,Apple 和 Google 一直在合作以确保 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 上协调工作。