Theoretisch kann ich den openJDK JIT bekommen und meinen Java-Code zu nativen kompilieren?

8

Ich frage mich nur, wie kann ich die java jre-Abhängigkeit loswerden und nativen Code erzeugen und den kompilierten Code als Anwendung liefern?

So ist es möglich?

P.S. Ich weiß über gcj Compiler ist es was es tut?

    
user63898 15.02.2011, 08:51
quelle

4 Antworten

1
___ answer5001711 ___

Theoretisch ist es möglich, einen Interpreter für eine Sprache zu verwenden und ihn in einen Compiler umzuwandeln, der nativen Code in dieser Sprache erzeugt. Dies hängt mit einer Reihe von Gleichungen zusammen, die als Futamura-Projektionen bezeichnet werden. Die High-Level-Idee besteht im Wesentlichen darin, die Definition eines Compilers zu "hintergehen". Nehmen wir an, dass ich für eine Sprache L einen Interpreter I (p) habe, der bei einem in der Sprache L geschriebenen Programm p dieses Programm interpretiert. Nun gehe ich davon aus, dass der Interpreter I direkt im Maschinencode dargestellt wird. Angenommen, ich habe ein Programm namens %code% , das bei einem Maschinencode-Programm und einer Eingabefolge für dieses Programm ein neues Maschinencode-Programm erzeugt, das das ursprüngliche Programm ist, dessen Eingabe fest auf die angegebene Eingabe festgelegt ist. Zum Beispiel, wenn ich dieses C ++ - Programm kompiliert habe:

%Vor%

Und dann verwendet %code% , um das Programm mit der Eingabe "Hallo" zu mischen, würde ich ein Programm bekommen, das immer die Nachricht "Hallo" ausgibt. Mit anderen Worten, es wäre so, als hätte ich dieses Programm geschrieben:

%Vor%

Es stellt sich heraus, dass es möglich ist, dieses Programm zu erstellen. Ich könnte dies zum Beispiel tun, indem ich den Maschinencode betrachte, jeden Ort betrachte, an dem Sie versuchen, Eingaben von der Konsole zu lesen, und diesen dann durch Code ersetzen, der eine Funktion aufruft, um stattdessen von einer fest codierten Zeichenkette zu lesen.

>

Nun überlegen Sie, was passieren würde, wenn Sie dieses Programm %code% ausführen würden, indem Sie einen Interpreter I und ein Programm p als Eingabe nehmen. Dann wäre das Ergebnis ein Maschinencode-Programm, das dem Programm entspricht, das ich auf der Eingabe p ausgeführt habe. Mit anderen Worten, Sie haben gerade ein Maschinencode-Programm erstellt, das simuliert, was passieren würde, wenn Sie den Interpreter auf dem Programm ausführen würden - das ist ein Maschinencode-Programm, das das Programm p ausführt!

Natürlich ist diese Konstruktion völlig unpraktisch. Nach meinem besten Wissen hat niemand %code% geschrieben, und wenn sie das getan hätten, wäre jedes Programm, das Sie gemacht haben, indem Sie einen Interpreter in einen Compiler verwandelt haben, ineffizient, weil es überhaupt nicht optimiert wäre.

Was Ihre ursprüngliche Frage betrifft, ob Sie das JVM-JIT verwenden und es verwenden könnten, um rohen Maschinencode für ein Java-Programm zu erzeugen, bin ich nicht sicher, da ich den Quellcode nicht angeschaut habe, aber ich bezweifle es stark . Der Maschinencode enthält fast sicher Hooks, die für bestimmte Aufgaben (z. B. Garbage Collection, Klassenladen usw.) in die JVM zurückrufen, wodurch der generierte Code in einer Standalone-Umgebung nicht funktioniert. Es ist jedoch eine wirklich coole Idee, dies zu versuchen, und ich hoffe, dass diese Antwort ein wenig Licht auf die Theorie dahinter wirft!

    
___ qstnhdr ___ Theoretisch kann ich den openJDK JIT bekommen und meinen Java-Code zu nativen kompilieren? ___ antwort5001587 ___

