Я хотел бы скомпилировать Java в Javascript с помощью LLVM следующим образом:
- *.java в *.class через Oracle javac
- *.class в *.bc, через vmjc vmkit
- *.bc в *.html с JS, через emcc emscripten
Созданный файл HTML/JS (размером около 170 КБ) при открытии печатает 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? Почему моя строка «hello world» не отображается в коде *.ll
и является ли это проблемой?