Ich bin vorsichtig, diese Frage zu stellen, weil sie übermäßig anspruchsvoll erscheinen könnte. Ich habe gerade JavaScript: The Definitive Guide geöffnet und es heißt auf der ersten Seite von Kapitel 1
"JavaScript ist eine dynamische, untypisierte interpretierte Programmiersprache auf hoher Ebene."
Soll ich also annehmen, dass der interpretierte Teil eine Anforderung in der Sprachspezifikation ist, oder ist es irreführend zu sagen, dass die Sprache eine interpretierte Programmiersprache ist, wenn der Unterschied zwischen einer Sprache und ihren vielen Implementierungen beachtet wird?
Es gibt anscheinend keine statischen Compiler für JavaScript - https://stackoverflow.com/questions/1118138/is-there-a-native-machine-code-compiler-for-javascript. Vielleicht ist es nur ein Spiegelbild davon.
quelle
Antworten:
EcmaScript-Experten verwenden häufig den Begriff "ES-Interpreter", um sich auf eine Implementierung von EcmaScript zu beziehen, in der Spezifikation wird dieser Begriff jedoch nicht verwendet. Die Sprache im Überblick beschreibt insbesondere die Sprache , in Interpreter unabhängigen Bedingungen:
Daher geht EcmaScript von einer "Host-Umgebung" aus, die als Anbieter von Objektdefinitionen definiert ist, einschließlich aller Objekte, die E / A oder andere Links zur Außenwelt zulassen, jedoch keinen Interpreter erfordern.
Die Semantik von Anweisungen und Ausdrücken in der Sprache wird in Form von Vervollständigungsspezifikationen definiert, die in einem Interpreter trivial implementiert sind, die Spezifikation erfordert dies jedoch nicht.
Die nicht-lokalen Steuerübertragungen können in Anordnungen von Anweisungen mit Sprüngen konvertiert werden, die eine native oder Bytecode-Kompilierung ermöglichen.
"EcmaScript Engine" ist möglicherweise eine bessere Möglichkeit, dieselbe Idee auszudrücken.
Das ist nicht wahr. Der "Interpreter" von V8 kompiliert intern in nativen Code, Rhino kompiliert optional intern in Java-Bytecode und verschiedene Mozilla-Interpreter ({Trace, Spider, Jager} Monkey) verwenden einen JIT-Compiler.
V8 :
Rhino :
TraceMonkey :
quelle
de-optimization
Stufen. Mit anderen Worten, JavaScript wird von diesen Engines kompiliert, jedoch nicht statisch.Die in Chrome verwendete V8-JavaScript-VM enthält keinen Interpreter. Stattdessen besteht es aus zwei Compilern und kompiliert den Code im laufenden Betrieb. Einer der Compiler läuft schnell, generiert aber ineffizienten Code, der andere ist ein optimierender Compiler.
Ich kann verstehen, warum manche Leute dieses "Betrügen" in Betracht ziehen, da V8 jedes Mal, wenn der Code ausgeführt wird und der Benutzer V8 installiert haben muss, Quellcode als Eingabe verwendet. Stellen Sie sich aber einen Compiler vor, der eine ausführbare Datei ausgibt, die einen vollständigen Interpreter und Bytecode enthält. Dann hätten Sie ein eigenständiges Programm. Es wäre einfach nicht sehr effizient.
quelle
Das Aufkommen von JIT-Compilern für Skriptsprachen hat die Grenze zwischen Kompilierung und Interpretation verwischt, bis zu einem Punkt, an dem die Frage nicht mehr so viel bedeutet. Ist es nur eine Interpretation, wenn die Engine eine Codezeile liest und diese sofort ausführt? (Shell-Skripte werden normalerweise immer noch auf diese Weise implementiert.) Ist es eine Interpretation, wenn die Engine die gesamte Datei aufnimmt, sie sofort in einen Byte-Code kompiliert und dann den Byte-Code interpretiert? (Die Mozilla-Engine der ersten Stufe und CPython funktionieren auf diese Weise.) Ist es eine Interpretation, wenn die Engine eine Funktion gleichzeitig analysiert und sie mit JIT in nativen Code übersetzt? Was ist mit den Engines, die die gesamte Datei in Byte-Code kompilieren und dann je nach Bedarf eine Funktion nach der anderen ausführen? (Die meisten Skript-Engines funktionieren heutzutage so,
Es gibt viele Schattierungen zwischen Zusammenstellung und Interpretation.
Ich denke, die nützlichste Definition für die Interpretation ist "wird dem Quellcode des Programms zur Ausführungszeit ohne einen separaten Vor-Zeit-Schritt zugeführt". Nach dieser Definition sind alle JavaScript-Engines Interpreter. Dies ist aber sicherlich nicht die einzig mögliche Definition von Interpretation.
Aber ist JavaScript für die Interpretation ausgelegt? In gewisser Weise ja: Es hat eine
eval
Funktion sowie denFunction
Konstruktor, dass Sie Programmcode als Zeichenfolge angeben können, die ausgeführt wird. Die Fähigkeit zur dynamischen Erstellung von Programmcode zur Laufzeit setzt voraus, dass die Engine in der Lage ist, Quellcode zu interpretieren. Dies bedeutet jedoch nicht, dass Sie nicht alles andere vorab erstellen können. Selbst in einer kompilierten Sprache wie C ++ und C # können Sie Quellcode verwenden, ihn im Speicher in neuen Maschinencode kompilieren und diesen dann ausführen. Es gibt sogar Bibliotheken dafür: LLVM + Clang in C ++ und das Roslyn-Projekt in C #.Außerdem ist der Übermittlungsmechanismus für JavaScript der Quellcode. Es gibt keine anerkannte Byte-Code-Form davon. C # und Java haben ihren offiziellen Bytecode, und jeder erwartet, dass C ++ als Maschinencode geliefert wird. Dies ist aber nach wie vor kein inhärenter Aspekt der Sprache, sondern nur ein dominantes Nutzungsszenario. Tatsächlich wird JavaScripts enger relativer ActionScript-Code in Flash als Bytecode geliefert (der Flash-Compiler kompiliert alle Skripte vor).
quelle
Es gibt keine völlig übereinstimmende Definition von "interpretiert" gegenüber "kompiliert". Bei der klassischen Unterscheidung erzeugen kompilierte Sprachen eine eigenständige ausführbare Binärdatei, während für interpretierte Sprachen eine implementierte Laufzeit zum Ausführen des Codes erforderlich ist. Virtuelle Maschinen, Bytecode usw. verwischen die Unterscheidung.
Aber hier ist eine möglicherweise nützliche Definition: Eine interpretierte Sprache ist eine Sprache, in der die Standardsprache zur Laufzeit Quelltext als Eingabe verwenden und ausführen kann. Durch diese Definition werden Perl-, Python-, Ruby-, JavaScript- und Shell-Skripte und dergleichen interpretiert (auch wenn sie Zwischenschritte wie Bytecode oder sogar systemeigenen Code verwenden). Java, C #, C etc. sind das nicht. Und JavaScript wird per Definition interpretiert, auch wenn die Spezifikation nicht das genaue Wort verwendet.
quelle