Excelsior hat einen sehr guten Java2Native Compiler. Ich würde es gerne verwenden, aber leider dauert unser Projekt 8 Stunden, um mit diesem Compiler zu kompilieren. Die daraus resultierende Geschwindigkeit der App ist beeindruckend.

    
___ qstntxt ___

Ich frage mich nur, wie kann ich die java jre-Abhängigkeit loswerden und nativen Code erzeugen und den kompilierten Code als Anwendung liefern?

So ist es möglich?

P.S. Ich weiß über gcj Compiler ist es was es tut?

    
___ antwort5001568 ___

Der kompilierte Bytecode hängt immer noch von der Java Virtual Machine ab. Ein JIT kann keinen außerhalb des JVM-Containers "sinnvollen" Code erstellen. Ja, das Ergebnis ist eine Menge gültiger Anweisungen für die Zielplattform. Aber Sie brauchen immer noch den eigentlichen Stack, Heap und Garbage Collector (um nur einige der benötigten Bausteine ​​zu nennen).

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123jit ___ Just-In-Time-Compilierung (JIT) ist eine Technik, die verwendet wird, um die Leistung von interpretiertem Code zu verbessern, indem sie in Maschinencode übersetzt wird. ___ answer5001719 ___

Bitte beachten Sie, dass diese Frage ähnlich ist "Kann ich Windows loswerden und mein Windows-Programm ohne Betriebssystem auf dem Bare-Metal laufen lassen?"

Java-Programme erwarten, dass eine große Menge von Klassen verfügbar ist, was die JRE bietet und die jeder Compiler oder Emulator ebenfalls bereitstellen muss.

Was Sie können tun, ist jedoch, einen Launcher anzuschauen, mit dem Sie Ihre eigene JRE mit Ihrer Anwendung bringen können - das wird nur auf der Plattform der JRE funktionieren, aber Sie sind bereits bereit plattformspezifisch sein. Mehrere existieren - ich ermutige Sie, die vielen Fragen bereits auf Stack Overflow zu sehen, wie das geht.

    
___ tag123nativecode ___ Maschinencode und Assemblercode wird manchmal als systemeigener Code bezeichnet, wenn auf plattformabhängige Teile von Sprachfeatures oder Bibliotheken Bezug genommen wird. ___
Daniel 15.02.2011, 09:04
quelle
3
___ answer5001711 ___

Theoretisch ist es möglich, einen Interpreter für eine Sprache zu verwenden und ihn in einen Compiler umzuwandeln, der nativen Code in dieser Sprache erzeugt. Dies hängt mit einer Reihe von Gleichungen zusammen, die als Futamura-Projektionen bezeichnet werden. Die High-Level-Idee besteht im Wesentlichen darin, die Definition eines Compilers zu "hintergehen". Nehmen wir an, dass ich für eine Sprache L einen Interpreter I (p) habe, der bei einem in der Sprache L geschriebenen Programm p dieses Programm interpretiert. Nun gehe ich davon aus, dass der Interpreter I direkt im Maschinencode dargestellt wird. Angenommen, ich habe ein Programm namens %code% , das bei einem Maschinencode-Programm und einer Eingabefolge für dieses Programm ein neues Maschinencode-Programm erzeugt, das das ursprüngliche Programm ist, dessen Eingabe fest auf die angegebene Eingabe festgelegt ist. Zum Beispiel, wenn ich dieses C ++ - Programm kompiliert habe:

%Vor%

Und dann verwendet %code% , um das Programm mit der Eingabe "Hallo" zu mischen, würde ich ein Programm bekommen, das immer die Nachricht "Hallo" ausgibt. Mit anderen Worten, es wäre so, als hätte ich dieses Programm geschrieben:

%Vor%

Es stellt sich heraus, dass es möglich ist, dieses Programm zu erstellen. Ich könnte dies zum Beispiel tun, indem ich den Maschinencode betrachte, jeden Ort betrachte, an dem Sie versuchen, Eingaben von der Konsole zu lesen, und diesen dann durch Code ersetzen, der eine Funktion aufruft, um stattdessen von einer fest codierten Zeichenkette zu lesen.

>

