LLVMにツリーのようなIRではなく、アセンブリのようなIRがあるのはなぜですか?または:プロジェクトがclangのASTではなくLLVM IRをターゲットとするのはなぜですか?


14

なぜLLVMの中間表現(LLVM IR)はツリーのようではなくアセンブリのようですか?

あるいは、言語の実装がclangのASTではなくLLVM IRをターゲットにしているのはなぜですか?

そのように思える場合、私は一度に2つの異なる質問をしようとはしていません。私にとっては、クライアントとライブラリの両方のプログラマーが、LLVMのAPIは明らかに優れたソフトウェア設計であり、「なぜ?」

私が尋ねる理由は、IRがASTに似ていればLLVMがフロントエンドにより多くの機能を提供できるように見えることです。clangのASTベースのツールはどのフロントエンドにも使用できるからです。あるいは、LLVM IRを対象とする言語は、clangのASTを対象とする場合、より多くの機能を取得できます。

ClangにはASTを作成および操作するためのクラスと関数があり、LLVMプロジェクトに強く結び付けられている唯一のフロントエンドプロジェクトです。なぜclangのAST機能はLLVMの外部にあるのでしょうか。

私の頭上では、Rust(rustc)、D(ldc)、Haskell(GHC)はすべてLLVMをバックエンドとして使用できますが、Clang ASTは使用しません(私が知る限り、間違っている)。これらのコンパイラのすべての内部詳細はわかりませんが、少なくともRustとDは確かにclangのASTにコンパイルできるようです。Haskellも可能かもしれませんが、それについてはあまり確信が持てません。

これは歴史的な理由によるものですか(LLVMはもともと「低レベルの仮想マシン」であり、clangは後で登場します)?これは、他のフロントエンドがLLVMに供給するものを可能な限り制御したいからでしょうか?clangのASTが「非Cライク」言語に不適切である根本的な理由はありますか?

私はこの質問をマインドリーディングの練習にするつもりはありません。コンパイラー設計に興味はあるが、まだ流notではない私たちにとって役立つものにしたいだけです。LLVMおよびclangプロジェクトは公開で開発されているため、これらのプロジェクトの開発に精通している人が答えられるか、答えがコンパイルオタクにとって十分に明白であり、彼らが答えるのに十分自信があると感じることを望んでいます。


明らかではあるが不十分な回答を先取りするには:

はい、アセンブリのようなIRを有するIR工芸誰により詳細に制御できます(おそらくX langは打ち鳴らすより良いコードベースとASTの形式を持っている)が、それが唯一の答えだ場合、その疑問は、なぜLLVMはない」となっのみ assembly-を持っています高レベルのツリーのようなIRと低レベルのアセンブリのようなIRではなくIRが好きですか?」

はい、プログラミング言語をASTに解析するのはそれほど難しくありません(少なくとも他のコンパイル手順と比較して)。それでも、なぜ個別のASTを使用するのですか?他に何もなければ、同じASTを使用すると、ASTで動作するツールを使用できます(ASTプリンターのような単純なものでも)。

はい、よりモジュール化することは良いことであることに強く同意しますが、それが唯一の理由である場合、他の言語実装がclangのASTではなくLLVM IRをターゲットとする傾向があるのはなぜですか?

これらのプリエンプションは誤っているか、詳細を見落としている可能性があります。詳細がある場合、または私の仮定が間違っている場合は、お気軽にこれらの回答を行ってください。


より明確に答えられる質問に答えたい人のために:アセンブリのようなIR対ツリーのようなIRの長所と短所は何ですか?


1
私はLLVMの専門家ではありませんが、あなたの側には少し誤解があると思います。LLVMにはIRのようなasmはありません。実際、そのIRはツリーというよりグラフに似ています。「asmのような」とは、人間が読めるIR(* .llファイル)を指していると思います。しかし、より包括的な答えを出すことができる本当の専門家を待ってみましょう:)
AlexDenisov

1
1つの重要な側面は歴史かもしれません。LLVMは元々、コンパイラバックエンドをコンパイラフロントエンドから切り離すように設計されました。アイデアは、コンパイラベンダーが言語の最適化で競合し、CPUベンダーが低レベルの最適化で競合するというものでした。たとえば、MicrosoftとAppleは、CコンパイラがCから「最適な」ビットコードを生成する互いに競合し、IntelとAMDは、LLVMバックエンドがビットコードから「最良」のマシンコードを生成する互いに競合します。アプリケーションベンダーは、アプリケーションをビットコードで出荷し、最終的なコンパイルはユーザーの…で行われます。
Mittag

1
… 機械。LLVMが始まったのは、誰もがIntelを使用していることはまったく明らかではありませんでした。AppleはまだPowerPC上にあり、IntelはまだItaniumを推進していました。私の知る限り、Appleはまだ3Dフレームワークの一部でこの方法でLLVMを使用しており、コードはビットコードとして出荷され、インストールされているカードの種類に応じてnVidiaまたはATIのいずれかにコンパイルされます。
ヨルグWミットタグ

1
許してください、しかしIRとは何ですか?
アダムコプリー

回答:


13

ここには、相互に関連するいくつかの質問があります。可能な限りそれらを分離しようとします。

他の言語がclang ASTではなくLLVM IRに基づいているのはなぜですか?

これは、clangがC / C ++フロントエンドであり、clangが生成するASTがC / C ++と密結合しているためです。別の言語でも使用できますが、C / C ++の一部のサブセットとほぼ同じセマンティクスが必要になり、非常に制限されます。あなたが指摘するように、ASTへの解析はかなり簡単ですので、セマンティックの選択を制限することは小さな節約の価値はありそうにありません。

ただし、静的アナライザーなどのC / C ++のツールを作成している場合、ASTを再利用することは、C / C ++で作業している場合にRAWテキストよりもASTで作業する方がはるかに簡単であるため、非常に理にかなっています。

LLVM IRがその形式であるのはなぜですか?

LLVM IRは、コンパイラの最適化を記述する適切な形式として選択されました。そのため、主な機能は、SSA形式であることです。これは非常に低レベルのIRであるため、広範囲の言語に適用できます。たとえば、言語によって大きく異なるため、メモリを入力しません。

現在、コンパイラの最適化の作成は非常に専門的な作業であり、多くの場合、言語機能の設計と直交している場合があります。ただし、コンパイルされた言語を高速で実行することは、かなり一般的な要件です。また、LLVM IRからASMへの変換はかなり機械的なものであり、一般に言語設計者にとっても興味深いものではありません。

したがって、言語をLLVM IRに引き下げると、言語設計者は多くの「無料のもの」を得ることができます。これは、実際には言語自体に集中するように任せるのに非常に役立ちます。

別のIRが役立つでしょうか(OK、尋ねられませんが、ある意味暗示されます)?

絶対に!ASTは、プログラム構造の特定の変換には非常に適していますが、プログラムフローを変換する場合は使用が非常に困難です。一般に、SSAフォームの方が優れています。ただし、LLVM IRは非常に低レベルであるため、多くの高レベル構造が失われます(意図的に、より一般的に適用可能です)。ここでは、ASTと低レベルIRの間にIRがあると便利です。RustとSwiftはどちらもこのアプローチを採用しており、2つの間に高いレベルのIRがあります。


Haskellには、LLVMに到達する前に多数のIRがあります。
-DylanSp

1
@ DylanSp確かに。複雑な言語の事実上のベストプラクティスになり始めています。たとえば、Rustは最初はこれを行わず、高レベルのIRを含めるようにリファクタリングしました。また、clangでこれを行うことについての話もあったと思いますが、どこに行ったのかわかりません。
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.