GCC vs clang / LLVM —それぞれの長所と短所[非公開]


20

GCC対clang / LLVMの長所と短所は何ですか?


3
誰のための長所/短所?LLVMはコンパイラのバックエンドとして明らかに優れていますが、サポートされているアーキテクチャの途方もない量が必要な場合を除きます。しかし、私はあなたがエンドユーザーについて話していると思います。

回答:


19

gccは非常に成熟しており、インストールが簡単で(少なくともほとんどのシステムで)、多くのシステムのデフォルトコンパイラであるため、多くの場合、ほとんど気付かないうちにインストールされます。それは無数のアーキテクチャに移植されているので、あいまいなハードウェアをターゲットにしなければならない場合、すぐに動作する可能性がはるかに高くなります。

clangはずっと新しいです。特にC ++テンプレートの場合、より良いエラーメッセージが頻繁に生成されます。多くの場合、はるかに高速に実行されます。主に一連のライブラリとして構築されているため、同じフロントエンドを使用したり、同じ入力を理解したりするかなりの他のプロジェクト(コードアナライザーなど)があります。それからコードを生成する方法。


17
  1. Clangのエラーレポート機能ははるかに優れています。たとえば、呼び出す関数名にタイプミスをすると、Clangはこれがタイプミスである可能性があることを報告し(正しい名前を提案します)、GCCは未知の関数名について文句を言います。

  2. x86 / x86-64を対象とする場合、GCCは通常、より高速なコードを生成します。ARMの場合、状況はあいまいです。多くの場合、Clangはより適切に最適化します。また、AFAIK Clangはコードサイズの最適化をサポートしていません。

  3. GCCは多くのヒューリスティックを使用します。これはパフォーマンス(通常の場合)には適していますが、ソースレベルの最適化(ループの展開など)を行う場合はひどいです。小さなソースコードの変更でも、GCCがまったく異なる出力を生成する可能性があります。Clangはより予測しやすく、通常は期待するコードを生成します。

  4. Jerry Coffinとは異なり、ソースからGCCを構築するのはClangよりもはるかに困難です。Clangの「はじめに」ページの手順は、常に私にとってはうまくいきました。GCCの同様のマニュアルは、最初の試行では機能しませんでした。GCCはGMP、MPFR、MPC、Parma Polyhedra Library、およびCLooGの特定のバージョンに依存しているため、特定のGCCリリースで機能するバージョンを見つけるためにいくつかの反復が必要でした(はい、それらのライブラリの最新バージョンを使用しても機能しません) )。

  5. ClangはGCCよりもテストされていると感じています。GCCの公式リリースのみを使用していても、誤ったコードが生成されることがありました。Clangの場合、通常はトランクバージョンを使用します(これも簡単に作成できるため)が、間違った出力を生成するのを見たことはありません。

  6. GCCはLinuxの世界ではほぼ標準であり、Linuxソフトウェアで広く使用されている多くの非標準機能を追加します。ClangはGCCとの互換性を保とうとしますが、時々静かに無視します。最も重要なことは、ClangはOpenMPをサポートしていないことです。ただし、GCCでサポートされていない拡張機能もありますが、有用な場合があります(たとえば、add-with-carry組み込み関数__buildin_addc)。

  7. コンパイラの研究をしたい場合、または単にその動作に興味がある場合は、Clang / LLVMソースコードにアクセスしやすくなります。Clang / LLVMコードは、コンパイラーだけでなく人間が読むことができます。

  8. (AINALの免責事項が適用されます)Clang / LLVMライセンスは、商用製品またはクローズドソース製品での使用など、コードで何ができるかについてより多くの自由を与えます。GCCランタイムライブラリのライセンスは、Clangコンパイラランタイム(compiler-rtライブラリ)が許可されたMITライセンスの下にある間に、別の制限層を追加します。

要約:プログラムの開発時にはClangを使用してコンパイルし、最終ビルドにはGCCを使用してコンパイルします(ただし、高速で壊れないようにしてください)。コンパイラーの調査を行う場合は、Clang / LLVMに固執してください。


興味深いことに、Clangにadd-with-carry組み込み関数があることは知りませんでした。しかし、そう__builtin_addではないはず__buildin_addcです。とにかく、Clangはaddcキャリーとして比較を使用して
ワイドアド

そうでは__builtin_addcない__buildin_addc
-phuclv

ここでのパフォーマンスの比較は古くなっています。より最近のベンチマークによると、clangはx86 / 64のgccよりも半分以上のテストで高速です(例:openbenchmarking.org/result/1605071-HA-GCCCLANG568
Jules

3

新しいCPUアーキテクチャまたは新しい最適化があり、それらをGPLの下でオープンソースにしたい場合は、gccに貢献できます。ただし、gccはモジュール化が少ないため、変更/追加を追加するための作業が増える場合があります。新しいアーキテクチャや最適化をオープンソースプロジェクトに貢献したいが、非GPLライセンスの下で、LLVM / clangに貢献できます。法務部が後者のみを許可している企業が存在します。


-3

今日(2011年8月11日)、GCCはClangよりも多くのC ++ 0x機能をサポートしています。これらの機能が必要な場合は、簡単です。GCCはオプションです。


この回答は、私の調査によると指定された時間枠内で正確かつ有益です。

8
しかし、今日(2012年7月28日)の時点ではそのポイントはもはや有効ではないため、実際にはあまり良い答えではありません。Clangは、GCC以上のものをサポートしています。
DeadMG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.