Компилятор для перевода байт-кода Java в независимый от платформы код C перед выполнением?

Я ищу компилятор для перевода байт-кода Java на независимый от платформы код C до выполнения (компиляция впереди времени).

затем я смогу использовать стандартный компилятор C для компиляции кода C в исполняемый файл для целевой платформы. Я понимаю, что этот способ подходит только для некоторых Java-приложений, которые изменяются нечасто.

Итак, какие компиляторы Java-to-C доступны?

7 ответов


Я мог бы предложить инструмент под названием JCGO который является источником Java для переводчика C. Если вам нужно преобразовать байт-код, вы можете декомпилировать файлы классов с помощью какого-либо инструмента (например, JadRetro+Jad) и передать исходные файлы в JCGO. Инструмент переводит все классы вашей программы java сразу и создает файлы C (один.с и. h для каждого класса), которые могут быть скомпилированы (сторонними инструментами) в высоко оптимизированный собственный код для целевой платформы. Java generics не является пока поддерживается. Поддерживаются AWT / Swing и SWT.


Почему это? Виртуальная машина Java включает компилятор Java-to-assembly среды выполнения.

компиляция во время выполнения может дать лучшую производительность, так как вся информация о значениях времени выполнения доступна. В то время как заблаговременная компиляция должна принимать предположения о значениях времени выполнения и, следовательно, может испускать менее быстрый код. Пожалуйста, обратитесь к производительность Java vs C Клифф Нажмите для получения более подробной информации.


GCJ имеет эту возможность, но у него нет большой поддержки функций Java за 1.4, и поддержка Swing, вероятно, будет хлопотной. На практике, однако, компилятор HotSpot JIT бьет все компиляторы опережающего времени для Java. См.критерии от Excelsior JET. чтобы уточнить: GCJ преобразует источник/байт-код java в скомпилированный код

Тоба преобразует (старый) байт-код Java в источник C. Однако он не обновлялся с Java 1.1. Может быть полезно частично облегчить перенос, но он просто не может обрабатывать все сложные библиотеки Java.


  • https://github.com/badlogic/jack -- Java для транспилера c++, игнорирует модель памяти и другие вещи, использует Boehm GC для дополнительной медлительности и пауз GC

    лицензия мне непонятна.

  • http://ptolemy.eecs.berkeley.edu/publications/papers/03/java-2-C/ -- перестраиваемый оптимизирующий компилятор Java-to-C для встроенных систем

    документ, не уверен, является ли программа доступный.

(я гуглил для этого материала, вот как я пришел к этому вопросу в SO.)


AFAIK, нет такого продукта, но у вас есть два варианта:

  • реализуйте свой собственный байт-код в C transpiler. байт-код довольно просто, это не слишком сложно.

  • Если вы просто хотите собственный двоичный файл (т. е. когда вам не нужен исходный код C), то дайте GCJ попробовать.

Примечание: Если вы делаете это из соображений производительности, то вы будете разочарованы. Java-это как правило, так же быстро, как C и C++. Кроме того, улучшения виртуальной машины сделают весь код Java быстрее, но не ваш собственный двоичный файл. Компиляция кода просто даст вам немного лучшее время запуска.


не совсем ответ на мой собственный вопрос,но как это делает Oracle?

http://download.oracle.com/docs/cd/B28359_01/java.111/b31225/chone.htm#BABCIHGA


раньше был продукт под названием TowerJ, который был по существу статическим компилятором "via C" для Java, но он давно ушел.

Мне сказали, что Sun Labs создала что-то вроде этого в рамках проекта Sun SPOT, но я не уверен, что это публично.

@BobMcGee: в тестах, на которые вы ссылаетесь, GCJ действительно проигрывает, но Excelsior JET (который является 32-битным компилятором AOT) бьет 32-битную точку доступа на всех трех тест-системах, поэтому я не уверен, что был ваши очки.

но, в конце концов, есть ложь, есть наглая ложь, и критерии. :)