10

Java 仮想マシンは「もともと」Java プログラミング言語用に設計されたと言っても過言ではありませんが、現在では、他の開発者が Scala、Jython、JRuby などの Java バイトコードにコンパイルされるプログラミング言語を作成できるようになっています。

インターフェイス、メソッド、フィールドなど、Java バイトコードにはまだ「オブジェクト指向」の参照があります。たとえば、invokespecial は「オブジェクト」メソッドの呼び出しです。

これは、言語に依存しない純粋な命令セットを備えた純粋なスタック仮想マシンではありません。たとえば、純粋な FORTH 実装にはスタック操作しかありません。

問題は、JVM 言語にとらわれないかどうかです。

4

4 に答える 4

9

JVMは間違いなく言語に依存せず、一部の言語は効率的に実装できません。たとえば、JVMはメモリアドレス指定操作を提供しないため、Cのような低レベル言語の実装はひどく非効率的です。しかし、そのプリミティブのセットは、適切にスマートなコンパイラーがあれば、Javaとは異なる機能を備えた多くの一般的な言語をサポートすることができます。きちんと実装できる言語は、必ずしもシンタックスシュガーを備えたJavaだけではありません。しかしもちろん、Javaとの違いが大きいほど、言語の実装は難しくなります。

于 2011-09-20T14:42:41.743 に答える
4

JVMとJavaバイトコードがturing-completeであるという意味で、他のturing-complete言語は、javaバイトコードに変換およびコンパイルしてJVMで実行できます。それはひどく非効率的かもしれませんが、不可能ではありません。「不可知論者」の可能な限り厳密な定義に関しては、そのようなことはありません。ハードウェアレベルでは、すべてのプロセッサがサポートするバイナリ命令のセットを定義しているため、ある時点で、どの言語も、実行するはずのハードウェアと互換性のあるアセンブリに変換する必要があります。

編集:JVMは真空中で開発されたのではなく、JAVAプログラミング言語と組み合わせて開発されたため、Java言語がJavaバイトコードとJVMの設計に大きな影響を与えたのは当然のことです。その意味で、JVMはJavaを念頭に置いて設計されたと言えます。ただし、アーキテクチャでは、JVMが(中間バイトコード形式を介して)Java言語から意識的に分離されているため、可能な代替言語を考慮した要素が設計に含まれていることも事実です。

于 2011-09-20T15:09:01.633 に答える
4

JVM は言語に依存しません。ただし、その言語は JVM バイトコードです。仮想マシンの組み立てを検討すると、JVM が何を実行するかがよくわかります。JVM バイトコードは、Java プログラムの実行を容易にするために選択されましたが、「完全な」アセンブリと同様に、他の多くの用途に使用できます。重要なのは、コンパイル プロセスで何が行われているかです。

その他の言語障壁には、JVM がスタック ベースのマシンであるという設計が含まれます。これは、明示的なアドレスがバイトコード レイヤーの JVM にとって無意味であることを意味します。「ロード」または「ストア」操作はありません。しかし、それでも JVM でアドレス指定を行う言語を実装したいという人々を止めるものではありません。アドレッシングをしたい人にとっては、それが難しくなるだけです。

JVM でアドレス指定を行うには、基本的にシミュレーターを作成します。「オブジェクトハンドルへのアドレス」ルックアップテーブルを含むオブジェクトがあります。これにより、アドレス指定のない仮想マシンでシミュレーションを介して基本的なアドレス指定を行うことができます。それは常に美しいとは限らず、シミュレーションの品質は通常、シミュレートされた言語が許可するユース ケースにのみ拡張されます。

はい、物理メモリアドレスへの(JVM内部の)Javaヒープ参照へのAddress(オブジェクト)からMap(Javaヒープ参照へのオブジェクトの)を行うと、パフォーマンスが少し低下します。しかし、プラットフォームにとらわれないようにするためには、これを行う必要があります。メモリに直接アクセスできる場合、最終的には、仮想マシンのコーディングではなく、さまざまなハードウェア プラットフォームのコーディングに追われることになります。少なくとも、最近よりもはるかに早く、プラットフォーム固有のコードにプッシュされるでしょう。

于 2011-09-20T14:51:54.080 に答える
2

組み込みの OOP 命令を無視すると、一部の言語は、スタック ベースの VM (JVM など) ではなく、レジスタ ベースの VM (オウムなど) に適しています。

この論文は問題をうまくカバーしています: http://db.usenix.org/events/vee05/full_papers/p153-yunhe.pdf

于 2011-09-20T14:55:20.967 に答える