Теоретически, могу ли я получить openJDK JIT и скомпилировать свой java-код в родной?

Мне просто интересно, как я могу избавиться от зависимости java jre и создать собственный код и доставить скомпилированный код в качестве приложения?

Так возможно ли?

P.S. Я знаю о компиляторе gcj, что он делает?


person user63898    schedule 15.02.2011    source источник
comment
Вам нужно использовать конструкцию Class.forName()?   -  person Thorbjørn Ravn Andersen    schedule 15.02.2011
comment
Вы можете доставить скомпилированный код, и он будет работать в любой системе с установленной правильной версией Java. Независимо от того, как вы это сделаете на любом языке, предполагается, что установлена ​​какая-то ОС/программное обеспечение.   -  person Peter Lawrey    schedule 15.02.2011
comment
Среда выполнения Java может прекрасно обрабатывать Class.forName() в собственном коде путем короткого замыкания на предварительно скомпилированные классы, но, конечно, она также должна включать JIT или интерпретатор для классов, которые не были предварительно скомпилированы (динамические прокси, сторонние плагины, и т.д.)   -  person Dmitry Leskov    schedule 16.02.2011


Ответы (4)


Excelsior имеет очень хороший компилятор Java2Native. Я бы с удовольствием использовал его, но, к сожалению, наш проект компилируется этим компилятором за 8 часов. Результирующая скорость приложения впечатляет.

person Daniel    schedule 15.02.2011
comment
Это действительно проблема? Вы работаете с JDK, но ваши автоматические ночные сборки выходят из компилятора. QA работает с автоматизированными сборками. Должен сказать, что большинство систем, над которыми я работал, были как минимум настолько сложными, что это нормально. - person Bill K; 15.02.2011
comment
Я знаю этот продукт, как, черт возьми, они это делают? - person user63898; 15.02.2011
comment
В настоящее время мы находимся в разработке, и нет этапа контроля качества... commit-2-live часто занимает 15 минут. Однако, если мы достигнем стабильности, Excelsior определенно станет для нас вариантом. - person Daniel; 15.02.2011

Скомпилированный байт-код по-прежнему будет зависеть от виртуальной машины Java. JIT не может создавать код, который «имеет какой-либо смысл» вне контейнера JVM. Да, в результате получается куча валидных инструкций для целевой платформы. Но вам по-прежнему нужны настоящий стек, куча и сборщик мусора (это лишь несколько необходимых строительных блоков).

person Andreas Dolk    schedule 15.02.2011

Теоретически можно взять любой интерпретатор языка и превратить его в компилятор, создающий собственный код на этом языке. Это связано с серией уравнений, называемых проекциями Футамуры. Идея высокого уровня, по сути, состоит в том, чтобы «обмануть» то, как вы определяете компилятор. Предположим, что для некоторого языка L у меня есть интерпретатор I(p), который, имея программу p, написанную на языке L, интерпретирует эту программу. Теперь я предполагаю, что интерпретатор I представлен непосредственно в машинном коде. Далее предположим, что у меня есть программа с именем mix, которая, учитывая программу машинного кода и последовательность ввода в эту программу, создает новую программу машинного кода, которая является исходной программой с фиксированным вводом, который является указанным вводом. Например, если я скомпилировал эту программу на C++:

#include <iostream>
using namespace std;

int main() {
    string message;
    cin >> message;
    cout << message << endl;
}

А затем использовал mix, чтобы смешать программу с вводом «Привет», я получил бы программу, которая всегда выводит сообщение «Привет». Другими словами, это было бы так, как если бы я написал эту программу:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello" << endl;
}

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

Теперь представьте, что произойдет, если вы запустите эту mix программу, принимая в качестве входных данных интерпретатор I и некоторую программу p. Тогда результатом этого будет программа машинного кода, эквивалентная программе, которую я запускаю на входе p. Другими словами, вы только что создали машинную программу, которая имитирует то, что произойдет, если вы запустите интерпретатор программы, которая представляет собой машинную программу, выполняющую программу p!

Конечно, такая конструкция совершенно непрактична. Насколько мне известно, никто не написал mix, а если бы и написал, то любая программа, которую вы создали, превратив интерпретатор в компилятор, была бы прискорбно неэффективной, потому что она вообще не была бы оптимизирована.

Что касается вашего исходного вопроса о том, можете ли вы взять JIT JVM и использовать его для создания необработанного машинного кода для программы Java, я не уверен, так как я не просматривал исходный код, но я сильно сомневаюсь в этом. Машинный код почти наверняка содержит хуки, которые будут вызывать JVM для определенных задач (например, сбор мусора, загрузка классов и т. д.), из-за чего сгенерированный код не будет работать в автономной среде. Тем не менее, попытаться сделать это — действительно крутая идея, и я надеюсь, что этот ответ прольет свет на теорию, стоящую за этим!

person templatetypedef    schedule 15.02.2011

Обратите внимание, что этот вопрос аналогичен вопросу «Могу ли я избавиться от Windows и позволить моей программе Windows работать на «голом железе» без операционной системы»?

Java-программы ожидают, что большой набор классов будет легко доступен, что и предоставляет JRE, и что любой компилятор или эмулятор также должен предоставить.

Что вы, однако, можете сделать, так это взглянуть на средство запуска, которое позволит вам использовать собственную JRE с вашим приложением — это будет работать только на платформе JRE, но вы уже готовы быть платформой. конкретный. Некоторые из них существуют — я призываю вас просмотреть множество вопросов, которые уже есть в Stack Overflow, о том, как это сделать.

person Thorbjørn Ravn Andersen    schedule 15.02.2011
comment
я не хочу использовать обертку liks jsmooth - person user63898; 15.02.2011
comment
@user63898 user63898, в этом случае вам, вероятно, следует перейти на .NET, а не на среду выполнения, встроенную в Windows. - person Thorbjørn Ravn Andersen; 15.02.2011
comment
За исключением того, что Java можно скомпилировать в собственный код. См. комментарий Дэниэлса о самолете Excelsior. - person ; 17.02.2011
comment
@ Дэн, вопрос был в том, можно ли это сделать с OpenJDK. - person Thorbjørn Ravn Andersen; 17.02.2011