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

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

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

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

4 ответов


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


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


теоретически можно взять любой интерпретатор для языка и превратить его в компилятор, который производит собственный код на этом языке. Это связано с рядом уравнений, называемых прогнозы Futamura. Идея высокого уровня заключается в том, чтобы "обмануть", как вы определяете компилятор. Предположим, что для некоторого языка 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". Другими словами, как будто я написал эту программу:--9-->

#include <iostream>
using namespace std;

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

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

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

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

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


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

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

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