web-dev-qa-db-ja.com

OS XでのLLVMとclang

OS Xのllvm、clang、およびgccに関する質問があります。

Llvm-gcc 4.2、llvm 2.0、clangの違いは何ですか?それらはすべてllvm上に構築されることを知っていますが、どのように違いますか?

コンパイルの高速化に加えて、llccがgccより優れている点は何ですか?

127
dominik

LLVMはもともと「低レベルの仮想マシン」の略でしたが、従来の仮想マシン以外のものに成長した現在では、LLVM自体を意味しています。これは、コンパイラーとジャストインタイムコンパイラーの構築を支援するために使用できるライブラリーとツールのセット、および標準化された中間表現です。独自の中間表現以外はコンパイルできません。そのためには、言語固有のフロントエンドが必要です。人々が単にLLVMに言及する場合、それらはおそらく単に低レベルのライブラリとツールを意味します。一部の人々は、Clangまたはllvm-gccを「LLVM」と誤って参照している場合があり、混乱を招く可能性があります。

llvm-gccはGCCの修正版であり、GCCの代わりにLLVMをバックエンドとして使用します。現在、GCCの新しいプラグインシステムを使用してGCCをフォークせずに同じことを行うDragonEggを支持して、廃止されています。

Clangはまったく新しいC/C++/Objective-Cコンパイラで、独自のフロントエンドとLLVMをバックエンドとして使用します。エラーメッセージの改善、コンパイル時間の短縮、他のツールがコンパイルプロセスにフックする簡単な方法( LLDBデバッガーClang静的アナライザー など) 。また、合理的にモジュール化されているため、C、C++、またはObjective-Cコードを分析する必要がある他のソフトウェアのライブラリとして使用できます。

これらのアプローチ(プレーンGCC、GCC + LLVM、およびClang)にはそれぞれ長所と短所があります。私が見た最後の数セットのベンチマークは、ほとんどのテストケースでGCCがわずかに高速なコードを生成することを示しました(ただし、LLVMにはわずかなEdgeがありました)が、LLVMとClangはコンパイル時間を大幅に改善しました。 GCCとGCC/LLVMコンボには、より多くのコードがテストされており、CのGCCフレーバーで動作するという利点があります。 GCCのみが持つコンパイラ固有の拡張機能や、標準では実装を変更できるがコードは特定の実装に依存する場所があります。 GCCで動作する従来のCコードを大量に取得した場合、Clangで動作するよりもはるかに可能性が高くなりますが、時間が経つにつれて改善されます。

189
Brian Campbell

ここには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はギャップを埋めています。

49
Matthieu M.

llvm-gcc-4.2はGCCフロントエンドを使用してコードを解析し、LLVMを使用してコンパイル済み出力を生成します。

「llvm compiler 2.0」はclangフロントエンドを使用してコードを解析し、LLVMを使用してコンパイル済み出力を生成します。 「clang」は、実際にはこのフロントエンドの単なる名前ですが、多くの場合、コンパイラ全体の名前として何気なく使用されています。

5
Stephen Canon