The Go Blog
ARM とその先の Go
最近、x86以外のプロセッサについて業界が活気づいているため、Goのそれらのサポートについて簡単に投稿する価値があると考えました。
Goが特定のオペレーティングシステムやアーキテクチャに過度に適合せず、移植性があることは、私たちにとって常に重要でした。Goの最初のオープンソースリリースには、2つのオペレーティングシステム(LinuxとMac OS X)と3つのアーキテクチャ(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のサポートを追加しました。また、主に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 # writes 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バイナリを実行する場合でも、それらでうまく機能するように協力してきました。今週初め、M1チップを使用するMacのネイティブサポートを含む最初のGo 1.16ベータ版をリリースしました。Goダウンロードページで、M1 Macおよびその他のすべてのシステム用のGo 1.16ベータ版をダウンロードして試すことができます。(もちろん、これはベータリリースであり、すべてのベータ版と同様に、私たちが知らないバグが確実に含まれています。問題が発生した場合は、golang.org/issue/newに報告してください。)
開発環境と本番環境のCPUアーキテクチャを同じにすることで、両方の環境間のバリエーションを1つ減らすことは常に良いことです。ARM64本番サーバーにデプロイする場合、Goを使用するとARM64 LinuxおよびMacシステムでも簡単に開発できます。しかしもちろん、x86システムで作業してARMにデプロイする場合でも、Windowsで作業してLinuxにデプロイする場合でも、その他の組み合わせの場合でも、1つのシステムで作業して別のシステムにデプロイするためにクロスコンパイルすることは、これまでと同じくらい簡単です。
次にサポートを追加したいターゲットは、ARM64 Windows 10システムです。専門知識があり、協力したい場合は、golang.org/issue/36439で作業を調整しています。