Was ist der Unterschied zwischen kompilierter und interpretierter Sprache?
Der Unterschied liegt nicht in der Sprache; es ist in der Umsetzung .
Nachdem ich das aus meinem System herausgeholt habe, hier eine Antwort:
In einer kompilierten Implementierung wird das ursprüngliche Programm in native Maschinenanweisungen übersetzt, die direkt von der Hardware ausgeführt werden.
In einer interpretierten Implementierung wird das ursprüngliche Programm in etwas anderes übersetzt. Ein anderes Programm, "der Interpreter" genannt, untersucht dann "etwas anderes" und führt alle erforderlichen Aktionen aus. Abhängig von der Sprache und ihrer Implementierung gibt es verschiedene Formen von "etwas anderem". Von populärer zu weniger populär könnte "etwas anderes" sein
Binäre Anweisungen für eine virtuelle Maschine, die häufig als Bytecode bezeichnet wird , wie dies in Lua, Python, Ruby, Smalltalk und vielen anderen Systemen der Fall ist (der Ansatz wurde in den 1970er Jahren vom UCSD P-System und UCSD Pascal populär gemacht).
Eine baumartige Darstellung des ursprünglichen Programms, z. B. ein Baum mit abstrakter Syntax, wie er für viele Prototypen oder pädagogische Dolmetscher verwendet wird
Eine tokenisierte Darstellung des Quellprogramms, ähnlich wie bei Tcl
Die Zeichen des Quellprogramms, wie in MINT und TRAC
Eine Sache, die das Problem kompliziert, ist, dass es möglich ist, Bytecode in native Maschinenanweisungen zu übersetzen (zu kompilieren) . Daher kann eine erfolgreiche interpretierte Implementierung möglicherweise einen Compiler erhalten. Wenn der Compiler hinter den Kulissen dynamisch ausgeführt wird, wird er häufig als Just-in-Time-Compiler oder JIT-Compiler bezeichnet. JITs wurden für Java, JavaScript, Lua und viele andere Sprachen entwickelt. Zu diesem Zeitpunkt können Sie eine hybride Implementierung haben, in der ein Teil des Codes interpretiert und ein Teil des Codes kompiliert wird.
Java und JavaScript sind ein ziemlich schlechtes Beispiel, um diesen Unterschied zu demonstrieren
, da beide interpretierte Sprachen sind. Java(interpretiert)und C (oder C ++)(kompiliert)könnten ein besseres Beispiel gewesen sein.Grundsätzlich kann kompilierter Code direkt von der CPU des Computers ausgeführt werden. Das heißt, der ausführbare Code wird in der "Muttersprache" der CPU ( Assemblersprache ) angegeben.
Der Code der interpretierten Sprachen muss jedoch zur Laufzeit von einem beliebigen Format in Anweisungen der CPU-Maschine übersetzt werden. Diese Übersetzung wird von einem Dolmetscher durchgeführt.
Eine andere Art, es auszudrücken, ist, dass interpretierte
SprachenCode sind, der Schritt für Schritt in Maschinenanweisungen übersetzt wird, während das Programm ausgeführt wird, während kompilierteSprachenCodehaben, dessenCode vor der Programmausführung übersetzt wurde .quelle
Hier ist der grundlegende Unterschied zwischen Compiler- und Interpreter-Sprache.
Compilersprache
Dolmetschersprache:
quelle
Ein Compiler liest im Allgemeinen Computercode einer höheren Sprache und konvertiert ihn entweder in P-Code oder in nativen Maschinencode. Ein Interpreter wird direkt aus p-Code oder einem interpretierten Code wie Basic oder Lisp ausgeführt. In der Regel wird kompilierter Code viel schneller ausgeführt, ist kompakter und hat bereits alle Syntaxfehler und viele der illegalen Referenzfehler gefunden. Interpretierter Code findet solche Fehler erst, nachdem die Anwendung versucht hat, den betroffenen Code zu interpretieren. Interpretierter Code eignet sich oft für einfache Anwendungen, die nur einmal oder höchstens ein paar Mal verwendet werden, oder sogar für das Prototyping. Kompilierter Code ist besser für ernsthafte Anwendungen. Ein Compiler nimmt zuerst das gesamte Programm auf, sucht nach Fehlern, kompiliert es und führt es dann aus. Während ein Interpreter dies Zeile für Zeile ausführt, benötigt er eine Zeile und prüft sie auf Fehler.
Wenn Sie weitere Informationen benötigen, suchen Sie bei Google nach "Unterschied zwischen Compiler und Interpreter".
quelle
Es ist eine sehr trübe Unterscheidung und im Allgemeinen keine Eigenschaft einer Sprache selbst, sondern des Programms, mit dem Sie Code in dieser Sprache ausführen.
Die meisten Sprachen werden jedoch hauptsächlich in der einen oder anderen Form verwendet, und ja, Java wird im Wesentlichen immer kompiliert, während Javascript im Wesentlichen immer interpretiert wird.
Um den Quellcode zu kompilieren, müssen Sie ein Programm darauf ausführen, das eine binäre, ausführbare Datei generiert, die beim Ausführen das von der Quelle definierte Verhalten aufweist. Zum Beispiel kompiliert javac von Menschen gelesene Java-Dateien in maschinenlesbare Klassendateien.
Um den Quellcode zu interpretieren, wird ein Programm darauf ausgeführt, das das definierte Verhalten sofort erzeugt, ohne eine Zwischendatei zu generieren. Wenn Ihr Webbrowser beispielsweise stackoverflow.com lädt, interpretiert er eine Reihe von Javascript (die Sie durch Anzeigen der Seitenquelle anzeigen können) und erzeugt viele der netten Effekte, die diese Seiten haben - zum Beispiel Upvoting oder den kleinen Notifier Balken auf der Oberseite.
quelle
Die interpretierte Sprache wird zur Laufzeit gemäß den Anweisungen wie in Shell-Skripten ausgeführt, und die kompilierte Sprache wird kompiliert (in Assemblersprache geändert, die die CPU verstehen kann) und dann wie in c ++ ausgeführt.
quelle
Wie andere gesagt haben, sind kompiliert und interpretiert spezifisch für eine Implementierung einer Programmiersprache; Sie sind der Sprache nicht inhärent. Zum Beispiel gibt es C-Interpreter.
Wir können (und in der Praxis auch) Programmiersprachen anhand ihrer häufigsten (manchmal kanonischen) Implementierung klassifizieren. Zum Beispiel sagen wir, dass C kompiliert ist.
Zunächst müssen wir ohne Mehrdeutigkeit Interpreter und Compiler definieren:
Ein Interpreter für Sprache X ist ein Programm (oder eine Maschine oder nur eine Art von Mechanismus im Allgemeinen), das jedes in Sprache X geschriebene Programm p so ausführt, dass es die Effekte ausführt und die Ergebnisse gemäß der Spezifikation von X bewertet .
Ein Compiler von X nach Y ist ein Programm (oder eine Maschine oder nur eine Art Mechanismus im Allgemeinen), das jedes Programm p aus einer Sprache X in ein semantisch äquivalentes Programm p ' in einer Sprache Y so übersetzt, dass p interpretiert wird ' mit einem Interpreter für Y die gleichen Ergebnisse erzielen und haben die gleichen Wirkungen wie die Interpretation p mit einem Interpreter für X .
Beachten Sie, dass CPUs aus Sicht des Programmierers Maschinendolmetscher für ihre jeweilige native Maschinensprache sind.
Jetzt können wir eine vorläufige Klassifizierung der Programmiersprachen in drei Kategorien vornehmen, abhängig von der häufigsten Implementierung:
Manchmal werden weiche und harte kompilierte Sprachen als einfach kompiliert bezeichnet, daher wird C #, Java, C, C ++ als kompiliert bezeichnet.
Innerhalb dieser Kategorisierung war JavaScript eine interpretierte Sprache, aber das war vor vielen Jahren. Heutzutage ist es in den meisten wichtigen JavaScript-Implementierungen JIT-kompiliert in die native Maschinensprache, daher würde ich sagen, dass es in weich kompilierte Sprachen fällt.
quelle