Interpreter und dynamisch typisierte Sprachen

8

Warum werden Programme mit dynamisch typisierten Sprachen normalerweise interpretiert und nicht kompiliert?

    
Bobby S 08.12.2010, 21:25
quelle

6 Antworten

5

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.

    
caveman 08.12.2010, 21:45
quelle
3

Sie beobachten eine nicht-kausale Korrelation:

  • Dynamische Typisierung und Interpretation korrelieren, weil beide einfach zu implementieren sind.
  • Statische Typisierung und Kompilierung korrelieren, weil beide zu vorhersagbar guten Ergebnissen führen.

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.

    
Jon Harrop 30.11.2013 19:37
quelle
2

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.

    
Corbin March 08.12.2010 22:09
quelle
1

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.

    
Rainer Joswig 09.12.2010 05:55
quelle
0

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.

    
Andrew White 08.12.2010 21:33
quelle
-8
___ qstntxt ___

Warum werden Programme mit dynamisch typisierten Sprachen normalerweise interpretiert und nicht kompiliert?

    
___ answer20304772 ___

Sie beobachten eine nicht-kausale Korrelation:

  • Dynamische Typisierung und Interpretation korrelieren, weil beide einfach zu implementieren sind.
  • Statische Typisierung und Kompilierung korrelieren, weil beide zu vorhersagbar guten Ergebnissen führen.

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.

    
___ answer4392876 ___

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.

    
___ antwort4392613 ___

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.

    
___ qstnhdr ___ Interpreter und dynamisch typisierte Sprachen ___ answer4392602 ___

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.

    
___ answer4395301 ___

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.

    
___ tag123compilerconstruction ___ Das Tag compiler-construction sollte auf Fragen zur Programmierung von Compilern oder zu Fragen zum detaillierten Innenleben von Compilern angewendet werden. NUTZEN SIE NICHT für Fragen zum * Verwenden * spezifischer Compiler oder Kompilierungsfehler. ___ tag123interpreter ___ Ein Interpreter ist ein Programm, das Anweisungen ausführt, d. h. ausführt, die in einer Programmiersprache geschrieben sind. Der Tag [Dolmetscher] sollte bei Fragen zur Programmierung von Dolmetschern oder für Fragen zum detaillierten Innenleben von Dolmetschern angewendet werden. Verwenden Sie [interpreter-pattern] (möglicherweise mit diesem Tag) für Fragen zum Entwurfsmuster der Gang of Four. ___ tag123programminglanguages ​​___ Eine Programmiersprache ist eine künstliche Sprache, die entworfen wurde, um Berechnungen auszudrücken, die von einer Maschine ausgeführt werden können. ** Bitte beachten Sie: ** Wie anderswo auf Stack Overflow, Ressourcen- und Tutorial-Empfehlungsanfragen, Anfragen nach Listen von Dingen ("welche Sprachen haben diese Funktion ...") und übermäßig meinungsbasiert ("Was ist das Beste? ... ") Fragen sind nicht Thema. ___ tag123dynamiclanguages ​​___ Dynamische Sprachen sind eine Klasse von High-Level-Programmiersprachen, deren Verhalten zur Laufzeit und nicht zur Kompilierzeit bestimmt wird. ___ answer4392699 ___

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.

    
___
TomaszK 08.12.2010 21:34
quelle