-1

重複の可能性:
JVM 上で C を実行/解釈していますか?

ハイブリッド言語とは、ハイブリッド コンパイラ (Java など) によってコンパイルされた言語を意味します。C は機械語命令に簡単にマップできるように設計されているため、実行不可能であることは理解していますが、ハイブリッド コンパイラを作成できない理由があるかどうかはわかりません。

4

2 に答える 2

0

C を実行するために設計されたカスタム仮想マシンを作成することはもちろん機能し、非常にうまく機能します。多くのバイト コード命令を実際の CPU 命令に 1 対 1 でマッピングし、結果として簡単かつ高速なJITも実行します。実際、たとえばLLVMは実際にはこれに非常によく似ています。

JVM を対象とする C コンパイラを実行するには、おそらく C ヒープを Java の byte[] 配列にする必要があり、ポインタはこの配列へのインデックスになります。また、スタック内の C 変数は、シミュレートされた byte[] スタックでも実行する必要がある場合があります。これは、それらへのポインターを取得できる必要があるためです (ヒープ ポインターと互換性があります)。

これが必要になるのは、Java の直接参照では、C でポインター演算と整数ポインターのキャストを行うことが不可能になるためです。これを最適化する 1 つのオプションは、C char を 32 ビットにすることです。その C 実装は、たとえばテキスト ファイル、または実際にバイト データを含むものを処理するために使用するのが非常に厄介になります...とにかく、Java バイト コードは多くの C のことを「ネイティブに」実行できないため、Java バイトコードにコンパイルされた C は非常に遅くなります。シングルバイトコード命令で。

于 2013-01-25T07:57:18.677 に答える
0

C コンパイラは、多くのアーキテクチャ用に存在します。Java が使用するバイトコードは、おそらく単に命令セットが 1 つ増えただけと見なすことができるのに、なぜそれが可能ではないのでしょうか? おそらく、ポインターは「実際のポインター」ではなく、一部の内部 VM 参照です。

以前は axiomsol が提供する商用コンパイラでしたが、現在はすべてのリンクが死んでいるように見えます (404)。

C を Java コードにコンパイルしてから Java をコンパイルすることは可能ですが、多くの考えは、最適ではない方法で実際に解決されているようです。byte[] では、整数を一度に読み取ることさえできません。C はおそらく、より単純な独自の仮想マシンの恩恵を受けるでしょう (ガベージ コレクターが不要なため)。または、少なくとも、C をバイトコードに直接コンパイルする必要があります。C をよく知っている人なら、JamVMプロジェクトを調査して、興味深いスタートを切ることができるかもしれません。Java バイトコードを実行するシンプルな仮想マシンです。

于 2013-01-25T07:29:36.377 に答える