LLVM: не удается заставить vmjc работать

Я хотел бы скомпилировать 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 и является ли это проблемой?


person Daniel Naber    schedule 11.11.2013    source источник


Ответы (2)


Вы можете сократить маршрут, используя GWT для компиляции Java непосредственно в JavaScript.

person Dr. Max Völkel    schedule 01.02.2014
comment
Вы действительно пробовали это, то есть компилировать любой код Java (не только код GUI для Интернета) в Javascript с использованием GWT? - person Daniel Naber; 02.02.2014
comment
Однажды я использовал среду выполнения Antlr в проекте на основе GWT, и он работал хорошо. Однако компилятору GWT нужен исходный код Java, он не будет работать, если вы только что скомпилировали .class-файлы. Кроме того, GWT (полностью) не поддерживает все классы, предоставляемые средой выполнения Java: например, вы не можете использовать AWT или Swing, некоторые классы, связанные с вводом-выводом (например, java.io.File), не поддерживаются, а иногда и не поддерживаются. доступны все методы класса (например, в GWT нет поддержки Collections.shuffle()). - person sschwieb; 02.02.2014
comment
@Daniel: сам компилятор GWT вообще не связан с графическим интерфейсом. Да, вы можете только напрямую преобразовывать исходные коды Java. В результате получается хорошо оптимизированный код JavaScript. Интеграция с существующим JavaScript все еще немного неуклюжа. И да, многие Java-библиотеки недоступны (особенно те, которые не имеют эквивалента в мире браузеров, такие как файлы, потоки, потоки и т. д.). Вот список того, что поддерживается: gwtproject.org/doc/latest/RefJreEmulation.html. - person Dr. Max Völkel; 02.02.2014

Java и JavaScript — два разных языка. Кросс-компиляция сложна и в основном приводит к неуклюжему коду.

Лично я рекомендую ручную повторную реализацию основной логики в Typescript, потому что он поддерживает классическую объектно-ориентированную разработку и безопасность типов. Перевод кода таким образом занимает много времени, но относительно прост.

В качестве альтернативы возможно программирование в стиле объектно-ориентированного программирования на собственном JavaScript. Но так как в нем нет сохранения типов, разработка таким способом сложнее. http://addyosmani.com/resources/essentialjsdesignpatterns/book/

person MovGP0    schedule 02.02.2014