なぜ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の長所と短所は何ですか?