Frage

Was sind die Vorteile und Grenzen der dynamischen Typ Sprachen im Vergleich zu statischen Typ Sprachen?

Siehe auch : was mit der Liebe dynamische Sprachen (ein weit argumentativer Faden ...)

War es hilfreich?

Lösung

Die Fähigkeit des Interpreters Typ und Typkonvertierungen abzuleiten macht schnellere Entwicklungszeit, aber es kann auch Laufzeitfehler provozieren, die Sie gerade nicht in einer statisch typisierten Sprache erhalten können, wo man sich bei der Kompilierung fangen. Aber das eine ist besser (oder auch wenn das immer wahr) wird heiß in der Gemeinde diskutiert in diesen Tagen (und seit langer Zeit).

Eine gute Sicht auf das Thema ist von statische Typisierung Wo möglich, dynamische Typisierung, wenn nötig: Das Ende des Kalten Krieges zwischen Programmiersprachen von Erik Meijer und Peter Drayton bei Microsoft:

  

Die Befürworter der statischen Typisierung argumentieren, dass   die Vorteile der statischen Typisierung   umfassen frühere Erkennung von   Programmierfehler (z.B. Verhindern   eine ganze Zahl mit einem Booleschen Zugabe),   bessere Dokumentation in Form von   Typ Signaturen (z.B. Einbeziehung   Anzahl und Art der Argumente, wenn   Auflösung von Namen), mehr Möglichkeiten   für Compileroptimierungen (z.B.   Ersetzen virtuelle Anrufe durch direkte   ruft, wenn die genaue Art der   Empfänger bekannt statisch),   erhöhte Laufzeiteffizienz (z.B. nicht   alle Werte brauchen ein dynamisches tragen   Typ) und eine bessere Design-Zeit   Entwickler Erfahrung (zum Beispiel des Wissen   Art des Empfängers, kann der IDE   präsentiert ein Dropdown-Menü mit allen   anwendbar Mitglieder). statische Typisierung   Fanatiker versuchen, uns glauben zu machen, dass   „Gut getippt Programme können nicht falsch liegen“.   Während dies sicherlich klingt   beeindruckend, ist es ein eher vacuous   Aussage. Statische Typprüfung ist ein   Kompilierung-Abstraktion von der   Laufzeitverhalten des Programms und   daher ist es unbedingt nur zum Teil   klingen und unvollständig. Das bedeutet, dass   Programme können immer noch schief gehen wegen   Eigenschaften, die durch die nicht verfolgt werden   Typ-Checker, und dass es   Programme, die, während sie nicht gehen können   falsch kann nicht typgeprüft werden. Das   Impuls für die Herstellung weniger statische Typisierung   Teil- und vollständigere Ursachen Typ   Systeme werden zu kompliziert   und exotisch wie durch Konzepte erlebt   wie „Phantomtypen“ [11] und   „Wackelig Typen“ [10]. Das ist wie   versucht, einen Marathon mit einem Ball laufen zu lassen   und Kette gebunden an Ihrem Bein und   dass Sie triumphierend rief fast   wenn Sie gerettet hat es sogar noch   nach der ersten Meile.

     

Die Befürworter der dynamisch typisierten   Sprachen argumentieren, dass statische Typisierung ist   zu starr, und dass die Weichheit   dynamisch macht Sprachen sie   ideal für Prototyping-Systeme   mit wechselnden oder unbekannten Anforderungen,   oder dass die Interaktion mit anderen Systemen   daß unvorhersehbar (Datenänderung und   Anwendungsintegration). Na sicher,   dynamisch typisierten Sprachen   unentbehrliche mit wirklich für den Umgang   dynamische Programmverhalten wie   Verfahren Abfangen, dynamische Belastung,   mobiler Code, Runtime-Reflexion, usw.   In der Mutter aller Papiere auf   Scripting [16], John Ousterhouts argumentiert   dass statisch typisierte Systeme   Programmiersprachen machen Code weniger   wiederverwendbar, ausführlicher, nicht mehr sicher,   und weniger ausdrucksvoll als dynamisch   typisierten Skriptsprachen. Diese   Argument wird parroted buchstäblich von vielen   Befürworter der dynamisch typisierten   Skriptsprachen. Wir argumentieren, dass   Dies ist ein Irrtum und fällt in den   gleiche Kategorie wie das Argument, dass die   Wesen der deklarative Programmierung ist   Beseitigung Zuordnung. Oder wie John   Hughes sagt [8], ist es eine logische   Unmöglichkeit macht eine Sprache mehr   mächtig durch Merkmale weggelassen wird.   Verteidigung der Tatsache, dass alle zu verzögern   Typ-Überprüfung zur Laufzeit ist eine gute   Ding, spielt Strauß-Taktik mit   die Tatsache, dass Fehler abgefangen werden sollen   so früh im Entwicklungsprozess als   möglich.

