Frage

Ich habe kurz darüber gelesen Maxine Dies ist eine Open -Source -JVM -Implementierung, die in Java geschrieben hat. Das klingt für mich kreisförmig. Wenn Java eine virtuelle Maschine benötigt, um zu laufen, wie kann die virtuelle Maschine selbst in Java geschrieben werden (nicht der VM -Code erfordert eine VM, in der er ausgeführt werden muss und so weiter?).

Bearbeiten: Ok, ich sehe, ich habe die Tatsache übersehen, dass Java nicht in einem VM laufen muss. Wie erklärt man dann, wie ein Lisp -Compiler in LISP geschrieben werden kann? Oder sollte dies insgesamt eine neue Frage sein?

War es hilfreich?

Lösung

Ihre Annahme, dass Java eine virtuelle Maschine benötigt ist zunächst falsch mit.

Andere Tipps

Die JVM, die Sie benötigen, um einen in Java geschriebenen JVM zu starten, benötigt wahrscheinlich nicht viele Funktionen (wie Müllsammlung und JIT), könnte sehr einfach sein. Alle fortgeschritteneren Funktionen könnten dann in Java implementiert werden (was genau der Punkt von Maxine zu sein scheint, um mit neuen Ideen in der JVM -Technologie zu experimentieren).

Außerdem enthält Maxine C -Code, von denen ich denke, dass sie eine minimale Laufzeitumgebung ausmacht, mit der der Rest von Maxine in Gang kommt. Ich nehme an, dass die interessanten Bits (JIT -Compiler, Müllsammlung) dann vollständig in Java implementiert werden.

Sehen Bootstrapping.

Java -Code kann direkt in den Maschinencode kompiliert werden, sodass keine virtuelle Maschine benötigt wird.

Ich habe mich letzte Woche Maxine angesehen und habe mich genauso gefragt :)

Vom Maxine Dokumentation:

1 Erstellen des Kofferraumbildes

Lassen Sie uns nun ein [Boot -Image] erstellen. In diesem Schritt wird Maxine auf einem Host -JVM ausgeführt, um einen Prototyp zu konfigurieren, und dann seinen eigenen Code und Daten kompiliert, um ein ausführbares Programm für die Zielplattform zu erstellen.

2 Maxine laufen

Jetzt, da Maxine sich selbst zusammengestellt hat, können wir es als Standard -Java -VM ausführen. Der Befehl max VM behandelt die Details der Klassen- und Bibliothekswege und bietet eine Schnittstelle, die dem Befehl Standard Java Launcher ähnelt.

Sie können sich die etablierte Methode des Bootstrapping-Compilers ansehen. Ich denke, es begann in den 70ern ...

Es ist ein bisschen 'whooaoaa Mann, wie kann das funktionieren ???' - Aber ich denke, Sie beschreiben das Phänomen, das als "Selbsthosting" bekannt ist:

Sprachen (oder Toolchains/Plattformen) beginnen nicht als Selbsthosting - sie beginnen das Leben, nachdem sie auf einer vorhandenen Plattform aufgebaut wurden: Zu einem bestimmten Zeitpunkt werden sie funktional genug, damit Programme geschrieben werden können, die die Syntax verstehen, die sie selbst selbst zufällig geschrieben sein.

Es gibt ein großartiges Beispiel im klassischen AWK-Buch, in dem ein AWK-Programm vorgestellt wird, das analysieren kann (eine abgeschnittene Version, wie es passiert). Andere AWK-Programme: Siehe Link unten.

Es gibt ein weiteres Beispiel in dem Buch "Beautiful Code", das ein JavaScript -Programm hat, das JavaScript analysieren kann.

Ich denke, die Sache, an die man sich daran erinnern kann - wenn Sie einen in Java geschriebenen JVM haben, der daher Java -Byte -Code ausführen kann: Die JVM, die die Java JVM selbst ausführt 'Und dann zum Maschinencode kompiliert): Dies gilt in jedem Fall eines Selbstversorgungsprogramms irgendwann - irgendwo in der Leitung.

Das Geheimnis wird also entfernt - denn irgendwann findet ein nationales Maschinencode -Programm unter allem statt.

Es entspricht irgendwie, die englische Sprache (usw.) mit der englischen Sprache selbst zu beschreiben .... vielleicht ...

http://www.amazon.co.uk/awkprogramming-language-alfred-aho/dp/020107981x/ref=sr_1_fkmr0_3?ie=utf8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=A9_sc_1?rh=i%3Astripbooks%2ck%3abeautiful+Code&Keywords=Beautiful+Code&ie=Utf8&qid=126697435

http://en.wikipedia.org/wiki/self-hosting

Ich weiß, dass dieser Beitrag alt ist, aber ich dachte, ich könnte die Diskussion ein wenig hinzufügen, da es sich um Punkte handelt, die übersehen wurden. Zukünftige Leser finden dies möglicherweise hilfreich.

Ich frage mich, ob hier jeder den Punkt fehlt. Sie können die meisten Art von Compiler, Dolmetscher oder virtueller Maschine in fast jeder Sprache schreiben. Wenn Sie C zum Schreiben eines C -Compilers verwenden, wird ein C -Compiler benötigt, um den neuen Compiler zu kompilieren. Der Ausgang ist jedoch nativer Code, der auf der angegebenen Plattform ausgeführt wird. Nur weil der JVM in der Sprache geschrieben ist, die auf dem JVM ausgeführt wird, heißt das nicht, dass die Ausgabe zu einem Code führen muss, der auf dem JVM ausgeführt wird. Zum Beispiel können Sie C, Basic, Pascal Compiler oder sogar Assembler in Java schreiben. In diesem Fall benötigen Sie das JVM, um den Compiler oder Assembler zu erstellen, aber nach dem Erstellen benötigen Sie möglicherweise nicht mehr das JVM, wenn der anfängliche Code zu nativem Code führte. Ein anderer Ansatz besteht darin, einen Übersetzer zu schreiben, der eine Eingabestrach nimmt und ihn in eine native Maschinensprache umwandelt, damit Sie Ihr Programm in Sprache A schreiben, das in Sprache B kompiliert, die dann in Maschinencode kompiliert wird. In der Micro -Controller -Welt sehen Sie das viel. Jemand möchte Programme in Basic oder Java schreiben, damit er den Basic/Java -Compiler schreibt, um C -Code für einen vorhandenen C -Compiler zu erstellen. Anschließend wird der resultierende C -Code in die Maschinensprache zusammengestellt, die den nativen Basic/Java -Compiler bietet. Dieser Ansatz ist normalerweise einfacher als das Schreiben des Basic/Java -Compilers direkt im Maschinencode.

Vor vielen Jahren habe ich Basica- und GWBasic -Programme geschrieben, die Assembly -Code auf 6800 und Z80 Micros erstellten. Mein Punkt ist, dass die Ausgabe nicht von der gleichen ILK wie die Eingabe oder das Ziel sein muss. Dh nur weil du einen JVM in Java schreibst, heißt das nicht, dass das Endergebnis unter einem Java -JVM geleitet werden muss.

Hier ist ein gutes Papier zum Bootstraping einer selbst gehosteten VM. Es ist nicht Java, sondern JavaScript, aber die Prinzipien sind gleich.

Bootstrapping eine selbst gehostete virtuelle Forschungsmaschine für JavaScript: Ein Erfahrungsbericht

Beachten Sie, dass während der Bootstraping eines Selbst-Host-Compilers und Bootstraping eines selbst gehosteten VM etwas ähnlich ist, glaube ich, dass sie nicht genau die gleichen Herausforderungen stellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top