The Go Blog

GCC 4.7.1におけるGccgo

イアン・ランス・テイラー
2012年7月11日

Go言語は常に実装ではなく、仕様によって定義されてきました。Goチームは、その仕様を実装する2つの異なるコンパイラ、gcとgccgoを作成しました。2つの異なる実装を持つことで、仕様が完全で正確であることを保証するのに役立ちます。コンパイラが一致しない場合は、仕様を修正し、それに応じて一方または両方のコンパイラを変更します。Gcはオリジナルのコンパイラであり、goツールはデフォルトでそれを使用します。Gccgoは異なる焦点を持ち、異なる実装であり、この投稿ではそれを詳しく見ていきます。

Gccgoは、GNU Compiler Collectionである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ランタイムの多くのコア機能は、goroutineスケジューラ、チャネル、メモリ割り当て機能、ガベージコレクタなど、gccgoとgcの両方で同じです。Gccgoはgcコンパイラと同様にgoroutineスタックの分割をサポートしますが、現在x86(32ビットまたは64ビット)のみで、goldリンカを使用する場合のみです(他のプロセッサでは、各goroutineは大きなスタックを持ち、深い一連の関数呼び出しがスタックの終端を超えてプログラムがクラッシュする可能性があります)。

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ビデオ
ブログインデックス