GCC 4.7.1のGccgo
Gccgo in GCC 4.7.1 by Ian Lance Taylor
Go言語は常に実装ではなく仕様によって定義されてきました。 Goチームはこの仕様を実装する2つの異なるコンパイラ、gcとgccgoを書いてきました。 2つの異なる実装を持つことで、仕様が完全かつ正確であることを確実にする助けになります。 コンパイラ同士の動作が食い違ったときには、仕様のほうを修正し、それに応じて片方あるいは両方の コンパイラを変更します。gcは最初からあるコンパイラで、goツールはデフォルトでgcを使用します。 gccgoは異なる観点を持つ別の実装であり、この記事ではgccgoについて詳しく見ていきます。
Gccgoは、GNU Compiler CollectionであるGCCの一部として配布されています。GCCは様々な言語のために 複数の異なるフロントエンドをサポートしており、gccgoはGCCのバックエンドに接続されたGoのフロントエンドです。 このGoフロントエンドはGCCプロジェクトとは別に存在しており、他のコンパイラバックエンドにも接続できるように 設計されていますが、現時点ではGCCのみをサポートしています。
gcと比較すると、gccgoはコードのコンパイルに時間がかかりますが、より強力な最適化をサポートしているため、 CPUバウンドなプログラムはgccgoでビルドしたほうが通常は高速に動作します。インライン化、ループ最適化、 ベクトル化、命令スケジューリングなど、長年にわたりGCCに実装されてきたすべての最適化が利用可能です。 常により良いコードを生成するとは限りませんが、場合によってはgccgoでコンパイルしたプログラムが 30%高速に動作することもあります。
gcコンパイラは、x86(32ビットおよび64ビット)とARMという、最も普及しているプロセッサのみをサポートしています。 しかしgccgoは、GCCがサポートするすべてのプロセッサをサポートしています。それらのプロセッサすべてが gccgoで徹底的にテストされているわけではありませんが、x86(32ビットおよび64ビット)、SPARC、MIPS、PowerPC、 さらにはAlphaに至るまで、多くのプロセッサでテストされています。gccgoはまた、Solarisをはじめとする、 gcコンパイラがサポートしていないオペレーティングシステムでもテストされています。
Gccgoは標準的で完全なGoライブラリを提供します。ゴルーチンのスケジューラ、チャンネル、メモリアロケータ、 ガベージコレクタなど、Goランタイムの中核となる機能の多くは、gccgoとgcの両方で同じです。gccgoはgcコンパイラと 同様にゴルーチンのスタックの分割をサポートしていますが、現時点ではx86(32ビットまたは64ビット)でgoldリンカを 使用している場合に限られます。(他のプロセッサでは、各ゴルーチンは大きな固定サイズのスタックを持つことになり、 深い関数呼び出しの連鎖がスタックの終端を超えてプログラムをクラッシュさせる可能性があります。)
Gccgoの配布物には、まだgoコマンドが含まれていません。しかし、標準のGoリリースからgoコマンドをインストールすれば、
-compiler オプションを介してすでにgccgoをサポートしています。go build -compiler gccgo myprog のように
使います。GoとC/C++の間の呼び出しに使われるツールであるcgoとSWIGも、gccgoをサポートしています。
私たちは、Goのフロントエンドを他のGoツールと同じBSDライセンスの下に置きました。フロントエンドのソースコードは gofrontendプロジェクトからダウンロードできます。なお、Goフロントエンドが GCCのバックエンドとリンクされてgccgoになる際には、GCCのGPLライセンスが優先されることに注意してください。
GCCの最新リリースである4.7.1には、Go 1をサポートしたgccgoが含まれています。CPUバウンドなGoプログラムで より高いパフォーマンスが必要な場合や、gcコンパイラがサポートしていないプロセッサやオペレーティングシステムを サポートする必要がある場合は、gccgoが解決策になるかもしれません。
By Ian Lance Taylor