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.
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!
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.
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?
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).
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.
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!
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.
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?
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).
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.
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:
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:
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!
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.
Tags und Links java jit native-code