「gc」と「gccgo」の主な違いは何ですか?


85

2つの人気のあるGoコンパイラ「gc」と「gccgo」の主な違いは何ですか?ビルドパフォーマンス?実行時のパフォーマンス?コマンドラインオプション?ライセンス?

私はどちらが最適かについての意見を探しているのではなく、それらの違いの基本的な概要だけを探しているので、自分のニーズに最適なものを決定することができます。


3
これは時間の経過とともにどのように変化しましたか?今2019年
レオGallucci

回答:


108

詳細については、「gccgoの設定と使用」をご覧ください。

gccgo、Go言語用のコンパイラ。gccgoコンパイラはGCCの新しいフロントエンドです。
gccgoはgcコンパイラではないことに注意してください

GCC4.7.1のGccgo」(2012年7月)説明されているように

Go言語は、実装ではなく、常に仕様によって定義されてきました。Goチームは、その仕様を実装する2つの異なるコンパイラーgcとgccgoを作成しました。

  • Gcは元のコンパイラであり、goツールはデフォルトでそれを使用します。
  • Gccgoは、焦点が異なる別の実装です

gcと比較すると、gccgoはコードのコンパイルに時間がかかりますが、より強力な最適化をサポートしているため、gccgoによってビルドされたCPUバウンドプログラムは通常、より高速に実行されます。

また:

  • gcコンパイラは、最も一般的なプロセッサであるx86(32ビットおよび64ビット)とARMのみをサポートします。
  • ただし、Gccgoは、GCCがサポートするすべてのプロセッサをサポートします。
    これらすべてのプロセッサがgccgoについて徹底的にテストされているわけではありませんが、x86(32ビットおよび64ビット)、SPARC、MIPS、PowerPC、さらにはAlphaを含む多くのプロセッサがテストされています。
    Gccgoは、gcコンパイラがサポートしていないオペレーティングシステム、特にSolarisでもテストされています。

標準のGoリリースからgoコマンドをインストールする場合、-compilerオプションを介してすでにgccgoをサポートしていますgo build -compiler gccgo myprog


要するに:gccgo:より多くの最適化、より多くのプロセッサ


ただし、OneOfOneソース)がコメントしているようにgccgoでサポートされているgoと最新のgoリリースの間には同期がとれていないことがよくあります。

gccgoはバージョンgov1.2までしかサポートしていないため、1.3 / 1.4(ヒント)で新しいものが必要な場合は、gccgoを使用できません。–

GCCリリース4.9には、Go 1.2(1.3ではない)バージョンのgccgoが含まれます
GCCプロジェクトとGoプロジェクトのリリーススケジュールは一致していません。つまり、1.3は開発ブランチで利用可能になりますが、次のGCCリリースである4.10にはGo1.4バージョンのgccgoが含まれる可能性があります。


twotwotwoは言及コメントでブラッド・フィッツパトリック氏のプレゼンテーションのスライドを

gccgoは非常に優れたコードを生成します
...しかしエスケープ分析が欠けています:多くの小さな割り当て+ガベージでパフォーマンスを殺し
ます... GCは正確ではありません。32ビットには適していません。

twotwotwoは追加します:

別のスライドでは、gccgo以外のARMコードの生成が不安定であると述べています。
それがプロジェクトにとって興味深いオプションであると仮定して、おそらくターゲットアーキテクチャのユースケースのバイナリを比較します。


peterSOの コメントはゴー1.5今(Q3 / Q4 2015)手段:

コンパイラとランタイムは完全にGoで記述されています(小さなアセンブラを使用)。
Cは実装に関与しなくなったため、ディストリビューションのビルドにかつて必要だったCコンパイラーはなくなりました

「GoinGo」スライドには、次のことが記載されています。

Cはなくなった。
補足:gccgoは引き続き好調です。


Berkantコメントでgccgogcがブートストラップされたのかを尋ねます。

JörgWMittagの回答:

いいえ、gccgo後に登場しましたgc

gcもともとはCで書かれていました。これは、同じ人々によって設計された、Unixの後継であるPlan9オペレーティングシステムKenThompsonのCコンパイラに基づいています。gcGoで記述されるように、繰り返しリファクタリングされました。

gccgo開始されたイアン・ランス・テイラー、囲碁プロジェクトと提携していないGCCのハッカー。

最初の完全にセルフホストされたGoコンパイラは、実際にはWindows専用の商用クローズドソース実装であり、その名前はインターネットと同じように私の頭から消えたようです。彼らは、Goで記述されたセルフホストコンパイラを持っていると主張し、gccgoまだ存在しておらずgc、Windowsでのセットアップが非常に困難な時期にWindowsをターゲットにしました。(基本的に、完全なCygwin環境をセットアップし、ソースコードにパッチを適用し、ソースからコンパイルする必要がありました。)しかし、製品を販売する前に、会社は崩壊したようです。

Hector Chuは、2009年11月にGoのWindowsポートをリリースしました。
このgo-lang.cat-v.org/os-portsページには、Joe / JosephPoirierの初期作業についても記載されています。ではこのページ

知識のある人が、Windowsポートの作成に携わっている人(Alex Brainman -Hector Chu-Joseph Poirier)の1人がビルド環境の詳細を示すwikiエントリを作成するように要求できる可能性はありますか?

それに加えて(GoでWebアプリ書く!光京(Wei Guangjing)


4
golang.org/doc/go1.3#gccgoさらに重要なことに、gccgoはバージョンgo v1.2までしかサポートしていないため、1.3 / 1.4(ヒント)で新しいものが必要な場合はgccgoを使用できません。
OneOfOne 2014

1
@OneOfOneの良い点です。わかりやすくするために、回答にコメントを含めました。
vonC 2014

1
@twotwotwo良い発見。わかりやすくするために、回答に含めました。
vonC 2014

3
gccgoは、(多くのゴルーチンを1つのスレッドに多重化するのではなく)各ゴルーチンに専用のスレッドを与えることによってゴルーチンを実装することを読みました。これがまだ当てはまる場合、それは一部の人々にとって大きな違いになる可能性があります。
DragonFax 2015

2
@LeoGallucciこの回答の一般的な考え方は、Go 1.11( "gccgo:より多くの最適化、より多くのプロセッサ。")に基づいています。あなたはstackoverflow.com/a/46970176/6309でより最近のイラストを見ることができます。
VonC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.