Frage

Ich habe ein in Ruby wurde Programmierung, während jetzt nur mit der Standard-MRI-Implementierung von Ruby, aber ich habe immer neugierig über die anderen Implementierungen Ich höre so viel über.

Ich las über Rubinius den anderen Tag, ein Ruby-Interpreter in Ruby geschrieben. Ich habe versucht, sucht es in verschiedenen Orten, aber ich war eine harte Zeit, genau herauszufinden, wie so etwas funktioniert. Ich hatte noch nie viel Erfahrung in der Compiler oder Sprache schreiben, aber ich bin wirklich daran interessiert, es zu verstehen.

Wie kann genau eine Sprache, die von sich selbst zu interpretieren? Gibt es einen grundlegenden Schritt bei der Erstellung, dass ich nicht verstehen, wo dies sinnvoll ist? Kann jemand mir dies erklären, wie ich ein Idiot bin (denn das ist nicht zu weit weg von der Unterseite sowieso wäre)

War es hilfreich?

Lösung

Es ist einfacher als Sie denken.

Rubinius ist nicht zu 100% in Ruby geschrieben, nur meistens.

http://rubini.us/

Ein großer Aspekt der populären Sprachen wie C und Java ist, dass die Mehrheit der Funktionalität zur Verfügung, die Programmierer in der Sprache selbst geschrieben. Rubinius hat das Ziel, das Hinzufügen Ruby dieser Liste. Rubyisten könnte leichter Funktionen der Sprache, Fehler zu beheben, fügen Sie und lernen, wie die Sprache funktioniert. Wo immer möglich Rubinius ist in Ruby geschrieben. Wo nicht möglich ist (noch) nicht, es ist C ++.

Andere Tipps

Das Konzept der Sie suchen ist Compiler Bootstrapping .

Im Grunde Mittel Bootstrapping einen Compiler (oder einen Dolmetscher) Schreiben für Sprache x in Sprache x . Dies erfolgt entweder durch ein basisches Compiler auf einer niedrigeren Ebene von Hand zu schreiben (das heißt einen C-Compiler in Assembly Schreiben) oder durch eine andere Hochsprache verwendet wird.

Lesen Sie mehr über Bootstrapping auf wikipedia . Gregs Antwort in Bezug auf Meta-Kreis Gutachter ist auch sehr zu empfehlen, auch das entsprechende Kapitel in SICP.

Bei Rubinius wird die VM in C ++ geschrieben und befasst sich mit allen lowlevel (Betriebssystem bezogen) Sachen und Basisoperationen. Die VM verfügt über eine eigenes Bytecode-Format (wie die JVM eigene und hat) und wenn Rubinius gestartet wird es startet die VM, die die Bytecode ausführt. Die meisten Standard-Bibliothek Rubinius (der Teil von Ruby die Sprache ist) wird jedoch in Ruby implementiert, im Vergleich zu C (MRI) oder Java (JRuby). Außerdem wird die Rubinius Bytecode-Compiler auch in Ruby geschrieben. Also ja, irgendwann früh am Anfang hatten sie die Standard-Ruby-Interpreter (MRI) verwenden Rubinius Bootstrap. Dies sollte aber nicht mehr der Fall sein (obwohl ich nicht sicher bin, ob Sie noch brauchen könnte es da sein Build-System Anwendungen Rake).

Angenommen, die Sprache, die Sie mit arbeiten einig Sprache, sagt Lisp, obwohl es spielt keine Rolle. (Könnte sein, C ++, Java, Ruby, alles.)

Nun, Sie eine Implementierung von Lisp haben. Rufen Sie diese Implementierung Imp (nur einige Namen kurz für die Umsetzung aus). Da Imp ein Programm an sich ist, kann Ihr Computer ausführen. Jetzt schreiben Sie Ihre eigene Implementierung für Lisp in Lisp geschrieben und Sie nennen es Circ. Circ ist nur ein Programm zusammengestellt (oder interpretiert, wenn man so will) von Lisp-Code. Ihr Code geschrieben, so dass es in einer Datei liest, analysiert er (Prozesse sie in aussagekräftige Daten) und macht etwas mit den Daten. Was ist das etwas? Im Fall von Circ, führt er die Daten.

Aber wie funktioniert es tun?

Nun für einen einfachen Fall annehmen, dass der Code Circ liest und parst ist etwas Einfaches wie etwas Mathematik zu tun und das Ergebnis ausgibt. Circ verarbeitet den Code in leicht Daten zu verwenden (auch für eine Sprache wie Lisp ist es einfach, mit zu beginnen, aber das ist über den Punkt hinaus) und speichert sie. Nun, in Lisp können Sie Code zu Knirschen Zahlen schreiben, so dass der Code für Circ geschrieben tun kann, so auch, weil es in Lisp geschrieben. So ist die verarbeiteten Daten werden in eine Additionsverarbeitung Code eingesteckt ... und voila! Sie haben das numerische Ergebnis! Dann wird Ihr Circ Programm gibt das Ergebnis.

Das gleiche kann mit komplexeren Dingen als einfache mathematische erfolgen. In der Tat kann man andere Aspekte der Sprache kompilieren / interpretieren. Schreibe genug von diesen ‚anderen Aspekten‘ und sie zusammenkleben, Sie in Lisp geschrieben, um einen einen Compiler für Lisp erhalten.

Da die Compiler von Imp kompiliert wird, kann es von Ihrem Computer ausgeführt werden, und presto! Sie sind fertig.

Diese Technik wird im Allgemeinen vor einem metacircular Auswerter und wurde zum ersten Mal eingeführt mehrere Jahrzehnte genannt im Rahmen von Lisp.

Eine gute Beschreibung der Technik kann in Struktur und Interpretation von Computerprogrammen , Kapitel finden 4.

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