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

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

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

Таким образом, какой Java к компиляторам C доступен?

6
задан Rudiger 21 December 2009 в 16:49
поделиться

6 ответов

Я думаю, массив против объекта является ложной дихотомией.

Совершенно разумно, когда вызов API возвращает несколько вещей, что он в форме массива (а массив является довольно простым объектом, и поэтому, возможно, «PORO», в Ruby в любом случае)

Изменить: в ответ на ваши комментарии:

Приведенный пример ( http://github.com/cjheath/geoip ) возвращает массив различных предметов. Я согласен, что это не обязательно лучший формат для возврата данных в. В таком случае я бы подумал, что хеш с разумно названными ключами будет лучшей структурой.

Как говорит Джон Топли, OO природа Ruby означает, что люди не должны изобретать такую терминологию, как «PORO», так как хеш довольно прост, как вы можете получить.

-121--3357731-

Вы должны явно передать его в конструкторе, что не является вещью, что обычно делается.

Вы уверены, что хотите внести эти вещи в форму? Что именно вы хотели бы там сделать? Недостаточно ли повышения ValidationError ?

-121--5086046-

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

8
ответ дан 8 December 2019 в 13:00
поделиться

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

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

3
ответ дан 8 December 2019 в 13:00
поделиться

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

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

3
ответ дан 8 December 2019 в 13:00
поделиться

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

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

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

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

1
ответ дан 8 December 2019 в 13:00
поделиться

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

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

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

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

.
0
ответ дан 8 December 2019 в 13:00
поделиться

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

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

1
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: