Ist Ruby wirklich eine interpretierte Sprache, wenn alle seine Implementierungen in Bytecode zusammengestellt werden?

StackOverflow https://stackoverflow.com/questions/717490

Frage

In der gewählten Antwort für Diese Frage zu Blue Ruby, Chuck sagt:

Alle aktuellen Ruby -Implementierungen werden in Bytecode zusammengestellt. Entgegen den Behauptungen von SAP enthält MRT selbst ab Ruby 1.9 einen Bytecode -Compiler, obwohl die Fähigkeit, die kompilierte Bytecode zu Scheibe zu retten, irgendwo im Prozess der Zusammenführung der virtuellen Yarv -Maschine verschwunden ist. JRUBY wird in Java .Class -Dateien zusammengestellt. Ich habe nicht viele Details zu Maglev, aber es scheint sicher zu sagen, dass es auch diese Straße dauert.

Ich bin verwirrt über dieses Zusammenstellung/Interpretationsproblem in Bezug auf Ruby.

Ich habe gelernt, dass Ruby eine interpretierte Sprache ist, und deshalb muss ich, wenn ich Änderungen an meinen Ruby-Dateien speichere, das Projekt nicht wieder aufbauen.

Aber wenn alle Ruby -Implementierungen jetzt zusammengestellt sind, ist es immer noch fair zu sagen, dass Ruby eine interpretierte Sprache ist? Oder verstehe ich etwas falsch?

War es hilfreich?

Lösung

Ja, Ruby ist immer noch eine interpretierte Sprache, oder genauer gesagt, Matz 'Ruby Interpreter (MRT), worüber die Leute normalerweise sprechen, wenn sie über Ruby sprechen, ist immer noch ein Dolmetscher. Der Kompilierungsschritt besteht einfach da, um den Code auf etwas zu reduzieren, das schneller auszuführen ist, als zu interpretieren und wiederum die gleiche Code zu interpretieren.

Andere Tipps

Fast jede Sprache wird heutzutage "kompiliert", wenn Sie Bytecode als kompiliert zählen. Sogar EMACS Lisp wird zusammengestellt. Ruby war ein Sonderfall, weil es bis vor kurzem war nicht in Bytecode kompiliert.

Ich denke, Sie haben Recht, die Nützlichkeit der Charakterisierung von Sprachen als "kompiliert" gegen "interpretiert" in Frage zu stellen. Eine nützliche Unterscheidung ist jedoch, ob die Sprache den Maschinencode (z. B. X86 Assembler) direkt aus dem Benutzercode erstellt. C, C ++, viele LISPs und Java mit Aktiva der JIT -Aktivierung, aber Ruby, Python und Perl tun dies nicht.

Menschen, die es nicht besser kennen, werden eine Sprache nennen, die einen separaten manuellen Zusammenstellungsschritt "kompiliert" hat und die nicht "interpretiert" werden.

Eine subtile Frage in der Tat ... früher war es, dass "interpretierte" Sprachen analysiert und in eine mittlere Form verwandelt wurden, die schneller auszuführen war, aber die "Maschine", die sie ausführte, war ein hübsches sprachspezifisches Programm. "Zusammenstellte" Sprachen wurden stattdessen in die von dem Computer unterstützten Computercode -Anweisungen übersetzt, auf denen er ausgeführt wurde. Eine frühe Unterscheidung war sehr grundlegend-statisch und dynamisch. In einer statisch typisierten Sprache könnte eine variable Referenz in wenigen Anweisungen für Maschinen ziemlich auf eine Speicheradresse gelöst werden-Sie wussten genau, wo in dem aufgerufenen Rahmen die genannte Variable. In dynamisch eingegebenen Sprachen mussten Sie nach der Referenz suchen (eine A-Liste oder einen Anrufrahmen). Mit dem Aufkommen der objektorientierten Programmierung erweiterte die Nichtmediat-Natur einer Referenz auf viele weitere Konzepte-Klassen (Typen), Methoden (Funktionen), sogar syntaktische Interpretation (eingebettete DSLs wie Regex).

Die Unterscheidung war in der Tat zurück in die späten 70er Jahre war nicht so sehr zwischen kompiliert und interpretiert Sprachen, aber ob sie in einer kompilierten oder interpretierten Umgebung geführt wurden. Zum Beispiel lief Pascal (die erste hochrangige Sprache, die ich studiert habe) bei UC Berkeley zuerst bei Bill Joy's pxp Dolmetscher und später der Compiler, den er schrieb PCC. Gleiche Sprache, die sowohl in kompilierten als auch in interpretierten Umgebungen erhältlich ist.

Einige Sprachen sind dynamischer als andere, die Bedeutung von etwas-eine Art, eine Methode, eine Variable-hängt von der Laufzeitumgebung ab. Dies bedeutet, dass mit der Ausführung eines Programms ein erheblicher Laufzeitmechanismus verbunden ist oder nicht. Forth, SmallTalk, Nachrichten, Lisp, alle waren Beispiele dafür. Zunächst erforderten diese Sprachen so viel Mechanismus, um (im Vergleich zu einem C oder einem Fortran) auszuführen, dass sie eine natürlichste Interpretation waren.

Noch vor Java gab es Versuche, die Ausführung komplexer, dynamischer Sprachen mit Tricks, Techniken zu beschleunigen, die zu einer Fadenzusammenstellung, der Just-in-Time-Zusammenstellung usw. wurden.

Ich denke, es war jedoch Java, die erste weit verbreitete Sprache, die den Compiler/Dolmetscherlücken wirklich durcheinander hatte, ironischerweise nicht, damit er schneller laufen würde (aber auch), sondern überall laufen würde. Durch die Definition ihrer eigenen Maschinensprache und "Maschine" die Java -Bytecode und VM versuchte Java, eine Sprache zu werden, die in etwas nahezu jeder grundlegenden Maschine zusammengestellt wurde, aber nicht tatsächlich eine echte Maschine.

Moderne Sprachen heiraten all diese Innovationen. Einige haben die dynamische, offene, Sie sind nicht wissen, was Sie bis zum Runt-Runtime-Natur der traditionellen "interpretierten Sprachen (Rubin, Lisp, SmallTalk, Python, Perl (!)), Andere versuchen, zu versuchen, zu versuchen es Haben Sie die strenge Spezifikation und ermöglichen die Erkennung von tiefer typenbasiertem statischen Fehler traditioneller kompilierter Sprachen (JAVA, SCALA).

Also, kompiliert vs. interpretiert? Das Beste von beidem würde ich sagen. Der gesamte Code in der Quelle (mit Dokumentation), ändern Sie alles und der Effekt ist unmittelbar, einfache Vorgänge werden fast so schnell ausgeführt, wie die Hardware sie kann, komplexe und schnell genug, Hardware- und Speichermodelle sind übereinstimmende Plattformen.

Die größere Polemik in den Sprachen heute ist wahrscheinlich, ob sie statisch oder dynamisch getippt werden, dh nicht, wie schnell sie laufen werden, sondern werden die Fehler im Voraus vom Compiler gefunden (auf Kosten des Programmierers, das eine ziemlich komplexe Tippen angeben muss Informationen) oder werden die Fehler in Tests und Produktion auftreten.

Sie können Ruby -Programme interaktiv verwenden Irb, die interaktive Rubinschale. Es kann zwar Zwischenbytecode erzeugen, aber im traditionellen Sinne ist es sicherlich kein "Compiler".

Eine kompilierte Sprache wird im Allgemeinen in den Maschinencode zusammengestellt, im Gegensatz zu nur Byte -Code. Einige Byte -Code -Generatoren können den Byte -Code jedoch weiter in den Maschinencode zusammenstellen.

Der Byte -Code selbst ist nur ein Zwischenschritt zwischen dem vom Benutzer geschriebenen buchstäblichen Code und der virtuellen Maschine. Er muss jedoch noch von der virtuellen Maschine interpretiert werden (wie es mit Java in einem JVM und PHP mit einem Opcode -Cache durchgeführt wird).

Dies ist möglicherweise ein kleines Thema, aber ...

Eisenrubin ist eine .NET -basierte Implementierung von Ruby und wird daher normalerweise in Byte -Code zusammengestellt und dann zur Laufzeit in Maschinensprache zusammengestellt (dh nicht interpretiert). Auch (zumindest mit anderen .NET -Sprachen, so gehe ich mit Ruby an) ngen Kann verwendet werden, um vorab eine kompilierte native binäre Binärdatei zu generieren, sodass eine Maschinencode -kompilierte Version von Ruby Code effektiv ist.

Die Informationen, die ich von Rubyconf 2011 in Shanghai erhalten habe, entwickelt Matz einen „Mruby“ (steht für Matz 'Ruby) für das Targeting von Laufen auf eingebetteten Geräten. Und Matz sagte, dass der Mruby die Möglichkeit bietet, den Ruby -Code in den Maschinencode zu kompilieren, um die Geschwindigkeit zu steigern und die Verwendung der (begrenzten) Ressourcen auf den eingebetteten Geräten zu verringern. Es gibt also verschiedene Art von Ruby -Implementierung und definitiv werden nicht alle während der Laufzeit interpretiert.

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