次のように、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」文字列がコードに表示されないのはなぜですか? それは問題ですか?