Betrachtet man die meisten (wenn nicht alle) dynamischen Sprachen (z. B. Python, PHP, Perl und Ruby), werden sie alle interpretiert. Korrigiere mich, wenn ich falsch liege. Gibt es ein Beispiel für eine dynamische Sprache, die die Kompilierungsphase durchläuft? Ist die dynamische Sprache identisch mit der interpretierten Sprache?
programming-languages
php
ruby
perl
dynamic-typing
Joshua Partogi
quelle
quelle
Antworten:
Nicht wahr. Sie können die Python-Quelle kompilieren. Das ist ein existenzieller Beweis.
Es gibt Interpreter für statisch typisierte Sprachen und Compiler für dynamisch typisierte Sprachen. Die beiden Konzepte sind orthogonal.
Randnotiz: Im Allgemeinen ist eine Sprache genau das: eine Sprache mit einer Reihe syntaktischer Konstrukte, um Semantik auszudrücken. Wenn Sie Python auf ein Whiteboard schreiben, heißt es immer noch Python! Es ist die Implementierung , die ein Interpreter oder ein Compiler sein kann. Die statische oder dynamische Typisierung (eine Art Hybrid aus beiden) ist eine Eigenschaft der Sprache, während die Ausführung eines Programms durch Interpretieren oder Kompilieren eine Eigenschaft der Implementierung ist.
quelle
.pyc
Dateien sind Bytecode. Python-Quellcode wurde analysiert, optimiert und kompiliert , um sie zu erstellen. Die Bytecode-Anweisungen sind relativ umfangreich und die beliebteste Implementierung ist ein einfacher Interpreter (im Gegensatz dazu sehen Sie sich PyPy an, das zur Laufzeit Bytecode zu sehr cleverem Maschinencode kompiliert), aber Python ist nicht weniger kompiliert als Java oder C #. Python wird nur dann "nicht kompiliert", wenn "Kompilierung" auf die native Vor- Zeit-Kompilierung beschränkt war , aber niemand hat etwas darüber gesagt, und im Allgemeinen kann es sich auf eine Transformation von Sprache in Sprache beziehen.Python
undCPython
während die letztere eine Implementierung der ersteren ist, ist dies auch der FallPyPy
.Common Lisp ist dynamisch (und stark) typisiert und wird normalerweise kompiliert .
Da diese Dynamik zur Laufzeit erreicht wird, können Sie mit einigen Anweisungen im Quellcode sicherstellen, dass ein Symbol nur einen bestimmten Wert enthält, damit der Compiler den generierten Code optimieren und die Leistung steigern kann.
quelle
C # 4.0 unterstützt dynamische Typen (späte Bindung) und wird kompiliert.
quelle
node.js basiert auf Googles V8-Javascript-Engine. V8 kompiliert die Laufzeit. V8 ist angesichts dieser Tatsache unglaublich schnell. Schauen Sie sich einfach http://shootout.alioth.debian.org an und vergleichen Sie V8 mit einer der oben interpretierten Sprachen.
quelle
Nein - es ist durchaus möglich, dynamische Sprachen zu kompilieren.
Es gibt sogar einige dynamische Sprachen, die immer vom Design kompiliert werden (z. B. Clojure).
Die Frage berührt jedoch einen wichtigen verwandten Punkt: Obwohl dynamische Sprachen kompiliert werden können, ist es häufig so, dass dynamische Sprachen nicht zu Code kompiliert werden können, der so effizient ist wie eine statisch typisierte Sprache . Dies liegt daran, dass in dynamischen Sprachen einige inhärente Funktionen Laufzeitprüfungen erfordern, die in einer statisch kompilierten Sprache nicht erforderlich wären.
Ein Beispiel hierfür: Sprachen, die das Patchen von Objekten zur Laufzeit ermöglichen (z. B. Ruby), erfordern häufig, dass das Objekt beim Aufrufen einer Methode für das Objekt überprüft wird (mit einem Hashtable-Lookup oder ähnlichem). Selbst wenn dies kompiliert wird, muss der Compiler Code generieren, um die Methodensuche zur Laufzeit durchzuführen. In gewissem Maße unterscheidet sich diese Methodensuche nicht von dem, was ein Interpreter tun müsste.
Dies bedeutet einen erheblichen Mehraufwand im Vergleich zu einem Methodenaufruf in einer Sprache wie Java, in der die richtige Methode vom Compiler statisch aus der Klassendefinition ermittelt und auf einen einfachen Funktionsaufruf im systemeigenen Code reduziert werden kann.
Ich glaube, es ist mehr als alles andere dieser Effekt, der dazu führt, dass dynamische Sprachen im Durchschnitt langsamer arbeiten als ihre statisch kompilierten Gegenstücke. Wie Sie an den fehlerhaften Benchmarks sehen können , sind es die statisch typisierten Sprachen (C, Java, Fortran usw.), die am schnellsten mit den dynamischen Sprachen (Perl, Python, Ruby, PHP usw.) am Ende des Rankings abschneiden.
quelle
Es war einmal eine Interpretation von BASIC. Und einige Varianten von BASIC hatten dynamisches Tippen. Und Sie könnten auch Compiler für sie bekommen.
(Dies war in den Tagen von 100.000 Diskettenlaufwerken, als Dinosaurier noch auf der Erde umherstreiften und ahnungslose Softwareentwickler zum Frühstück aßen.)
quelle
Verschiedene Smalltalk-Implementierungen behandeln dies unterschiedlich, aber einige von ihnen werden zu Bytecodes kompiliert, die auf einer Hochleistungs-VM ausgeführt werden.
quelle
Tatsächlich durchlaufen die meisten der so genannten "interpretierten" Sprachen eine Just-in-Time-Kompilierung, um die Ausführung zu beschleunigen. Einige von ihnen müssen erst zu Bytecode kompiliert werden, bevor Sie sie ausführen können.
In der Tat sind dynamisch und interpretiert zwei völlig unterschiedliche Ideen, obwohl es eine Korrelation gibt. Der Grund dafür ist, dass es ihnen nichts ausmacht, den Code ein bisschen langsamer, aber portabel auszuführen, wenn sie jemals das Gefühl haben, dass die dynamische Eingabe ihre Arbeit einfacher und schneller macht.
quelle
Chrome, IE9 und Firefox 3.1+ kompilieren JavaScript in native Binärdateien, und JavaScript wird dynamisch eingegeben.
Ich denke, der Grund, warum dynamische Sprachen in der Vergangenheit eher interpretiert werden, liegt darin, dass dynamisches Tippen und Interpretieren (oder genauer gesagt das Fehlen von Kompilierungen) in der Regel nützliche Funktionen für Skriptsprachen und Skriptaufgaben im Allgemeinen sind.
Die Leistung ist (war) auch nicht so wichtig für die Art von Programmen, die in diesen Sprachen geschrieben wurden. Auch hier war der Aufwand für dynamisches Tippen und Dolmetschen kein so großes Problem wie in Sprachen dieser Wert Leistung.
quelle
Python wird normalerweise kompiliert. Zugegebenermaßen zu Bytecode kompiliert, der dann interpretiert wird.
Perl arbeitet ähnlich.
Common Lisp wird normalerweise in systemeigenen Code oder Bytecode kompiliert. Dies unterscheidet sich zwischen Implementierungen (und bis zu einem gewissen Grad innerhalb einer Implementierung, abhängig von verschiedenen Optimierungseinstellungen).
quelle
Ja. Alle dynamischen Sprachen sind interpretierte Sprachen (eine interpretierte Sprache kann jedoch nicht dynamisch sein).
Der Grund ist einfach: Wenn es dynamisch ist, benötigt es einen Interpreter, um die Dynamik auf der Ebene der binären Kompilierung auszuführen.
Ex. : Wenn wir Daten in eine PHP-Variable und später in eine andere eines anderen Typs einfügen, kann unser Programm keinen Binärcode kompilieren, da jeder Typ sein eigenes Binärdarstellungsformat hat. Der Interpreter verwaltet die Verschiebungen auf binärer Ebene auf dynamische Weise
quelle