Java-Compiler zum erzeugen von Maschinencode erzeugt

5 Antworten

Ja, es ist möglich.

Allerdings dürfte in einem solchen Projekt ziemlich viel Arbeit stecken - Compiler-Bau ist eine eigene Wissenschaft, da gibt es an der Uni extra Vorlesungen dazu!

Der Standard-Java-Compiler erzeugt Bytecode, der von der Java Virtual Machine zur Laufzeit in Maschinencode umgewandelt und ausgeführt wird.

bla10000 
Fragesteller
 03.01.2014, 00:20

Ah ok. Danke für die schnelle Antwort!

0

Ja, ist möglich. Ich bin als Informatiktrainer gerade dabei, mit einem Schüler in seiner Individuellen Praxisarbeit (IPA) zu helfen, einen Compiler in C# für eine von ihm entwickelte Sprache in die Sprache Redcode (und Redcode ist ein Maschinencode, wenn auch nur ein virtueller) zu schreiben.

Theoretisch kannst Du in jeder universellen Sprache (Python, BASH, Java, BASIC, C#,...) einen Compiler schreiben, der jede andere Sprache in einen eigene Code übersetzt (sofern die Aktionen in beiden Sprachen möglich sind). Ein Informatik-Studienkollege hatte damals (1993) einen Compiler geschrieben, der PL/1 in PL/1 so übersetzte, dass keine GOTO mehr vorkommen.

Wenn das Projekt groß wird (also nicht nur +. -. *. /. Zahlenliterale und Variable), würde ich aber eher Bison/Flex oder CoCo anstelle von Java verwenden. CoCo ist nicht mehr so populär, jedoch sein Erfinder (Hr. Mössenböck) war damals mein Professor in Algrorithmen und Datenstrukturen :-)

Es gibt Java-Compiler, die das tun.

Zu beachten ist jedoch, dass es dazu zwei Möglichkeiten gibt:

  1. Der Compiler verpackt das Programm nur und lässt es dann eine JVM erzeugen, das ist bequem, aber nicht wirklich hilfreich und recht fehleranfällig.
  2. Der Compiler übersetzt ALLE benutzten Javaklassen in Maschinencode und integriert sie in das Programm oder eine DLL, die teile die auf dynamische Bindung aufbauen funktionieren dann oft nicht mehr.

Fakt ist: Zu versuchen, ein Java-Programm nativ zu kompilieren ist eine sehr schlechte Idee.

martin7812  03.01.2014, 08:19

Zu Punkt 2 gibt es zwei "Untermöglichkeiten":

2a) Java-Programme werden direkt nach Assembler (oder gleich Maschinencode) umgesetzt.

2b) Java-Programme werden normal compiliert und dann der Java-Bytecode in Assembler umgewandelt.

Zu versuchen, ein Java-Programm nativ zu kompilieren ist eine sehr schlechte Idee.

Wenn man sich auf bestimmte Klassen beschränkt, die man als C-Code vorliegen hat, nicht!

1
PerfectMuffin  03.01.2014, 09:06
@martin7812

Wenn du zum Beispiel einen Socket erzeugst und dann das Programm vollständig kompilierst, müssen noch etliche Klassen mitkompiliert werden.

die man als C-Code vorliegen hat

  1. Seit wann gibt es in C Klassen? 2.Welchen Sinn hat es, überhaupt ein Programm in Java zu schreiben, wenn man es doch als C-Code hat?
0
martin7812  03.01.2014, 10:41
@PerfectMuffin

Natürlich kann man auch in C objektorientiert mit Klassen und Objekten programmieren, wenn man die Objekte und Klassen mit speziellen Strukturen simuliert.

Für mein aktuelles Projekt, wo ich eine zu meinem C++-Compiler inkompatible C++-Bibliothek aufrufen muss, muss ich dies sogar machen. Zugegebenermaßen wird der Code durch die Strukturen extrem unübersichtlich.

Ob die Klassen als C-, C++- oder Assembler-Code vorliegen, ist jedoch eigentlich egal. Wichtig ist, dass alle Methoden, die im Programm verwendet werden, als nativer Code vorliegen.

0
martin7812  03.01.2014, 10:50
@PerfectMuffin

... und zu 2:

Mit "als C-Code vorliegen hat" meinte ich nicht Klassen, die man als Java-Quellcode vorliegen hat und compilieren will, sondern diejenigen Klassen, die zur Virtual Machine dazugehören (also z.B. java.lang.*).

Wenn man aus einem Java-Programm eine .EXE-Datei (oder für welches OS auch immer man das machen will) erzeugen will, so müssen natürlich auch diese Klassen (java.lang.*...) als nativer Code vorliegen.

Alle diese Klassen müsste man selbst implementieren, wenn man so einen Compiler (Java -> nativer Code) schreiben möchte. Mit "als C-Code vorliegen hat" wollte ich sagen, dass man hier nur eine Teilmenge implementieren muss, wenn man sich darauf beschränkt, im Java-Programm die fehlenden Klassen nicht zu verwenden.

0

Ja aber eines der besten Fetures von Java ist die Platformunabhängigkeit der dabei verloren geht

Greif lieber zu C++ oder D wenn du Maschienencode haben willst

Jeder Compiler übersetzt die verwendete Sprache in Maschinencode! Das ist ja der zweck eines Compilers!

juliaw94  03.01.2014, 00:10

Die Aussage ist in dieser allgemeinen Fassung falsch ("Jeder Compiler...").

Java wird in einen plattform-unabhängigen Bytecode übersetzt, der erst von der Java Virtual Machine zur Laufzeit in Maschinencode übersetzt und ausgeführt wird.

1
Seruste  03.01.2014, 00:16
@juliaw94

Ja klar, das ist ja auch einer der Vorteilen bei sprachen wie Java. Meine Aussage war ein bisschen zu allgemein formuliert.. Danke für die anmerkung!

0
bla10000 
Fragesteller
 03.01.2014, 00:11

Ist es möglich einen Compiler zu schreiben?

0
martin7812  03.01.2014, 08:25
@bla10000

Du willst einen eigenen Compiler schreiben?

Ich selbst habe öfters Pascal-Compiler geschrieben, wenn ich einen Computer hatte, zu dem ich keinen Compiler hatte (z.B. kleinere Microcontroller, die man laut Hersteller nur in Assembler programmieren kann).

Pascal-Compiler lassen sich sehr leicht schreiben, da die Sprache wesentlich einfacher aufgebaut ist als Java.

Vor einem Monat habe ich einen C-Compiler für ein entsprechendes System gebraucht und mir einen C-Compiler für das System geschrieben. Das hat schon wesentlich länger gedauert (zwei Wochen).

Einen Java-Compiler stelle ich mir extrem schwer vor, da es hier einige Features gibt, die C nicht hat.

Die Variante Bytecode zu Assembler ist sicherlich einfacher als Java-Quelltext zu Assembler. Ein Hauptproblem wird das dynamische Speichermanagement bei Java sein.

0