Das einmalige Überprüfen von Typen ist eigentlich das, was einen "Compiler" (~ einen Typprüfer) macht.
Sie können nicht "kompilieren" (Typen einmal prüfen), wenn Typen "dynamisch" sind.
Kurz gesagt: Sie gehen zusammen wie Erbsen und Karotten.
Kompilieren vs. Dolmetschen und Sprachtasten sind grundsätzlich getrennte Anliegen, da Sie alle möglichen Permutationen haben können. Auf der anderen Seite ist der "Grund" für das Auswählen des Kompilierens und nicht für das dynamische Tippen für ein Sprachdesign identisch: Leistung. Der "Grund" für die Auswahl der dynamischen Typisierung und Interpretation ist auch etwas verwandt.
Es ist keine feste Regel. Du kannst sie immer mischen. Sie können zum Beispiel Perl und Lisp kompilieren und C. interpretieren.
Sie beobachten eine nicht-kausale Korrelation:
Compiler werden normalerweise in dynamisch typisierten Sprachen nachgerüstet, um die Leistung zu verbessern (weil die Leistung oft sehr schlecht ist). Zum Beispiel ist hier, wie lange einige wichtige dynamisch typisierte Sprachen interpretiert wurden, bevor ihr erster Compiler geschrieben wurde: Lisp (1958-1962), Mathematica (1988-2004), Lua (1993-2004), Python (1991-2002) und Javascript (1995-2009). Im Gegensatz dazu wurden Sprachen wie OCaml (1996) und F # (2001) zuerst als Compiler veröffentlicht.
Wie von anderen erwähnt, werden Sprachen weder kompiliert noch interpretiert. Sie sind nur Regeln, die übersetzt werden müssen, und die meisten haben Implementierungen interpretiert und kompiliert. Selbst dann ist es schwierig, über Interpretation statt Kompilation zu sprechen, wenn viele "Interpreten" überall herum jiting sind ( jitting ) und einige "Compiler" kompilieren bei Bedarf gerne, wenn sich eine Quelldatei ändert.
Vielleicht ist es besser, Implementierungen als vollständig vorkompiliert oder kompiliert nach Bedarf zu kategorisieren. Wenn wir diese Kategorien verwenden, ist die einzige Funktion, die die vollständige Vorkompilierung unterbricht, eine Evaluierungsfunktion . Dies hat wahrscheinlich mehr Auswirkungen auf die Implementierung als dynamische Typen. Wenn Sie über eine Evaluierungsfunktion verfügen, müssen Sie Compile-on-Demand unterstützen.
Common Lisp-Code wird meist kompiliert. Die Common Lisp-Programmiersprache wurde in einem ANSI-Standard mit Unterstützung für die Kompilierung beschrieben. Der ANSI-Standard beschreibt Funktionen, die Code kompilieren, verschiedene Aspekte von Optimierungen beschreiben, Aspekte des Kompilierungsprozesses beschreiben und vieles mehr.
Interpreter für Common Lisp existieren, werden aber seltener verwendet.
Common Lisp-Implementierungen können oft verschiedene Ausführungsmodi frei kombinieren. Fast alle haben einen Compiler. Einige haben nur einen Compiler.
Die Kompilierung in fast allen Implementierungen hat einen inkrementellen Modus, so dass sie interaktiv verwendet werden kann. Alle können Dateien kompilieren. Einige haben Kompilierungsmodi zum Kompilieren von Dateigruppen.
Nach der Definition dynamisch typisierter Sprachen ...
Es wird gesagt, dass eine Programmiersprache dynamisch typisiert wird, wenn der Großteil der Typüberprüfung zur Laufzeit statt zur Kompilierungszeit durchgeführt wird. Bei dynamischer Typisierung haben Werte Typen, Variablen jedoch nicht; Das heißt, eine Variable kann sich auf einen beliebigen Wert beziehen.
Das heißt, es wird schwierig, was zu finden, um das Programm zu kompilieren, da es sich zur Laufzeit ändern könnte. Ein weiterer Auszug hier von Wikipedia ...
Dynamisches Tippen ermöglicht Konstrukte, die Einige statische Typprüfungen würden ablehnen als illegal. Zum Beispiel, eval Funktionen, die beliebig ausführen Daten als Code, werden möglich. Außerdem ist dynamisches Tippen besser beherbergt Übergangscode und Prototyping, wie z Platzhalterdatenstruktur (mock Objekt) transparent zu verwenden Ort einer vollwertigen Datenstruktur (normalerweise für die Zwecke von Experimentieren und Testen).
Ich denke, diese Antwort ist noch unvollständig, aber ich hoffe, sie weist Sie in die richtige Richtung. Vielleicht können andere hier darüber hinausgehen.
Warum werden Programme mit dynamisch typisierten Sprachen normalerweise interpretiert und nicht kompiliert?
Sie beobachten eine nicht-kausale Korrelation:
Compiler werden normalerweise in dynamisch typisierten Sprachen nachgerüstet, um die Leistung zu verbessern (weil die Leistung oft sehr schlecht ist). Zum Beispiel ist hier, wie lange einige wichtige dynamisch typisierte Sprachen interpretiert wurden, bevor ihr erster Compiler geschrieben wurde: Lisp (1958-1962), Mathematica (1988-2004), Lua (1993-2004), Python (1991-2002) und Javascript (1995-2009). Im Gegensatz dazu wurden Sprachen wie OCaml (1996) und F # (2001) zuerst als Compiler veröffentlicht.
Wie von anderen erwähnt, werden Sprachen weder kompiliert noch interpretiert. Sie sind nur Regeln, die übersetzt werden müssen, und die meisten haben Implementierungen interpretiert und kompiliert. Selbst dann ist es schwierig, über Interpretation statt Kompilation zu sprechen, wenn viele "Interpreten" überall herum jiting sind ( jitting ) und einige "Compiler" kompilieren bei Bedarf gerne, wenn sich eine Quelldatei ändert.
Vielleicht ist es besser, Implementierungen als vollständig vorkompiliert oder kompiliert nach Bedarf zu kategorisieren. Wenn wir diese Kategorien verwenden, ist die einzige Funktion, die die vollständige Vorkompilierung unterbricht, eine Evaluierungsfunktion . Dies hat wahrscheinlich mehr Auswirkungen auf die Implementierung als dynamische Typen. Wenn Sie über eine Evaluierungsfunktion verfügen, müssen Sie Compile-on-Demand unterstützen.
Das einmalige Überprüfen von Typen ist eigentlich das, was einen "Compiler" (~ einen Typprüfer) macht.
Sie können nicht "kompilieren" (Typen einmal prüfen), wenn Typen "dynamisch" sind.
Nach der Definition dynamisch typisierter Sprachen ...
Es wird gesagt, dass eine Programmiersprache dynamisch typisiert wird, wenn der Großteil der Typüberprüfung zur Laufzeit statt zur Kompilierungszeit durchgeführt wird. Bei dynamischer Typisierung haben Werte Typen, Variablen jedoch nicht; Das heißt, eine Variable kann sich auf einen beliebigen Wert beziehen.
Das heißt, es wird schwierig, was zu finden, um das Programm zu kompilieren, da es sich zur Laufzeit ändern könnte. Ein weiterer Auszug hier von Wikipedia ...
Dynamisches Tippen ermöglicht Konstrukte, die Einige statische Typprüfungen würden ablehnen als illegal. Zum Beispiel, eval Funktionen, die beliebig ausführen Daten als Code, werden möglich. Außerdem ist dynamisches Tippen besser beherbergt Übergangscode und Prototyping, wie z Platzhalterdatenstruktur (mock Objekt) transparent zu verwenden Ort einer vollwertigen Datenstruktur (normalerweise für die Zwecke von Experimentieren und Testen).
Ich denke, diese Antwort ist noch unvollständig, aber ich hoffe, sie weist Sie in die richtige Richtung. Vielleicht können andere hier darüber hinausgehen.
Common Lisp-Code wird meist kompiliert. Die Common Lisp-Programmiersprache wurde in einem ANSI-Standard mit Unterstützung für die Kompilierung beschrieben. Der ANSI-Standard beschreibt Funktionen, die Code kompilieren, verschiedene Aspekte von Optimierungen beschreiben, Aspekte des Kompilierungsprozesses beschreiben und vieles mehr.
Interpreter für Common Lisp existieren, werden aber seltener verwendet.
Common Lisp-Implementierungen können oft verschiedene Ausführungsmodi frei kombinieren. Fast alle haben einen Compiler. Einige haben nur einen Compiler.
Die Kompilierung in fast allen Implementierungen hat einen inkrementellen Modus, so dass sie interaktiv verwendet werden kann. Alle können Dateien kompilieren. Einige haben Kompilierungsmodi zum Kompilieren von Dateigruppen.
Kurz gesagt: Sie gehen zusammen wie Erbsen und Karotten.
Kompilieren vs. Dolmetschen und Sprachtasten sind grundsätzlich getrennte Anliegen, da Sie alle möglichen Permutationen haben können. Auf der anderen Seite ist der "Grund" für das Auswählen des Kompilierens und nicht für das dynamische Tippen für ein Sprachdesign identisch: Leistung. Der "Grund" für die Auswahl der dynamischen Typisierung und Interpretation ist auch etwas verwandt.
Es ist keine feste Regel. Du kannst sie immer mischen. Sie können zum Beispiel Perl und Lisp kompilieren und C. interpretieren.
Tags und Links programming-languages compiler-construction interpreter dynamic-languages