Goブログ
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
昨年、いくつかの主要なベンダーが、サーバー、ラップトップ、開発者向けマシン向けの新しいARM64ハードウェアを発表しました。Goはこの状況にうまく対応していました。長年にわたり、GoはDocker、Kubernetes、およびARM64 Linuxサーバー上の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アーキテクチャを使用すると、2つの環境間の違いをなくせるため、常に便利です。ARM64本番サーバーにデプロイする場合は、Goを使用すると、ARM64 LinuxおよびMacシステムでも簡単に開発できます。しかしもちろん、x86システムで作業してARMにデプロイする場合でも、Windowsで作業してLinuxにデプロイする場合でも、その他の組み合わせでも、これまでと同じように簡単に1つのシステムで作業して別のシステムにクロスコンパイルできます。
次にサポートを追加したいターゲットは、ARM64 Windows 10システムです。専門知識があり、協力したい場合は、golang.org/issue/36439で作業を調整しています。