OS Xのllvm、clang、gccについて質問があります。
llvm-gcc 4.2、llvm 2.0、clangの違いは何ですか?私はそれらすべてがllvmに基づいていることを知っていますが、それらはどのように違うのですか?
高速なコンパイルに加えて、gccに対するllvmの利点は何ですか?
OS Xのllvm、clang、gccについて質問があります。
llvm-gcc 4.2、llvm 2.0、clangの違いは何ですか?私はそれらすべてがllvmに基づいていることを知っていますが、それらはどのように違うのですか?
高速なコンパイルに加えて、gccに対するllvmの利点は何ですか?
回答:
LLVMはもともと「低レベルの仮想マシン」を意味していましたが、従来の仮想マシン以外のものに成長したため、現在はLLVM自体を表しているだけです。これは、コンパイラーとジャストインタイムコンパイラーのビルドを支援するために使用できるライブラリとツールのセット、および標準化された中間表現です。独自の中間表現以外をコンパイルすることはできません。そのためには、言語固有のフロントエンドが必要です。人々がLLVMに言及するだけなら、おそらく低レベルのライブラリとツールだけを意味します。Clangまたはllvm-gccを誤って「LLVM」と呼ぶ人がいるため、混乱が生じる可能性があります。
llvm-gccは、GCCの代わりにLLVMをバックエンドとして使用するGCCの修正バージョンです。GCCの新しいプラグインシステムを使用してGCCをフォークせずに同じことを行うDragonEggに代わり、現在は非推奨になっています。
Clangはまったく新しいC / C ++ / Objective-Cコンパイラであり、独自のフロントエンドとバックエンドとしてLLVMを使用しています。それが提供する利点は、より良いエラーメッセージ、より速いコンパイル時間、および他のツールがコンパイルプロセスにフックするためのより簡単な方法です(LLDBデバッガーやClang静的アナライザーなど)。また、適度にモジュール化されているため、C、C ++、またはObjective-Cコードを分析する必要がある他のソフトウェアのライブラリとして使用できます。
これらのアプローチ(プレーンGCC、GCC + LLVM、およびClang)にはそれぞれ長所と短所があります。私が見た最後の数セットのベンチマークは、ほとんどのテストケースでGCCがわずかに高速なコードを生成することを示しました(LLVMにはいくつかのわずかな優位性がありましたが)一方で、LLVMとClangはコンパイル時間を大幅に改善しました。GCCとGCC / LLVMコンボには、より多くのコードがテストされ、CのGCCフレーバーで機能するという利点があります。GCCだけが持ついくつかのコンパイラ固有の拡張機能と、標準が実装の変更を許可しているが、コードが1つの特定の実装に依存している場所があります。レガシーCコードを大量に取得すると、Clangで動作するよりもGCCで動作する可能性が高くなりますが、これは時間とともに改善されています。
ここには2つの異なるものがあります。
LLVMは、その上にコンパイラを構築するためのバックエンドコンパイラです。ターゲットアーキテクチャに適合したコードの最適化と生成を扱います。
CLangは、C、C ++、およびObjective Cのコードを解析し、LLVMに適した表現に変換するフロントエンドです。
llvm gccは、gcc 4.2に基づくllvmベースのC ++コンパイラの初期バージョンでした。CLangは解析できるすべてのものを解析できるため、現在では非推奨になっています。
最後に、CLangとgccの主な違いは、生成されたコードではなく、アプローチにあります。gccはモノリシックですが、CLangはライブラリのスイートとして構築されています。このモジュール設計により、たとえばIDEまたは補完ツールの再利用の機会が大幅に広がります。
現時点では、gcc 4.6で生成されたコードは一般的に少し高速ですが、CLangはギャップを埋めています。
llvm-gcc-4.2はGCCフロントエンドを使用してコードを解析し、LLVMを使用してコンパイルされた出力を生成します。
「llvmコンパイラ2.0」は、clangフロントエンドを使用してコードを解析し、LLVMを使用してコンパイル済み出力を生成します。「clang」は実際にはこのフロントエンドの名前にすぎませんが、コンパイラ全体の名前としてさりげなく使用されることがよくあります。