Nun überlegen Sie, was passieren würde, wenn Sie dieses Programm %code% ausführen würden, indem Sie einen Interpreter I und ein Programm p als Eingabe nehmen. Dann wäre das Ergebnis ein Maschinencode-Programm, das dem Programm entspricht, das ich auf der Eingabe p ausgeführt habe. Mit anderen Worten, Sie haben gerade ein Maschinencode-Programm erstellt, das simuliert, was passieren würde, wenn Sie den Interpreter auf dem Programm ausführen würden - das ist ein Maschinencode-Programm, das das Programm p ausführt!

Natürlich ist diese Konstruktion völlig unpraktisch. Nach meinem besten Wissen hat niemand %code% geschrieben, und wenn sie das getan hätten, wäre jedes Programm, das Sie gemacht haben, indem Sie einen Interpreter in einen Compiler verwandelt haben, ineffizient, weil es überhaupt nicht optimiert wäre.

Was Ihre ursprüngliche Frage betrifft, ob Sie das JVM-JIT verwenden und es verwenden könnten, um rohen Maschinencode für ein Java-Programm zu erzeugen, bin ich nicht sicher, da ich den Quellcode nicht angeschaut habe, aber ich bezweifle es stark . Der Maschinencode enthält fast sicher Hooks, die für bestimmte Aufgaben (z. B. Garbage Collection, Klassenladen usw.) in die JVM zurückrufen, wodurch der generierte Code in einer Standalone-Umgebung nicht funktioniert. Es ist jedoch eine wirklich coole Idee, dies zu versuchen, und ich hoffe, dass diese Antwort ein wenig Licht auf die Theorie dahinter wirft!

    
___ qstnhdr ___ Theoretisch kann ich den openJDK JIT bekommen und meinen Java-Code zu nativen kompilieren? ___ antwort5001587 ___

Excelsior hat einen sehr guten Java2Native Compiler. Ich würde es gerne verwenden, aber leider dauert unser Projekt 8 Stunden, um mit diesem Compiler zu kompilieren. Die daraus resultierende Geschwindigkeit der App ist beeindruckend.

    
___ qstntxt ___

Ich frage mich nur, wie kann ich die java jre-Abhängigkeit loswerden und nativen Code erzeugen und den kompilierten Code als Anwendung liefern?

So ist es möglich?

P.S. Ich weiß über gcj Compiler ist es was es tut?

    
___ antwort5001568 ___

Der kompilierte Bytecode hängt immer noch von der Java Virtual Machine ab. Ein JIT kann keinen außerhalb des JVM-Containers "sinnvollen" Code erstellen. Ja, das Ergebnis ist eine Menge gültiger Anweisungen für die Zielplattform. Aber Sie brauchen immer noch den eigentlichen Stack, Heap und Garbage Collector (um nur einige der benötigten Bausteine ​​zu nennen).

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123jit ___ Just-In-Time-Compilierung (JIT) ist eine Technik, die verwendet wird, um die Leistung von interpretiertem Code zu verbessern, indem sie in Maschinencode übersetzt wird. ___ answer5001719 ___

Bitte beachten Sie, dass diese Frage ähnlich ist "Kann ich Windows loswerden und mein Windows-Programm ohne Betriebssystem auf dem Bare-Metal laufen lassen?"

Java-Programme erwarten, dass eine große Menge von Klassen verfügbar ist, was die JRE bietet und die jeder Compiler oder Emulator ebenfalls bereitstellen muss.

Was Sie können tun, ist jedoch, einen Launcher anzuschauen, mit dem Sie Ihre eigene JRE mit Ihrer Anwendung bringen können - das wird nur auf der Plattform der JRE funktionieren, aber Sie sind bereits bereit plattformspezifisch sein. Mehrere existieren - ich ermutige Sie, die vielen Fragen bereits auf Stack Overflow zu sehen, wie das geht.

    
___ tag123nativecode ___ Maschinencode und Assemblercode wird manchmal als systemeigener Code bezeichnet, wenn auf plattformabhängige Teile von Sprachfeatures oder Bibliotheken Bezug genommen wird. ___
Andreas_D 15.02.2011 09:02
quelle
1

