3

次のように、LLVM を使用して Java を Javascript にコンパイルしたいと思います。

  • *.java から *.class へ、Oracle の javac 経由
  • *.class から *.bc へ、vmkit の vmjc 経由
  • emscripten の emcc を介して、JS で *.bc から *.html へ

作成された HTML/JS ファイル (約 170 KB の大きさ) をReferenceError: _StartJnjvmWithoutJIT is not defined開くと、ブラウザー コンソールに出力されます。これをデバッグしようとすると、*.bc ファイル (LLVM IR) にコードが含まれていないように見えることに気付きました。つまり、印刷している文字列が含まれていません。

私がしたこと:

vmjc -disable-opt -main=MyTest MyTest.class

Java 6 または 7 のどちらを使用していても、出力されます。

WARNING: Class file 'java/lang/VMString' requires Java version 1.7. This JVM only supports Java versions up to 1.6.

*.bcとにかくファイルを作成します。それを非バイナリ ( *.ll) に変換すると、印刷した文字列が表示されると予想していたファイルが表示されますが、表示されません。ただし、次のような文字列MyTest_mainがそこに表示されます。

llvm-dis MyTest.class.bc

それで、このアプローチはまったく実行可能ですか?Java のバージョンに関する警告は何を意味していますか? *.ll「hello world」文字列がコードに表示されないのはなぜですか? それは問題ですか?

4

2 に答える 2

-2

Java と JavaScript は 2 つの異なる言語です。クロスコンパイルはトリッキーで、ほとんどの場合、ぎこちないコードになります。

個人的には、Typescript でコア ロジックを手動で再実装することをお勧めします。これは、従来の OO (オブジェクト指向) 開発とタイプ セーフをサポートするためです。この方法でコードを変換するには時間がかかりますが、比較的簡単です。

あるいは、ネイティブ JavaScript での OO スタイルのプログラミングも可能です。しかし、型保存が欠けているため、この方法での開発は困難です。 http://addyosmani.com/resources/essentialjsdesignpatterns/book/

于 2014-02-02T11:32:35.007 に答える