Go ブログ
GCC 4.7.1 における Gccgo
Go 言語は常に実装ではなく仕様によって定義されてきました。Go チームは、その仕様を実装する2つの異なるコンパイラ、gc と gccgo を作成しました。2つの異なる実装を持つことで、仕様が完全で正しいことが保証されます。コンパイラが異なる場合、仕様を修正し、1つまたは両方のコンパイラを必要に応じて変更します。gc は元のコンパイラであり、go ツールはデフォルトでこれを用います。gccgo は異なる重点を持つ異なる実装であり、この投稿ではそれを詳しく見ていきます。
gccgo は、GNU コンパイラコレクションである GCC の一部として配布されています。GCC は、さまざまな言語に対して複数の異なるフロントエンドをサポートしています。gccgo は、GCC バックエンドに接続された Go フロントエンドです。Go フロントエンドは GCC プロジェクトとは別に開発されており、他のコンパイラバックエンドにも接続できるように設計されていますが、現在では GCC のみをサポートしています。
gc と比較して、gccgo はコードのコンパイルが遅いですが、より強力な最適化をサポートしているため、gccgo でビルドされた CPU バウンドプログラムは通常、より高速に実行されます。長年にわたって GCC で実装されたすべての最適化(インライン展開、ループ最適化、ベクトル化、命令スケジューリングなど)が利用できます。常により良いコードを生成するわけではありませんが、場合によっては、gccgo でコンパイルされたプログラムは30%高速に実行される場合があります。
gc コンパイラは、最も一般的なプロセッサ(x86(32ビットおよび64ビット)と ARM)のみをサポートしています。しかし、gccgo は GCC がサポートするすべてプロセッサをサポートしています。gccgo についてこれらのプロセッサすべてが徹底的にテストされたわけではありませんが、x86(32ビットおよび64ビット)、SPARC、MIPS、PowerPC、さらには Alpha など、多くのプロセッサでテストされています。gccgo は、gc コンパイラがサポートしていないオペレーティングシステム(特に Solaris)でもテストされています。
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 が最適な解決策となる可能性があります。
次の記事: Go コードの整理
前の記事: Google I/O 2012 の Go ビデオ
ブログインデックス