Andere Tipps

Statische Typsysteme suchen bestimmte Fehler statisch zu beseitigen, um das Programm Inspektion ohne sie zu laufen und versuchen, Solidität in gewisser Hinsicht zu beweisen. Einige Typsysteme sind in der Lage, mehr Fehler als andere zu fangen. Zum Beispiel kann C # Null-Zeiger-Ausnahmen beseitigen, wenn sie richtig verwendet, während Java keine solche Macht hat. Twelf hat eine Art System, das garantiert, dass Beweise endet "Lösung" der Halteproblem .

Allerdings ist kein Typ-System perfekt. Um eine bestimmte Klasse von Fehlern zu beseitigen, müssen sie lehnen auch bestimmte absolut gültige Programme, die die Regeln verletzen. Aus diesem Grunde hat twelf nicht wirklich das Halteproblem zu lösen, es nur vermeidet, indem eine große Anzahl von absolut gültigen Beweisen, die auf seltsame Weise beenden passieren werfen. Ebenso lehnt Javas Typsystem PersistentVector Implementierung des Clojure aufgrund seiner Verwendung von heterogenen Arrays. Es arbeitet zur Laufzeit, aber die Art System sie nicht überprüfen kann.

Aus diesem Grunde bieten die meisten Systeme vom Typ „entkommen“, Möglichkeiten, um die statische Prüfung außer Kraft zu setzen. Für die meisten Sprachen nehmen diese die Form des Gießens, obwohl einige (wie C # und Haskell) ganze Modi haben, die als „unsicher“ gekennzeichnet sind.

Subjektiv mag ich statische Typisierung. Umgesetzt richtig (Hinweis: nicht Java), ein statisches Typsystem eine große Hilfe Fehler in der Ausmerzung sein kann, bevor sie das Produktionssystem zum Absturz bringen. Dynamisch typisierten Sprachen neigen dazu, mehr Unit-Tests erfordern, die bei den besten Zeiten langweilig ist. Auch statisch typisierten Sprachen können bestimmte Merkmale aufweisen, die entweder unmöglich oder unsicher in dynamischen Systemen des Typs ( implizite Konvertierungen in dem Sinne). Es ist alles eine Frage der Anforderungen und subjektiven Geschmack. Ich würde die nächsten Eclipse-in Ruby nicht mehr bauen, als ich versuchen würde, einen Backup-Skript in Assembly zu schreiben oder einen Kernel mit Hilfe von Java patchen.

Oh, und Leute, die sagen, dass " x Typisierung ist 10-mal produktiver als y Eingabe von" einfach bläst Rauch. Dynamische Typisierung in vielen Fällen „Gefühl“ schneller, aber es verliert Boden, wenn Sie tatsächlich versuchen, Ihre Phantasie Anwendung machen run . Ebenso kann statische Typisierung scheint, wie es das perfekte Sicherheitsnetz ist, aber ein Blick auf einige der komplizierteren generische Typdefinitionen in Java sendet die meisten Entwickler huschen für Auge Scheuklappen. Auch bei Systemen des Typs und der Produktivität, gibt es keinen Königsweg.

Schlussbemerkung: nicht über die Leistung sorgen, wenn statisch mit dynamischer Typisierung zu vergleichen. Moderne JITs wie V8 und Tracemonkey kommen gefährlich nahe an-statische Sprache Leistung. Auch die Tatsache, dass Java kompiliert tatsächlich bis zu einem in sich dynamische Zwischensprache sollte ein Hinweis darauf sein, dass für die meisten Fälle, dynamische Typisierung nicht die enorme Leistungs-Killer ist, dass einige Leute machen es aus sein.

Nun, beide sind sehr, sehr sehr sehr falsch verstanden und auch zwei völlig verschiedene Dinge. , die nicht gegenseitig ausschließen .

Statische Typen sind eine Beschränkung der Grammatik der Sprache. Statisch typisierte langauges konnte streng gesagt werden, daß nicht kontextfrei sein. Die einfache Wahrheit ist, dass es unbequem wird die Sprache sanely in kontextfreien Grammatiken zum Ausdruck bringen, dass nicht alle seine Datenvektoren einfach als Bit nicht behandeln. Statische Typsysteme sind Teil der Grammatik der Sprache, wenn überhaupt, sie es einfach beschränken mehr als ein kontextfreie Grammatik könnte, grammatische prüft also wirklich in zwei Durchgängen über die Quelle passieren. Statische Typen der mathematischen Begriff der Typentheorie entsprechen, Typentheorie in der Mathematik beschränkt einfach die Rechtmäßigkeit einiger Ausdrücke. Wie kann ich nicht sagen 3 + [4,7] in Mathematik, dies wegen der Art Theorie ist.

Statische Typen sind also nicht ein Weg, um ‚Fehler zu vermeiden‘ aus theoretischer Sicht sind sie eine Begrenzung der Grammatik. Tatsächlich, vorausgesetzt, dass +, 3 und Intervalle die üblichen Satz theoretischen Definitionen haben, wenn wir die Art System zu entfernen 3 + [4,7]has ein ziemlich gut definierte Ergebnis, dass ein Satz ist. ‚Laufzeittyp Fehler‘ theoretisch nicht existieren, das Typsystem der praktischen Anwendung ist Operationen zu verhindern, dass den Menschen würde keinen Sinn machen. Die Operationen sind nach wie vor nur die Verschiebung und Manipulation von Bits natürlich.

Der Haken dabei ist, dass ein Typ-System kann nicht entscheiden, ob solche Operationen auftreten wollen oder nicht, ob es ablaufen würde. Wie in partitionieren genau die Menge aller möglichen Programme in solche, die einen ‚Typ Fehler‘ haben werden, und solche, die es nicht sind. Es kann nur zwei Dinge tun:

1: beweisen, dass Typ-Fehler in einem Programm
ereignen werden 2: beweisen, dass sie nicht gehen, um in einem Programm auftreten

Dies könnte scheinen, wie ich mich selbst zu widersprechen. Aber was für ein C oder Java-Typ-Checker macht, ist es ein Programm als ‚ungrammatical‘ ablehnt, oder wie sie es nennt ‚Typ Fehler‘, wenn es nicht Erfolg bei 2. Es kann sie nicht beweisen nicht auftreten würde, das bedeutet nicht, dass sie auftreten, werden nicht, es bedeutet nur, sie kann es nicht beweisen. Es könnte sehr gut sein, dass ein Programm, das einfach abgelehnt wird keine Art Fehler hat, weil sie nicht durch den Compiler nachgewiesen werden können. Ein einfaches Beispiel ist if(1) a = 3; else a = "string";, sicher, da es immer wahr, der else-Zweig wird nie im Programm ausgeführt werden, und kein Typen Fehler wird auftreten. Aber es kann nicht diese Fälle in allgemeiner Form unter Beweis stellen, so dass es abgelehnt. Dies ist die größte Schwäche von vielen statisch typisierten Sprachen, Sie gegen sich selbst zu schützen, sind Sie unbedingt auch in den Fällen geschützt Sie brauchen es nicht.

Aber entgegen der landläufigen Meinung gibt es auch statisch typisierten Sprachen sind, die durch Prinzip arbeiten 1. Sie lehnen einfach alle Programme, von denen sie nachweisen können, eine Art Fehler verursachen geht, und übergeben Sie alle Programme, von denen sie nicht . So kann es sie erlauben Programme, welche Art von Fehlern in ihnen haben, ein gutes Beispiel zu sein typisierten Schläger, es ist Hybrid zwischen dynamischer und statischer Typisierung. Und einige würden argumentieren, dass Sie das Beste aus beiden Welten in diesem System zu erhalten.

Ein weiterer Vorteil der statischen Typisierung ist, dass Arten zum Zeitpunkt der Kompilierung bekannt sind, und somit kann der Compiler dies verwenden. Wenn wir in Java tun "string" + "string" oder 3 + 3, beide + Token im Text am Ende repräsentieren eine ganz andere Operation und Datum, der Compiler weiß, welche allein von den Typen zu wählen.

Nun, ich werde eine sehr umstrittene Aussage hier machen, aber mit mir tragen. ‚dynamische Typisierung‘ existiert nicht

Klingt sehr umstritten, aber es ist wahr, dynamisch typisierten Sprachen aus einer theoretischen Perspektive sind untypisierten . Sie sind nur statisch typisierten Sprachen mit nur einer Art. Oder einfach gesagt, sie Sprachen, die in der Tat sind grammatically erzeugt durch eine kontextfreie Grammatik in der Praxis.

Warum sie nicht Typen? Weil jeder Betrieb definiert ist und auf jedem operant erlaubt, was ist ein ‚Laufzeittyp Fehler‘ genau? Es ist von einem theoretischen Beispiel rein einen Nebeneffekt . Wenn print("string") zu tun, die eine Zeichenfolge druckt eine Operation ist, so ist auch length(3), die erstere die Nebenwirkung des Schreibens string auf die Standardausgabe hat, letztere einfach error: function 'length' expects array as argument., das ist es. Es besteht aus einer theoretischen Perspektive nicht so etwas wie eine dynamisch typisierte Sprache. Sie sind untypisierten

In Ordnung, der offensichtliche Vorteil von ‚dynamisch typisierte‘ Sprache Ausdruckskraft ist, ist eine Art System nichts anderes als eine Beschränkung der Ausdruckskraft. Und im Allgemeinen, Sprachen mit einem Typ-System in der Tat würden ein definiertes Ergebnis für alle jene Vorgänge, die nicht erlaubt sind, wenn der Typ System einfach ignoriert wurde, würden die Ergebnisse einfach keinen Sinn für die Menschen machen. Viele Sprachen verlieren ihre Turing Vollständigkeit nach einem Typ-System angewandt wird.

Der offensichtliche Nachteil ist die Tatsache, dass Operationen auftreten können, welche Ergebnisse produzieren würde, die für den Menschen unsinnig sind. Um dies zu verhindern, dynamisch typisierten Sprachen neu definieren typischerweise jene Operationen, anstatt dass unsinniges Ergebnis produziert sie es neu definieren einen Fehler die Nebenwirkung zu haben, der das Schreiben aus, und möglicherweise das Programm ganz zu stoppen. Dies ist kein ‚Fehler‘ überhaupt in der Tat impliziert die Sprachspezifikation dies in der Regel, das ist so viel Verhalten der Sprache als eine Zeichenfolge aus einer theoretischen Perspektive zu drucken. Typ-Systeme so den Programmierer zwingen, den Fluss des Codes zur Vernunft zu, um sicherzustellen, dass dies nicht geschieht. Oder in der Tat, die Vernunft, so dass es hat passieren kann, auch in einigen Punkten für das Debuggen nützlich sein, die zeigt, dass es nicht ein ‚Fehler‘ an alle, aber eine gut definierte Eigenschaft der Sprache. In der Tat, der einzige Überrest ‚dynamischer Typisierung‘, die meisten Sprachen haben bewacht gegen eine Division durch Null. Dies ist, was dynamische Typisierung ist, gibt es keine Typen, gibt es keine mehr Typen sind als Null ist eine andere Art als alle anderen Zahlen. Was die Leute nennen einen ‚Typ‘ ist nur eine andere Eigenschaft eines Datums, wie die Länge eines Arrays oder das erste Zeichen einer Zeichenkette. Und viele dynamisch typisierten Sprachen können Sie Dinge wie "error: the first character of this string should be a 'z'" schreiben.

Ein andere Sache ist, dass dynamisch typisierten Sprachen den Typen zur Laufzeit zur Verfügung haben und in der Regel kann es und damit umgehen und daraus entscheiden. Natürlich, in der Theorie ist es nicht anders als das erste Zeichen eines Arrays zuzugreifen und zu sehen, was es ist. In der Tat können Sie Ihre eigene Dynamik C machen, nur nur eine Art, wie lange long int verwenden und die ersten 8 Bits davon benutzen, um Ihren ‚Typen‘ zu speichern, in und Schreibfunktionen entsprechend, dass der Check für sie und führt Float oder Integer-Addition. Sie haben eine statisch typisierte Sprache mit einer Art oder einer dynamischen Sprache.

In der Praxis lassen sich alle Shows, statisch typisierten Sprachen werden im Rahmen des Schreibens kommerzielle Software im Allgemeinen verwendet, während dynamisch typisierten Sprachen sind in der Regel im Zusammenhang verwendet werden, einige Probleme zu lösen und einige Aufgaben zu automatisieren. Das Schreiben von Code in statisch typisierten Sprachen dauert einfach lange und ist umständlich, weil man nicht Dinge tun können, die Sie wissen wollen, erweisen sich in Ordnung, aber das Typsystem noch schützt Sie vor sich selbst für Fehler, die Sie nicht machen. Viele Programmierer nicht einmal erkennen, dass sie dies tun, weil sie in ihrem System ist, aber wenn man in statischen Sprachen kodieren, Sie arbeiten oft rund um die Tatsache, dass das Typsystem werden Sie Dinge nicht lassen, die nicht schief gehen kann, weil es nicht beweisen kann es nicht falsch gehen.

Wie ich erwähnte, ‚statisch typisierte‘ im Allgemeinen bedeutet, Fall 2, schuldig, bis ihre Unschuld bewiesen. Aber einige Sprachen, die Ableitung nicht ihre Art System von Typ Theorie bei alle Verwendung Regel 1: Innocent bis zum Beweis guilty, das könnte die ideale Hybrid sein. Also, vielleicht typisierten Racket ist für Sie.

Auch gut für ein absurdes und extremes Beispiel, ich bin zur Zeit der Sprache der Umsetzung, wo ‚Typen‘ wirklich das erste Zeichen eines Arrays sind, sind sie Daten, Daten des ‚Typs‘, ‚Typ‘, die selbst eine Art und Datum, der einzige Bezugspunkt, der sich als eine Art hat. Typen sind nicht begrenzt oder beschränkt statisch, sondern neue Typen auf Basis von Laufzeitinformationen erzeugt werden können.

Vielleicht ist der größte „Nutzen“ der dynamischen Typisierung ist die flachere Lernkurve. Es gibt kein Typsystem zu lernen und keine nicht-triviale Syntax für Grenzfälle, wie beispielsweise Typen Einschränkungen. Das macht dynamische Typisierung zugänglich viel mehr Menschen und machbar für viele Menschen, für die anspruchsvollen statische Typsysteme sind außer Reichweite. Folglich dynamische Typisierung hat sich in den Kontext der Bildung gefangen (zB Scheme / Python am MIT) und domänenspezifische Sprachen für Nicht-Programmierer (zB Mathematica ). Dynamische Sprachen sind auch in Nischen gefangen, wo sie wenig oder gar keine Konkurrenz haben (zum Beispiel Javascript).

Die knappste-dynamisch typisierten Sprachen (zB Perl, APL, J, K, Mathematica ) sind Domain-spezifisch und können als die knappste statisch typisierten Sprachen (zB Universal deutlich prägnanter sein OCaml ) in den Nischen sie entworfen wurden.

Die wichtigsten Nachteile der dynamischen Typisierung sind:

  • Laufzeittypfehler.

  • Kann sein sehr schwierig oder sogar praktisch unmöglich, das gleiche Maß an Korrektheit zu erreichen und erfordert wesentlich mehr Tests.

  • Keine Compiler-verify-Dokumentation.

  • Schlechte Leistung (in der Regel während der Laufzeit, aber manchmal bei der Kompilierung statt, zum Beispiel Stalin Scheme) und unvorhersehbare Entwicklung aufgrund Abhängigkeit von hoch entwickelten Optimierungen.

Persönlich wuchs ich auf dynamische Sprachen, aber würden sie mit einem 40' Pol als Profi nicht berühren, es sei denn es gibt keine andere praktikable Möglichkeiten waren.

Von Artima der Typing: Stark gegen Schwach, Static vs. dynamische Artikel:

  

starke Typisierung verhindert Operationen zwischen mismatched Typen zu mischen. Um Arten zu mischen, müssen Sie eine explizite Umwandlung verwenden

     

schwache Typisierung bedeutet, dass Sie Typen ohne eine explizite Umwandlung mischen

In der Zeitung Pascal Costanza, Dynamische oder statische Typisierung - Ein Muster-Based Analyse (PDF), er behauptet, dass in einigen Fällen, statische Typisierung fehleranfälliger als dynamische Typisierung ist. Einige statisch typisierten Sprachen zwingen Sie manuell dynamische Eingabe, um zu emulieren „The Right Thing“ zu tun. Es wird diskutiert unter Lambda the Ultimate .

Es hängt vom Kontext. Es gibt eine Menge Vorteile, die dynamische typisierte System geeignet sind sowie für stark typisierte. Ich bin der Meinung, dass der Fluss von dynamischen Typen Sprache schneller ist. Die dynamischen Sprachen sind nicht mit Klassenattributen und Compiler Denken gezwungen, was in Code los ist. Sie haben einige ein bisschen Freiheit. Darüber hinaus in der Regel die dynamische Sprache ist ausdrucksstark und Ergebnis in weniger Code, was gut ist. Trotz dieser, ist es mehr fehleranfällig, die auch fraglich ist, und hängt mehr von Unit-Test-Abdeckung. Es ist einfach Prototyp mit dynamischen lang, aber der Wartung kann Alptraum werden.

Der Hauptgewinn gegenüber statischem typisierten System ist IDE-Unterstützung und sicher statischer Analysator Code. Sie werden selbstbewusster Code nach jeder Codeänderung. Die Wartung ist Frieden des Kuchens mit solchen Werkzeugen.

Es gibt viele verschiedene Dinge über statische und dynamische Sprachen. Für mich ist der größte Unterschied, dass in dynamischen Sprachen die Variablen keine festen Typen haben; stattdessen werden die Typen auf Werte gebunden. Aus diesem Grunde, der genaue Code, der ausgeführt wird unbestimmt ist erst zur Laufzeit.

Anfang oder naive Implementierungen ist dies eine große Leistung ziehen, aber die moderne JITs bekommen tantalizingly Nähe der besten Sie mit der Optimierung statischer Compiler erhalten können. (In einigen Rand Fällen sogar besser als das).

Es geht um das richtige Werkzeug für den Job. Weder ist besser 100% der Zeit. Beide Systeme wurden von Menschen und haben Fehler erstellt. Sorry, aber wir saugen und perfekt, Sachen.

ich dynamische Typisierung mögen, weil es mir aus dem Weg bekommt, aber ja Laufzeitfehler einschleichen können, dass ich nicht für planten. Wo, wie statische Typisierung kann die oben genannten Fehler beheben, aber einen Anfänger (in typisierten Sprachen) Programmierer verrückt versuchen, zwischen einem konstanten char und einem String fahren zu werfen.

statische Typisierung: Die Sprachen wie Java und Scala sind statisch typisierten.

Die Variablen müssen definiert und initialisiert, bevor sie in einen Code verwendet werden.

für ex. int x; x = 10;

System.out.println (x);

Dynamische Typisierung: Perl ist eine dynamische typisierte Sprache.

Variablen müssen werden nicht initialisiert, bevor sie in Code verwendet werden.

y = 10; Verwenden Sie diese Variable im späteren Teil des Codes

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top