OS XでのLLVMとclang


133

OS Xのllvm、clang、gccについて質問があります。

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

高速なコンパイルに加えて、gccに対するllvmの利点は何ですか?


9
llvmはバックエンドにすぎません。スタンドアロンのllvmコンパイラは存在できません... gccやclangのような異なるフロントエンドしかありません。
smerlin 2011

4
@smerlin:「LLVMコンパイラは、」打ち鳴らす+ LLVMのためのAppleの商品名である:developer.apple.com/technologies/tools/...
スティーブンキヤノン

その他の詳細はこちら:stackoverflow.com/a/26724886/1938163
Marco A.

回答:


201

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で動作する可能性が高くなりますが、これは時間とともに改善されています。


13
このすばらしい答えに付け加えると、clangはライブラリのセット(libclangと呼ばれます)でもあり、コードの分析、オートコンプリート、構文の強調表示などに使用できます。これはIDEにとって非常に便利です。

5
MacOS XまたはiOS用にビルドする場合、Clangは、Appleがオペレーティングシステムを含むすべてのMacOS XおよびiOSソフトウェアをビルドするために使用するソフトウェアであり、Clangは、手間をかけずに自動的に得られるものであり、誰もが今までに得たものであることを考慮してください助けを求めて使用しています。Appleはgcc 4.2以降のgccをサポートしたことがなく、gccのどのバージョンも出荷していません。
gnasher729 14

1
@ gnasher729はい、この回答は3年前に書かれたもので、Appleはllvm-gccとClangの両方を出荷しており、llvm-gccをデフォルトのコンパイラとして使用していました。その後、時代は変わった。
ブライアンキャンベル

54

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


5

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

「llvmコンパイラ2.0」は、clangフロントエンドを使用してコードを解析し、LLVMを使用してコンパイル済み出力を生成します。「clang」は実際にはこのフロントエンドの名前にすぎませんが、コンパイラ全体の名前としてさりげなく使用されることがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.