1. ホーム
  2. compiler-construction

[解決済み] clang(およびLLVM)とgcc / g++の違いは何ですか?

2022-03-06 03:13:40

質問

gccとg++は、CとC++コードのための伝統的なGNUコンパイラです。最近では、LLVMを使ったclang(およびclang++)が代替コンパイラとして人気を集めています。

clangとgcc / g++の違いは何ですか?また、clangを使用するメリットはありますか?

どのように解決するのですか?

GCCは大きな袋のようなソフトウェアです。私の理解では、典型的なプロセスは、GCCフロントエンドがコードをlexして解析し、GCC内部のレジスタ転送言語(RTL)に変換し、そして、バックエンドがネイティブコードを書き出すというものです。

つまり、典型的な流れの1つは、次のようなものです。Cコード ---> GCCのCフロントエンド ---> RTL ---> GCCのx86バックエンド ---> x86マシンコード。

GCCはいくつかのフロントエンドをサポートしています。C、C++、Java、Objective C、Go、Fortranです。

GCCはいくつかのバックエンドをサポートしています。32ビットx86、64ビットx86、リトルエンディアンARM、ビッグエンディアンARM、MIPS、SPARC、PowerPC、その他。

フロントエンドはテキストをRTLに変換し、バックエンドはRTLを何らかのマシンコードに変換します。

LLVMは、GCCのRTLと同様のコンセプトで、中間層の機械に依存しない計算表現である。LLVM中間表現(IR)と呼ばれる独自の型システムと命令セットを持っています。私の理解が正しければ、LLVMのIRは、GCCのRTLよりも豊かで、表現力があり、はるかに柔軟で、多くの利点を提供するものです。LLVMのためのコンパイラフロントエンドは、多くの異なる言語のために、すべてLLVM IRにコンパイルすることができます。これは、C、C++、Javaなどの「従来型」の言語に使用できますが、GPUシェーダーや、C++のような「非従来型」のプログラミング・タスクにも使用することができます。 sqlクエリ

LLVMは、おそらく、2つのものです。LLVM-the-machineは、型システムと命令セットで、おそらく "LLVM IR" と呼ばれるものです。LLVM-the-APIは、LLVM JITコンパイラーやLLVM x86マシンコードバックエンドなど、LLVM IR内のコードを操作するためのソフトウェアです。

ClangはLLVMのフロントエンドで、C言語系の言語を処理します。C、C++、Objective C、Objective C++などのC系言語を処理するLLVMのフロントエンドです。ClangはC/C++などをLLVM IRに変換し、LLVMはIR上で最適化を行い、LLVM x86バックエンドがx86マシンコードを書き出し、実行します。

LLVMは、その名前に反して、伝統的な意味での仮想マシンではなく、コードを操作するタスクに適した計算モデルおよび表現です。

LLVMの人気の一因は、完全に再定義されたコンパイラのAPIであることにある。コードの静的解析("このコードは誤って未初期化メモリを使っていないか")、最適化、コード解析(IDE構築用など)に使用することができる。GCCの内部はとても高度に結合されていますので、このような方法でGCCを使うことは信じられないほど困難です。一つの例は、GCCのフロントエンドが解析中にいくつかの最適化を行うことです。したがって、たとえば、エラーを報告し、squiggle-line構文強調を実行するために、いくつかの情報が失われるかもしれないので、常にコード-ア-タイピングを完全に表現することができるわけではありません。

私が理解しているように、Clangは最適化されていない解析済みシンタックスを保持し、サードパーティツールがその出力を使って元のテキストに等価変換を戻すことを可能にします。最も重要なのは、Clangのエラーメッセージは、問題のある行の部分を正確にハイライトできるのでより役に立ちます。