繼續使用ARM和超越
拉斯·考克斯
2020年12月17日
業界最近對非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月)增加了對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核心的支援,例如Raspberry Pi3。它還添加了對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去構建myapp#寫入myapp.exe
在過去的一年中,幾家主要的廠商宣佈了用於伺服器,膝上型電腦和開發人員機器的新型ARM64硬體。 Go為此做好了準備。 多年來,Go一直在為ARM64 Linux伺服器上的Docker,Kubernetes和其餘Go生態系統以及ARM64 Android和iOS裝置上的移動應用程式提供支援。
自從今年夏天蘋果宣佈Mac過渡到蘋果晶片以來,蘋果和谷歌一直在努力確保Go和更廣泛的Go生態系統在它們上正常工作,它們都在Rosetta 2下執行Go x86二進位制檔案,並執行本機Go ARM64二進位制檔案。 本週初,我們釋出了第一個Go 1.16 beta,其中包括對使用M1晶片的Mac的原生支援。 您可以在Go下載頁面上下載並試用M1 Mac和所有其他系統的Go 1.16 beta。 (當然,這是一個Beta版本,並且像所有beta一樣,肯定存在我們不知道的錯誤。如果遇到任何問題,請在golang.org/issue/new中報告。)
使用與生產中相同的CPU架構進行本地開發總是很高興,以消除兩種環境之間的一種差異。 如果部署到ARM64生產伺服器,Go還將使在ARM64 Linux和Mac系統上的開發也變得容易。 但是,當然,無論您是在x86系統上工作並部署到ARM,在Windows上工作並部署到Linux還是其他組合,在一個系統上工作並交叉編譯以部署到另一個系統仍然像以前一樣容易。 。
我們要增加支援的下一個目標是ARM64 Windows 10系統。 如果您有專業知識並想提供幫助,我們正在golang.org/issue/36439上進行協調。