3

誰かが LLVM を使用して特定の言語を静的にコンパイルしたいとします。最初に C に変換し、直接 IR 変換を処理する代わりに CLang を使用する場合の最大の違い (長所と短所) は何でしょうか。

私が推測する明白な答えは、ソース言語を認識しているフロントエンドを使用することで、生成された C で CLang が適切に動作することを期待するよりも、最適化された IR 表現を考え出す方が簡単だということでしょう。

ここで何か不足していますか?

4

1 に答える 1

1

汎用Cバックエンドを使用する利点:

  • (Clangだけでなく)任意のCコンパイラを使用できます
  • このような高級言語の場合、中間コードのデバッグが容易になります
  • ソース言語のセマンティクスによっては、Cを介して翻訳する方が簡単な場合があります(必ずしもそうとは限りません)。

そして、欠点は次のとおりです。

  • 言語がインクリメンタルにコンパイルされる場合(たとえば、明確に分離されたモジュールや複雑なマクロシステムなどがない場合)、LLVM IRを介して、JITコンパイルをすぐに実行する単一のモジュールでコンパイルする方が、数百の小さなCモジュールを生成するよりも理にかなっています。つまり、Cは個別のコンパイルを実行しています。
  • ソース言語のセマンティクスがCから離れすぎている場合は、それをより低いレベルに直接コンパイルする方が簡単な場合があります。
  • すべてのLLVM機能がCEg、組み込み関数、代替呼び出し規約、高級言語のデバッグメタデータから直接アクセスできるわけではありません。
  • Clangは大きいですが、メモリフットプリントが改善されることを除けば
  • Clangは保守が容易ではなく、ヘッダーの存在と正確な位置、の一部gccなどに依存します。Clangがないと、ベアLLVMを単独で使用でき、依存関係を自己完結型に保つことができます。

ほとんどの場合、最適化は問題ではありません。Clangは、意図的に、非常に最適ではないLLVMIRを生成しています。LLVMは、フロントエンドではなく、すべての最適化を処理する必要があります。もちろん、いくつかの高レベルの最適化を行うことができない限り、それらはバックエンドの選択に依存しません。

于 2013-03-01T09:25:17.337 に答える