LLVM と Java (バイトコード) の違いがわかりません。それらは何ですか?
-編集-「それらは何ですか」とは、LLVMとJava(バイトコード)の違いではなく、LLVMとJavaの違いを意味します。
LLVM と Java (バイトコード) の違いがわかりません。それらは何ですか?
-編集-「それらは何ですか」とは、LLVMとJava(バイトコード)の違いではなく、LLVMとJavaの違いを意味します。
Java ではなく JVM を意味すると仮定すると、次のようになります。
LLVM は、低レベルのレジスタ ベースの仮想マシンです。基盤となるハードウェアを抽象化し、コンパイラのバックエンド (マシン コード生成) とフロントエンド (解析など) の間に明確な線を引くように設計されています。
JVM は、はるかに高レベルのスタックベースの仮想マシンです。JVM はガベージ コレクションを提供し、オブジェクトと仮想メソッド呼び出しなどの概念を備えています。このように、JVM は言語の相互運用性のためのより高度なインフラストラクチャを提供します (Microsoft の CLR によく似ています)。
(これらの抽象化を C の上に構築できるのと同じように、LLVM 上に構築することは可能です。)
この質問が間違った方向に進んでしまったのは残念です。より詳細な比較を求めてここにたどり着きました。
JVM バイトコードと LLVM ビットコードの最大の違いは、JVM 命令がスタック指向であるのに対し、LLVM ビットコードはそうではないことです。これは、値をレジスターにロードするのではなく、JVM バイトコードが値をスタックにロードし、そこから値を計算することを意味します。これの利点は、コンパイラがレジスタを割り当てる必要がないことだと思いますが、よくわかりません。
LLVM ビットコードはマシン レベルのコードに近いですが、特定のアーキテクチャに縛られることはありません。たとえば、LLVM ビットコードは任意の数の論理レジスタを使用できると思います。LLVM に詳しい人がここで話してくれませんか?
Java はプログラミング言語であり、「ジャスト イン タイム」(JIT) 実行の手段として JVM を使用します。一方、LLVM は、新しい言語と既存の言語のフロントエンドを開発することを目的としたコンパイラ構築キットです。LLVMにはJIT エンジンがありますが、必要なければ使用する必要はありません。JIT 実行を使用する代わりに、LLVM アセンブラー、バイトコード、またはプラットフォーム固有のアセンブラーを捨てることができます。