37

Javaで記述されたオープンソースのJVM実装であるMaxineについて簡単に読んでいました。これは私には循環的に聞こえます。Javaで実行するために仮想マシンが必要な場合、仮想マシン自体をJavaで作成するにはどうすればよいですか(VMコードでは実行するVMが必要ではありませんか?など)。

編集:わかりました。JavaをVMで実行する必要がないという事実を見落としていました。では、LISPコンパイラをLISPで作成する方法をどのように説明しますか?それとも、これはまったく新しい質問である必要がありますか?

4

10 に答える 10

15

Javaが仮想マシンを必要とするというあなたの仮定は、そもそも正しくありません。プロジェクトGCJ:Javaプログラミング言語用のGNUコンパイラをチェックしてください。

于 2010-02-17T08:33:52.893 に答える
13

ニワトリとタマゴについてお尋ねします。

読む: http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

于 2010-02-17T08:51:42.580 に答える
7

Java で記述された JVM をブートストラップするために必要な JVM は、おそらく多くの機能 (ガベージ コレクションや JIT など) を必要とせず、非常に単純である可能性があります。その後、すべてのより高度な機能を Java で実装できます (JVM テクノロジの新しいアイデアを試すことが、まさに Maxine のポイントのようです)。

また、Maxine には C コードが含まれており、Maxine の残りの部分を動かすために使用される最小限のランタイム環境を構成していると思います。興味深い部分 (JIT コンパイラー、ガベージ コレクション) は Java で完全に実装されていると思います。

于 2010-02-17T08:44:16.650 に答える
3

ブートストラップを参照してください。

于 2010-02-17T08:51:26.870 に答える
2

Javaコードをマシンコードに直接コンパイルできるため、仮想マシンは必要ありません。

于 2010-02-17T08:38:35.757 に答える
2

先週Maxineを見て、同じことを考えていました:)

マキシンのドキュメントから:

1 ブート イメージのビルド

[ブート イメージ] をビルドします。このステップでは、Maxine はホスト JVM で実行されてプロトタイプを構成し、独自のコードとデータをコンパイルして、ターゲット プラットフォーム用の実行可能プログラムを作成します。

2 走るマキシン

Maxine がコンパイルされたので、これを標準の Java VM として実行できます。max vm コマンドは、クラスおよびライブラリ パスの詳細を処理し、標準の Java ランチャー コマンドと同様のインターフェイスを提供します。

于 2010-02-17T09:57:28.003 に答える
0

コンパイラをブートストラップするための確立された方法を見ることができます。70年代に始まったと思います...

于 2010-02-17T08:39:27.923 に答える
0

この投稿が古いことは承知していますが、見落としていた点があるため、議論に少し追加できると思いました。したがって、将来の読者はこれが役立つと思うかもしれません。

誰もがここで要点を見逃しているのだろうか。ほとんどすべての種類のコンパイラ、インタープリター、または仮想マシンを、ほぼすべての言語で作成できます。C を使用して C コンパイラを作成する場合、新しいコンパイラをコンパイルするには C コンパイラが必要です。ただし、出力は、指定されたプラットフォームで実行されるネイティブ コードです。JVM が JVM で実行される言語で記述されているからといって、出力が JVM で実行されるコードにならなければならないというわけではありません。たとえば、C、Basic、Pascal コンパイラ、さらにはアセンブラを Java で作成できます。この場合、コンパイラまたはアセンブラを作成するために JVM が必要になりますが、最初のコードがネイティブ コードになった場合、JVM は不要になる可能性があります。もう 1 つの方法は、入力言語を受け取り、それをネイティブの機械語に変換するトランスレーターを作成して、言語 A でプログラムを作成し、それを言語 B にコンパイルしてから機械語コードにコンパイルすることです。マイクロコントローラーの世界では、これをよく見かけます。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。誰かが Basic または Java でプログラムを書きたいと思っているので、Basic/Java コンパイラを書いて、既存の C コンパイラ用の C コードを生成します。次に、結果の C コードは、ネイティブの Basic/Java コンパイラを提供する機械語にコンパイルされます。通常、このアプローチは、Basic/Java コンパイラをマシン コードで直接記述するよりも簡単です。

何年も前に、6800 および Z80 マイクロのアセンブリ コードを生成する BasicA および GWBasic プログラムを作成しました。私のポイントは、出力が入力またはターゲットと同じものである必要はないということです。IE Java で JVM を作成しているからといって、最終結果を Java JVM で実行する必要があるわけではありません。

于 2012-08-08T16:34:15.897 に答える
0

これは、自己ホスト型 VM のブートストラップに関する優れた論文です。Java ではなく JavaScript ですが、原則は同じです。

JavaScript 用の自己ホスト型研究用仮想マシンのブートストラップ: 経験レポート

セルフホスト コンパイラのブートストラップとセルフホスト VM のブートストラップは多少似ていますが、まったく同じ問題が発生するわけではないと思います。

于 2012-08-08T18:42:03.937 に答える
0

それはちょっと「whooaaa男、どうやってそれがうまくいくのですか???」です。-しかし、あなたは「セルフホスティング」として知られる現象について説明していると思います:

言語 (またはツールチェーン/プラットフォーム) は、セルフホスティングとして開始するのではなく、既存のプラットフォーム上に構築された状態から始まります。ある時点で、言語自体が構文を理解するプログラムを作成できるほど十分に機能するようになります。たまたま書き込まれています。

古典的な AWK ブックには、他の AWK プログラムを解析できる AWK プログラム (必要に応じて縮小版) を紹介している優れた例があります。以下のリンクを参照してください。

本「Beautiful Code」には、Javascript を解析できる Javascript プログラムを含む別の例があります。

これについて覚えておくべきことは、Javaバイトコードを実行できるJavaで書かれたJVMを(たとえば)持っている場合:Java JVM自体を実行するJVMをネイティブにホストする必要がある(おそらく、このJVMは'Cで書かれた' その後、マシン コードにコンパイルされます) : これは、最終的に自己ホスト型プログラムのいずれの場合にも当てはまります - どこかで。

これで謎が解けました - ある時点で、すべての下でネイティブのマシンコード プログラムが実行されているからです。

それは、英語そのものを使って英語などの言語を説明できるのと同じようなものです....多分...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/セルフホスティング

于 2010-02-17T09:05:13.087 に答える