GoとARM:その先へ
Go on ARM and Beyond by Russ Cox
最近、業界ではx86以外のプロセッサが話題になっています。そこで、Goがそれらのプロセッサをどのようにサポートしているかについて、簡単な記事を書く価値があると考えました。
Goが特定のOSやアーキテクチャに過度に最適化されることなく、移植性を保つことは私たちにとって常に重要なことでした。Goの最初のオープンソースリリースでは、2つのOS(LinuxとMac OS X)と3つのアーキテクチャ(64ビットx86、32ビットx86、32ビットARM)をサポートしていました。
その後何年もかけて、私たちはさらに多くのOSとアーキテクチャの組み合わせへのサポートを追加してきました。
- 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のサポートを追加しました。また、主にRaspberry Pi向けとして、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月)は、Raspberry Pi 3のような32ビットARM上のWindows 10 IoT Coreのサポートを追加しました。また、64ビットPowerPC上のAIXのサポートも追加しました。
- Go 1.14(2019年2月)は、64ビットRISC-V上のLinuxのサポートを追加しました。
Goの初期の頃はx86-64版への注目が最も集まっていましたが、現在ではすべての対象アーキテクチャがSSAベースのコンパイラバックエンドによってしっかりとサポートされており、優れたコードを生成できます。この道のりでは、Amazon、ARM、Atos、IBM、Intel、MIPSといった企業のエンジニアを含む多くのコントリビューターに助けられてきました。
Goはこれらすべてのシステムに対して、最小限の手間で標準機能としてクロスコンパイルをサポートしています。たとえば、64ビットのLinuxシステムから32ビットx86ベースのWindows向けにアプリをビルドする場合は次のようになります。
GOARCH=386 GOOS=windows go build myapp # myapp.exe を出力する
この1年で、いくつかの大手ベンダーがサーバー、ノートパソコン、開発者向けマシン向けの新しい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の最初のベータ版をリリースしました。これにはM1チップを搭載したMac向けのネイティブサポートが含まれています。M1 Mac向け、そしてその他すべてのシステム向けのGo 1.16ベータ版は、Goのダウンロードページからダウンロードして試せます。(もちろんこれはベータリリースであり、他のすべてのベータ版と同様に、私たちがまだ把握していないバグが確実に存在します。何か問題に遭遇したら、golang.org/issue/newから報告してください。)
ローカル開発と本番環境とで同じCPUアーキテクチャを使うと、両者の環境の違いを1つ減らせるので、常に好ましいことです。ARM64の本番サーバーにデプロイしている場合、GoはARM64版のLinuxやMacでの開発も簡単にしてくれます。もちろん、あるシステムで開発して別のシステム向けにクロスコンパイルしてデプロイするというのも、これまでと変わらず簡単です。x86システムで開発してARMにデプロイする場合でも、Windowsで開発してLinuxにデプロイする場合でも、その他の組み合わせでも同様です。
次に私たちがサポートを追加したいと考えているターゲットは、ARM64版のWindows 10システムです。専門知識をお持ちで協力したいという方は、golang.org/issue/36439で作業を調整しています。
By Russ Cox