F: Ich habe oft die Behauptung gehört, dass dynamisch getippte Sprachen produktiver sind als statisch getippte Sprachen. Was sind die Gründe für diesen Anspruch? "
Das hat historische Gründe. In den letzten Jahrzehnten waren dynamische Sprachen unbestreitbar weitaus produktiver als statische Sprachen (wenn auch deutlich langsamer). Perl ist deutlich produktiver als C, wenn Sie beide kennen und die jeweilige Aufgabe dies zulässt. Im Laufe der Zeit haben sich die Sprachen jedoch stark voneinander geliehen, und neuere Sprachen verringern die Kluft (sowohl in Bezug auf Produktivität als auch in Bezug auf Leistung).
Hier sind einige Punkte zu beachten:
Müllabfuhr : Müllabfuhr ist ein enormer Produktivitätsschub. Ich glaube, Java war die erste statische Standardsprache mit GC. Davor bedeutete statisch im Wesentlichen manuelle Speicherverwaltung. (Hinweis: Hier und im Folgenden werde ich nur die Hauptsprachen betrachten. Es gibt viele experimentelle und Nischensprachen, die Gegenbeispiele zu jedem Punkt liefern, den ich mache.)
Speichersicherheit : Dies ist eine Produktivitätsverbesserung, bei der Sie sich keine Sorgen machen müssen, wenn Sie sich in den Fuß schießen. Vor "verwalteten" statischen Sprachen wie Java bedeutete statisch normalerweise direkten Speicherzugriff. Das Debuggen ist auch ein Teil der Produktivität, und ein unsicherer Speicherzugriff kann zu wirklich undurchsichtigen Fehlern führen.
Umständliche Systeme. Vor der Einführung parametrisierter Typen (wie Vorlagen oder Generika) in statischen Sprachen waren die Einschränkungen der Systeme für statische Typen häufig eine Belastung. In Java mussten Sie beispielsweise jedes Mal, wenn Sie einen Artikel aus einer Sammlung auswählten, explizit einen Downcast ausführen. Sie haben also den syntaktischen Aufwand einer Besetzung und keine Typensicherheit. Angesichts der Tatsache, wie allgegenwärtig Sammlungen in der Programmierung sind, war dies ein großer Nachteil.
Das Deklarieren des Typs von allem ist eine Menge redundanter Typisierung, aber mit moderner Typisierung kann dies erheblich reduziert werden.
Große Standardbibliothek. Python wurde wegen der großen Standardbibliothek berühmt als "inklusive Batterien" beworben. Dies ist im Vergleich zu C, die eine sehr minimalistische Standardbibliothek haben. Aber mit Plattformen wie Java und .net wird eine riesige Standardbibliothek zum Standard, und neuere Sprachen wie Scala und F # erben dies "kostenlos".
Erstklassige Datenstrukturen. Dynamische Sprachen wie Perl und Python verfügen über erstklassige Datenstrukturen wie Listen und Maps mit praktischen syntaktischen Verknüpfungen für allgemeine Operationen. Im Vergleich dazu verfügt C über keine integrierten Sammlungen mit Ausnahme von Arrays mit fester Größe.
Closures und Lambda-Syntax - dynamische Sprachen hatten dies normalerweise von Anfang an, aber statische Sprachen haben dies übernommen, zuletzt Java.
REPL die Fähigkeit , schnell Schnipsel Code zu testen , ist interaktiv ein großer Segen. Obwohl IDE-Tools, wie das "unmittelbare" Fenster in Visual Studio, statische Sprachen in gewissem Maße emulieren können.
Erweitertes Tooling - Zusätzlich zu den oben genannten Punkten, in denen statische Sprachen dem Komfort dynamischer Sprachen immer näher kommen, nutzen moderne Editoren die statische Analyse so, dass dynamische Sprachen nur schwer miteinander übereinstimmen können. Zum Beispiel können Redakteure sichere automatische Refactorings bereitstellen, was in einer dynamischen Sprache streng genommen unmöglich ist.
Fazit: Historisch gesehen stimmte das, aber heute ist die Antwort weniger eindeutig.
F: Also, was kann man für die Produktivität beim dynamischen Tippen sagen, was wirklich ein Vorteil des Typmodells selbst ist?
Es ist etwas schwierig, das dynamische Typisierungsmodell von dynamischen Sprachen zu trennen, aber als Beispiel hat C # im Laufe der Zeit mehr und dynamischere Funktionen übernommen, obwohl es als Kern eine statische Sprache ist. Dies ist ein echter Beweis für den Nutzen des dynamischen Typmodells. Beispiele:
Reflexion
Reflexion ist im Grunde eine dynamische Schreibfunktion. Sie überprüfen die Objekttypen zur Laufzeit nach der Kompilierungszeit. Als es eingeführt wurde, war es ein bisschen verpönt, aber in C # wird die Verwendung von Reflektion immer allgegenwärtiger, zum Beispiel verwendet ASP.Net MVC stark Reflektion.
Attribute
Attribute sind ein Beispiel für die dynamische Typisierung. Sie können einer Klasse zur Kompilierungszeit beliebige Attribute hinzufügen und dann zur Laufzeit (durch Reflektion) inspizieren und darauf basierende Objekte bearbeiten. So etwas wie MEP ist im Grunde ein Erweiterungsframework, das auf einem dynamischen Typmodell basiert.
Linq to SQL, EF mv.
Die verschiedenen Linq-Transformer prüfen Abfragen als Laufzeitobjekte und generieren SQL-Code im laufenden Betrieb. Es wird nicht dynamischer als das Untersuchen von Code zur Laufzeit. CodeDom ist die andere Seite der Medaille, auf der Code zur Laufzeit generiert werden kann
Roslyn
Roslyn implementiert im Grunde genommen das eval
, was einst als bestimmendes Merkmal einer wirklich dynamischen Sprache galt.
Dynamisch
Der dynamic
-Typ ist die explizit dynamischste Funktion in C # und wird verwendet, um die Interaktion mit externen Objekten und Sprachen einfacher und produktiver zu gestalten. Es wird jedoch auch in Asp.net MVC verwendet.
Der Nutzen aller oben genannten Merkmale zeigt, dass das dynamische Modell selbst in einer statischen Sprache mit parametrisierten Typen, strukturellen Typen und Typinferenz deutliche Vorteile hat .