Говоря теоретически, могу ли я получить openJDK JIT и скомпилировать свой Java-код в native? - PullRequest
8 голосов
/ 15 февраля 2011

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

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

PS Я знаю о gcj компилятор это что делает?

Ответы [ 4 ]

3 голосов
/ 15 февраля 2011

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

1 голос
/ 15 февраля 2011

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

#include <iostream>
using namespace std;

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

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

#include <iostream>
using namespace std;

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

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

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

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

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

1 голос
/ 15 февраля 2011

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

0 голосов
/ 15 февраля 2011

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

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

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

...