Warum interpretiert langs sind meist ducktyped während kompiliert haben starke Typisierung?
Ich weiß nur nicht, dass es irgendeinen technischen Grund dafür? Ist es schwieriger zu implementieren, einen compiler für eine Sprache mit schwacher Typisierung? Was ist es?
- Es scheint, Sie sind convoluting einige Begriffe. Python, zum Beispiel, ist eine dynamisch typisierte Sprache mit ducktyping, aber es ist stark typisiert; C hat statischen Typen aber schwach typisiert ist.
- Ja, ich denke, ich bin dann. Danke für den Tipp, ich werde ich gehen google einige Definitionen und Klärung dieser Begriffe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Räumlichkeiten, die hinter der Frage ein bisschen dodgy. Es ist nicht wahr, dass interpretierte Sprachen sind meist ducktyped. Es ist nicht wahr, dass kompilierte Sprachen haben meist starke Typisierung. Die Art system, ist eine Eigenschaft der Sprache. Kompiliert vs. interpretiert ist eine Eigenschaft eines Umsetzung.
Beispiele:
Die Programmiersprache Scheme ist dynamisch typisiert (aka duck-typed), und es hat viele Dutzende interpretiert Implementierungen, aber auch einige feine native-code-Compiler, einschließlich Diebstahl, Gambit, und PLT-Scheme (einschließlich beide einem interpreter und einem JIT-compiler macht nahtlose übergänge).
Die Programmiersprache Haskell ist statisch typisiert; die zwei bekanntesten Implementierungen des interpreters HUGS und des Compilers GHC. Es gibt mehrere andere ehrenwerte Implementierungen split gleichmäßig zwischen kompilieren zu systemeigenem code (yhc) und interpretation (Helium).
Die Programmiersprache Standard ML ist statisch typisiert, und es hat viele native-code-Compiler, von denen einer der besten und am meisten aktiv gepflegt wird MLton, aber eine der sinnvollsten Implementierungen ist der interpreter Moskau ML
Der Programmiersprache Objective Caml ist statisch typisiert. Es kommt mit nur eine Implementierung (von der INRIA in Frankreich), aber diese Implementierung umfasst beide ein Dolmetscher und ein native-code-compiler.
Die Programmiersprache Pascal ist statisch typisiert, aber es wurde populär in den 1970er Jahren durch die hervorragende Umsetzung gebaut an der UCSD, die sich auf einer P-code-interpreter. In späteren Jahren feine native-code-Compiler verfügbar war, wie die IBM-Pascal/VS-compiler für die 370-Serie von Computern.
Die Programmiersprache C ist statisch typisiert, und heute fast alle Implementierungen kompiliert werden, aber in den 1980er Jahren diejenigen von uns glücklich genug, um mit Säbel-C wurden mit Hilfe eines Dolmetschers.
Dennoch es gibt eine Wahrheit, die hinter Ihrer Frage, so verdienen Sie eine durchdachte Antwort. Die Wahrheit ist, dass dynamisch typisierte Sprachen zu sein scheinen korreliert mit interpretiert Implementierungen. Warum könnte das sein?
Viele neue Sprachen definiert werden, indem eine Implementierung. Es ist einfacher zu bauen ein Dolmetscher als zu build a compiler. Es ist einfacher zu überprüfen dynamische Typen als zu überprüfen Sie statisch. Und wenn Sie schreiben, ein Dolmetscher, es gibt wenig performance-Vorteil der statische Typ-überprüfung.
Sofern Sie erstellen oder anpassen, eine sehr flexible polymorphe Typ-system, ein statisches Typsystem ist wahrscheinlich, dass Sie in der programmer ' s Art und Weise. Aber wenn Sie schreiben, ein Dolmetscher, ein Grund könnte sein, erstellen Sie eine kleine, leichte Umsetzung, die bleibt aus der programmer ' s Art und Weise.
In einigen interpretierte Sprachen, viele grundlegende Operationen sind so teuer, dass der zusätzliche Aufwand der überprüfung der Typen zur Laufzeit ist egal. Ein gutes Beispiel ist der Nachsatz: "wenn Sie gehen, zu laufen und ab und zu Rastern Bézier-Kurven an der Tropfen einen Hut, man wird sich nicht sträuben bei der überprüfung eines Typ-tag hier oder dort.
Übrigens, bitte vorsichtig sein, die Begriffe "starke" und "schwache" eingeben, weil Sie nicht haben, eine allgemein vereinbarte technische Bedeutung. Dagegen statische Typisierung bedeutet, dass Programme geprüft, bevor Sie ausgeführt wird, und ein Programm abgelehnt wird, bevor es beginnt. Dynamische Typisierung bedeutet, dass die Werte geprüft während Ausführung, und eine schlecht getippte operation kann das Programm veranlassen, zu stoppen oder anderweitig signal wird ein Fehler zur Laufzeit. Ein Hauptgrund für die statische Typisierung ist, um auszuschließen, Programme, die möglicherweise eine solche "dynamische typfehler". (Dies ist ein weiterer Grund, warum Menschen, die schreiben Dolmetscher sind oft weniger daran interessiert, die statische Typisierung; Ausführung erfolgt sofort nach der überprüfung von Typ, so dass die Unterscheidung und den Charakter der Garantie sind nicht so offensichtlich.)
Starke Typisierung in der Regel bedeutet, dass es keine Schlupflöcher in das Typ-system, in der Erwägung, dass schwache Typisierung bedeutet das Typ-system kann unterlaufen werden (Aufhebung von Garantien). Die Begriffe werden oft falsch verwendet, um zu bedeuten, statische und dynamische Typisierung.
Um den Unterschied zu sehen, denke, dass C: die Sprache ist auch Typ-geprüft, zur compile-Zeit (statische Typisierung), aber es gibt viele Schlupflöcher, man kann so ziemlich warf einen Wert beliebigen Typs in einen anderen Typ der gleichen Größe---insbesondere, können Sie cast Zeiger-Typen frei. Pascal war eine Sprache, die gedacht war, stark typisiert, aber bekanntlich hatte eine unvorhergesehene Lücke aufweist: eine Variante aufnehmen, ohne tag.
Implementierungen von stark typisierten Sprachen oft erwerben, die Lücken im Laufe der Zeit, in der Regel so, dass ein Teil des run-time-system implementiert werden kann, in der high-level-Sprache. Zum Beispiel, Objective Caml hat eine Funktion namens
Obj.magic
die die run-time-Effekt der Rücksendung argument, aber zur compile-Zeit konvertiert einen Wert beliebigen Typs zu einem anderen Typ. Mein Lieblings-Beispiel ist Modula-3, dessen Designer aufgerufen, Ihre Typ-casting konstruierenLOOPHOLE
.In der Zusammenfassung:
Statische vs dynamische ist die Sprache.
Kompiliert vs. interpretiert ist die Umsetzung.
Im Prinzip zwei Entscheidungen getroffen werden können und sind orthogonal, aber für sound-technischen Gründen dynamische Typisierung Häufig korreliert mit der interpretation.
Dem Grund, dass Sie die frühe Bindung (starke Typisierung) ist die Leistung. Mit der frühen Bindung, finden Sie den Speicherort der Methode zur compile-Zeit, so dass zur Laufzeit Sie bereits weiß, wo Sie lebt.
Jedoch mit der späten Bindung, die Sie haben zu gehen auf der Suche nach einer Methode, die scheint, wie die Methode, die der client-code aufgerufen. Und natürlich mit vielen, vielen Methodenaufrufen in einem Programm, das ist, was macht dynamische Sprachen "langsam".
Aber sicher, Sie konnte erstellen eine statisch kompilierte Sprache bedeutet, dass die späte Bindung, die würde negieren viele der Vorteile der statischen Kompilierung.
Es ist ziemlich viel, weil Leute, die schreiben, und verwenden Sie interpretierten Sprachen bevorzugen ducktyping, und denjenigen, die Sie entwickeln und verwenden kompilierte Sprachen bevorzugen starke explizite Eingabe. (Ich denke, der Konsens Grund dafür wäre irgendwo im Bereich von 90% zur Fehlervermeidung, und 10% für die Leistung.) Für die meisten Programme die heute geschrieben wird, ist die Geschwindigkeit Unterschied unwesentlich sein sollten. Microsoft Word hat laufen lassen auf p-code (nicht kompilierte) für - was - 15 Jahren?
Besten Fall in Punkt, den ich denken kann. Klassischen Visual Basic (VB6/VBA/etc.) Das gleiche Programm könnte sein, geschrieben in VB und lassen sich mit identischen Ergebnissen und vergleichbaren Geschwindigkeit entweder kompiliert oder interpretiert werden. Darüber hinaus haben Sie die Möglichkeit, Typ-Deklarationen (in der Tat Variablendeklarationen) oder nicht. Die meisten Menschen bevorzugte Art von Erklärungen, in der Regel zur Fehlervermeidung. Ich habe noch nie gehört oder gelesen, überall zu verwenden, geben Erklärungen für die Geschwindigkeit. Und dies geht zurück mindestens so weit wie zwei Mächte von der Größe in hardware-Geschwindigkeit und Kapazität.
Google ist immer eine Menge Aufmerksamkeit in letzter Zeit aufgrund Ihrer Arbeit auf einen JIT-compiler für javascript erfordern keine änderungen an der Sprache, oder erfordern eine Besondere Berücksichtigung seitens der Programmierer. In diesem Fall, der einzige Vorteil wird sein speed.
Da Programmiersprachen, die kompiliert werden müssen, um die Menge des verwendeten Speichers in Konto, wenn Sie kompiliert werden.
Wenn Sie etwas sehen wie:
in C++ der compiler spuckt code, behält sich die vier bytes des Speichers und weist das lokale symbol "a" zu Punkt, dass der Speicher. Wenn Sie hatte eine typeless scripting-Sprache wie javascript, die Dolmetscher, die hinter den kulissen ordnet den erforderlichen Speicher. Sie tun kann:
Es ist viel passiert zwischen diesen beiden Linien. Der Dolmetscher löscht den Speicher, weist der neue Puffer für die chars, dann weist der eine var zu zeigen, dass die neuen Speicher. In einer stark typisierten Sprache, es gibt keine Dolmetscher, die es schafft, dass für Sie und so muss der compiler schreiben Sie Anweisungen, die in Betracht Art.
Damit der Compiler hält, dass code aus kompilieren, damit die CPU somit nicht blind schreiben 12 bytes in vier byte-Puffer und verursachen Elend.
Den zusätzlichen Aufwand für einen compiler schreiben zusätzliche Anweisungen zum aufpassen geben würde verlangsamen die Sprache deutlich, und entfernen Sie den nutzen von Sprachen wie C++.
🙂
-nelson
EDIT in Antwort zu Kommentar
Ich weiß nicht viel über Python, daher kann ich darüber nicht so viel sagen. Aber Locker typedness verlangsamt sich die Laufzeit erheblich. Jede Anweisung, die dem interpreter (VM) fordert, hat zu evaulate, und wenn nötig, zu zwingen, die var in den erwarteten Typ. Wenn Sie haben:
Dann der Dolmetscher ist darauf zu achten, dass eine variable ist, und eine Zahl, dann müsste es zu zwingen, b in einer Reihe vor der Verarbeitung der Anweisung. Hinzufügen, dass der Aufwand für jede Anweisung, dass der VM ausgeführt wird und Sie haben ein Chaos auf Ihre Hände 🙂
Ich vermute, dass Sprachen mit dynamischen (Ente) - Typisierung beschäftigen lazy evaluation, die-begünstigt durch faule Programmierer, und faule Programmierer nicht gerne schreiben-Compiler 😉
x = 12 + y
,x
ist unmittelbar gebunden an eine gedacht, aber der thunk ausgewertet wird verzögert (später). Das ist zumindest meine intuition, wie lazy evaluation arbeitet in Haskell.Gibt es im wesentlichen zwei Gründe für die Verwendung der statischen Typisierung wird über duck typing:
Wenn Sie eine interpretierte Sprache ist, dann gibt es keinen compile-Zeit, die für die statische Fehlerprüfung stattfinden. Es geht einen Vorteil. Außerdem, wenn du schon den Aufwand für den interpreter, dann ist die Sprache schon nicht für alles verwendet werden performance-kritische, also das performance-argument hinfällig. Dies erklärt, warum die statisch typisierte, interpretierte Sprachen sind selten.
Gehen den anderen Weg, duck typing kann emuliert werden, zu einem großen Teil in statisch typisierten Sprachen, ohne völlig aufzugeben, die Vorteile der statischen Typisierung. Dieses erfolgt über eine der folgenden Optionen:
Dies erklärt, warum es wenige sind, die dynamisch typisierten, kompilierten Sprachen.
Sprachen mit schwacher Typisierung kompiliert werden kann, zum Beispiel, Perl5, und die meisten Versionen von Lisp sind kompilierte Sprachen. Die performance-Vorteile zu kompilieren, sind oft verloren, weil viel von der Arbeit, die Sprache, die Laufzeit zu erbringen hat, ist zu tun mit der Bestimmung, welche Art eine dynamische variable wirklich hat zu einem bestimmten Zeitpunkt.
Nehmen Sie zum Beispiel folgenden code in Perl:
Ist es natürlich ziemlich schwierig für den compiler, um zu bestimmen, welche Art $x hat wirklich an einem bestimmten Punkt in der Zeit. In der Zeit der print-Anweisung, die Arbeit muss getan werden, um das herauszufinden. In einer statisch typisierten Sprache, die Art ist vollständig bekannt, so dass die performance zur Laufzeit erhöht werden kann.
Eine Vermutung:
In einer kompilierten Sprache, ein system (der compiler) zu sehen bekommt, sind alle code erforderlich, um starke Typisierung. Dolmetscher in der Regel nur ein klein wenig das Programm zu einer Zeit, und so kann das nicht tun, die Art von cross-Prüfung.
Aber dies ist nicht eine harte und schnelle Regel - es wäre durchaus möglich, eine stark typisierte, interpretierte Sprache, aber das würde gegen die Art von "lose" Allgemeinen fühlen Sie sich von interpretierten Sprachen.
Einige Sprachen gemeint sind, laufen perfekt in außergewöhnlichen Bedingungen und geopfert werden für schreckliche Leistung, die Sie laufen in während der außergewöhnlichen Bedingungen, daher sehr starke Typisierung. Andere waren nur gedacht, um das Gleichgewicht mit zusätzlichen Verarbeitung.
Mal, es gibt noch mehr im Spiel als nur die Eingabe. Nehmen Sie ActionScript zum Beispiel. 3.0 eingeführt stärker eingeben, aber dann wieder ECMAScript-ermöglicht Ihnen das ändern von Klassen, wie Sie sehen, passen, zur Laufzeit und ActionScript hat die Unterstützung für dynamische Klassen. Sehr ordentlich, aber die Tatsache, Sie sind die besagt, dass dynamische Klassen sollten nicht verwendet werden, die in "standard" - builds bedeutet, es ist ein no-no, wenn Sie brauchen, um es zu spielen safe.