Theoretisch ist es möglich, einen Interpreter für eine Sprache zu verwenden und ihn in einen Compiler umzuwandeln, der nativen Code in dieser Sprache erzeugt. Dies hängt mit einer Reihe von Gleichungen zusammen, die als Futamura-Projektionen bezeichnet werden. Die High-Level-Idee besteht im Wesentlichen darin, die Definition eines Compilers zu "hintergehen". Nehmen wir an, dass ich für eine Sprache L einen Interpreter I (p) habe, der bei einem in der Sprache L geschriebenen Programm p dieses Programm interpretiert. Nun gehe ich davon aus, dass der Interpreter I direkt im Maschinencode dargestellt wird. Angenommen, ich habe ein Programm namens mix , das bei einem Maschinencode-Programm und einer Eingabefolge für dieses Programm ein neues Maschinencode-Programm erzeugt, das das ursprüngliche Programm ist, dessen Eingabe fest auf die angegebene Eingabe festgelegt ist. Zum Beispiel, wenn ich dieses C ++ - Programm kompiliert habe:

%Vor%

Und dann verwendet mix , um das Programm mit der Eingabe "Hallo" zu mischen, würde ich ein Programm bekommen, das immer die Nachricht "Hallo" ausgibt. Mit anderen Worten, es wäre so, als hätte ich dieses Programm geschrieben:

%Vor%

Es stellt sich heraus, dass es möglich ist, dieses Programm zu erstellen. Ich könnte dies zum Beispiel tun, indem ich den Maschinencode betrachte, jeden Ort betrachte, an dem Sie versuchen, Eingaben von der Konsole zu lesen, und diesen dann durch Code ersetzen, der eine Funktion aufruft, um stattdessen von einer fest codierten Zeichenkette zu lesen.

>

Nun überlegen Sie, was passieren würde, wenn Sie dieses Programm mix ausführen würden, indem Sie einen Interpreter I und ein Programm p als Eingabe nehmen. Dann wäre das Ergebnis ein Maschinencode-Programm, das dem Programm entspricht, das ich auf der Eingabe p ausgeführt habe. Mit anderen Worten, Sie haben gerade ein Maschinencode-Programm erstellt, das simuliert, was passieren würde, wenn Sie den Interpreter auf dem Programm ausführen würden - das ist ein Maschinencode-Programm, das das Programm p ausführt!

Natürlich ist diese Konstruktion völlig unpraktisch. Nach meinem besten Wissen hat niemand mix geschrieben, und wenn sie das getan hätten, wäre jedes Programm, das Sie gemacht haben, indem Sie einen Interpreter in einen Compiler verwandelt haben, ineffizient, weil es überhaupt nicht optimiert wäre.

Was Ihre ursprüngliche Frage betrifft, ob Sie das JVM-JIT verwenden und es verwenden könnten, um rohen Maschinencode für ein Java-Programm zu erzeugen, bin ich nicht sicher, da ich den Quellcode nicht angeschaut habe, aber ich bezweifle es stark . Der Maschinencode enthält fast sicher Hooks, die für bestimmte Aufgaben (z. B. Garbage Collection, Klassenladen usw.) in die JVM zurückrufen, wodurch der generierte Code in einer Standalone-Umgebung nicht funktioniert. Es ist jedoch eine wirklich coole Idee, dies zu versuchen, und ich hoffe, dass diese Antwort ein wenig Licht auf die Theorie dahinter wirft!

    
templatetypedef 15.02.2011 09:17
quelle
0

Bitte beachten Sie, dass diese Frage ähnlich ist "Kann ich Windows loswerden und mein Windows-Programm ohne Betriebssystem auf dem Bare-Metal laufen lassen?"

Java-Programme erwarten, dass eine große Menge von Klassen verfügbar ist, was die JRE bietet und die jeder Compiler oder Emulator ebenfalls bereitstellen muss.

Was Sie können tun, ist jedoch, einen Launcher anzuschauen, mit dem Sie Ihre eigene JRE mit Ihrer Anwendung bringen können - das wird nur auf der Plattform der JRE funktionieren, aber Sie sind bereits bereit plattformspezifisch sein. Mehrere existieren - ich ermutige Sie, die vielen Fragen bereits auf Stack Overflow zu sehen, wie das geht.

    
quelle

Tags und Links