Компилятор для перевода Java-байт-кода в независящий от платформы код C перед выполнением? - PullRequest
6 голосов
/ 21 декабря 2009

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

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

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

Ответы [ 7 ]

8 голосов
/ 12 февраля 2010

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

3 голосов
/ 21 декабря 2009

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

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

3 голосов
/ 21 декабря 2009

Зачем это? Виртуальная машина Java включает исполняющий компилятор Java-сборки.

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

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

    Лицензия мне неясна.

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

    Бумага, не уверен, что программа доступна.

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

1 голос
/ 30 декабря 2009

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

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

1 голос
/ 21 декабря 2009

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

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

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

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

0 голосов
/ 22 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...