web-dev-qa-db-ja.com

GCCとclang / LLVM-それぞれの長所と短所

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

20
yodie

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

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

19
Jerry Coffin
  1. Clangのエラー報告が大幅に改善されました。例えば。呼び出す関数名にタイプミスがあると、Clangはこれがタイプミスである可能性があることを報告し(正しい名前を提案します)、GCCは不明な関数名について文句を言います。

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

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

  4. Jerry Coffinとは異なり、ソースからGCCを構築することはClangよりもはるかに困難です。 ClangのGetting Startedからの手順 ページは常に私にとってうまくいきました。 GCCの同様のマニュアル 最初の試行では機能しませんでした。 GCCは特定のバージョンのGMP、MPFR、MPC、パルマポリヘドラライブラリ、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. (主な免責事項が適用されます)Clang/LLVMライセンスにより、コードで実行できることについてより多くの自由が与えられます。商用またはクローズドソース製品での使用。 GCCランタイムライブラリのライセンスは、Clangコンパイラランタイム(compiler-rtライブラリ)が許可されている間、別のレイヤーの制限を追加しますMITライセンス。

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

17
Marat Dukhan

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

3
hotpaw2