回答:
gccは非常に成熟しており、インストールが簡単で(少なくともほとんどのシステムで)、多くのシステムのデフォルトコンパイラであるため、多くの場合、ほとんど気付かないうちにインストールされます。それは無数のアーキテクチャに移植されているので、あいまいなハードウェアをターゲットにしなければならない場合、すぐに動作する可能性がはるかに高くなります。
clangはずっと新しいです。特にC ++テンプレートの場合、より良いエラーメッセージが頻繁に生成されます。多くの場合、はるかに高速に実行されます。主に一連のライブラリとして構築されているため、同じフロントエンドを使用したり、同じ入力を理解したりするかなりの他のプロジェクト(コードアナライザーなど)があります。それからコードを生成する方法。
Clangのエラーレポート機能ははるかに優れています。たとえば、呼び出す関数名にタイプミスをすると、Clangはこれがタイプミスである可能性があることを報告し(正しい名前を提案します)、GCCは未知の関数名について文句を言います。
x86 / x86-64を対象とする場合、GCCは通常、より高速なコードを生成します。ARMの場合、状況はあいまいです。多くの場合、Clangはより適切に最適化します。また、AFAIK Clangはコードサイズの最適化をサポートしていません。
GCCは多くのヒューリスティックを使用します。これはパフォーマンス(通常の場合)には適していますが、ソースレベルの最適化(ループの展開など)を行う場合はひどいです。小さなソースコードの変更でも、GCCがまったく異なる出力を生成する可能性があります。Clangはより予測しやすく、通常は期待するコードを生成します。
Jerry Coffinとは異なり、ソースからGCCを構築するのはClangよりもはるかに困難です。Clangの「はじめに」ページの手順は、常に私にとってはうまくいきました。GCCの同様のマニュアルは、最初の試行では機能しませんでした。GCCはGMP、MPFR、MPC、Parma Polyhedra Library、およびCLooGの特定のバージョンに依存しているため、特定のGCCリリースで機能するバージョンを見つけるためにいくつかの反復が必要でした(はい、それらのライブラリの最新バージョンを使用しても機能しません) )。
ClangはGCCよりもテストされていると感じています。GCCの公式リリースのみを使用していても、誤ったコードが生成されることがありました。Clangの場合、通常はトランクバージョンを使用します(これも簡単に作成できるため)が、間違った出力を生成するのを見たことはありません。
GCCはLinuxの世界ではほぼ標準であり、Linuxソフトウェアで広く使用されている多くの非標準機能を追加します。ClangはGCCとの互換性を保とうとしますが、時々静かに無視します。最も重要なことは、ClangはOpenMPをサポートしていないことです。ただし、GCCでサポートされていない拡張機能もありますが、有用な場合があります(たとえば、add-with-carry組み込み関数__buildin_addc)。
コンパイラの研究をしたい場合、または単にその動作に興味がある場合は、Clang / LLVMソースコードにアクセスしやすくなります。Clang / LLVMコードは、コンパイラーだけでなく人間が読むことができます。
(AINALの免責事項が適用されます)Clang / LLVMライセンスは、商用製品またはクローズドソース製品での使用など、コードで何ができるかについてより多くの自由を与えます。GCCランタイムライブラリのライセンスは、Clangコンパイラランタイム(compiler-rtライブラリ)が許可されたMITライセンスの下にある間に、別の制限層を追加します。
要約:プログラムの開発時にはClangを使用してコンパイルし、最終ビルドにはGCCを使用してコンパイルします(ただし、高速で壊れないようにしてください)。コンパイラーの調査を行う場合は、Clang / LLVMに固執してください。
__builtin_add
ではないはず__buildin_addc
です。とにかく、Clangはaddc
キャリーとして比較を使用して
__builtin_addc
ない__buildin_addc
今日(2011年8月11日)、GCCはClangよりも多くのC ++ 0x機能をサポートしています。これらの機能が必要な場合は、簡単です。GCCはオプションです。