2010-07-19 2 views
12

Wie oft nutzen Sie dynamisches Tippen auf eine Weise, die in einer statisch typisierten Sprache nicht möglich wäre?Wo profitieren Sie von dynamischer Typisierung?

Was mich interessiert, ist, wie oft diese innerhalb der realen Welt (anstatt Demo) Code verwendet werden?

Antwort

1

Theoretisch können Sie dynamische Typisierung in den meisten statisch typisierten Sprachen "simulieren", indem Sie Werte in einer Art von markierter Union codieren und alle Operationen basierend auf den Eingabe- "Typen" (tatsächlich den Eingabewerten) korrekt verhalten. Natürlich müssen Sie dann eine Reihe von Laufzeitfehlerverhalten einführen, die auftreten, wenn Sie unsinnige Operationen mit diesen Werten begegnen.

Die meisten Dinge, die es sehr, sehr schwer tun würde, sind Dinge, die entweder riskant oder nur falsch sind. Eine groß angelegte Metaprogrammierung ist in einer dynamisch typisierten Sprache viel einfacher, da die Reflexion natürlicher ist, ohne dass Typen höherer Ordnung instanziiert werden müssen.

Allerdings, um Ihre Frage zu beantworten, glaube ich nicht, gibt es irgendwelche Möglichkeiten, in denen dynamische Typisierung Funktionalität bietet, die in einer angemessenen statisch typisierten Sprache nicht machbar wäre.

7

Um ehrlich zu sein: Die meisten Vorteile dynamische Sprachen (beachten Sie, dass ich sage "dynamische Sprache", nicht "dynamisch-typisierte Sprache") Angebot haben nichts mit dynamischen Typisierung selbst zu tun (und Python ist mein Favorit Sprache!). Sie bekommen nur so viel Aufmerksamkeit, weil die meisten statisch-typisierten Sprachen in Sachen Flexibilität stark saugen. Auf Haskell wird oft hingewiesen, wenn es um dieses Thema geht - aus einem Grund. In der Praxis sehe ich wenig Unterschied zwischen dem, was ein statisches aber ausdrucksvolles (z. B. inhärent generisches) und ein dynamisches System leisten kann.

Der Hauptvorteil, der normalerweise mit dynamischer Typisierung verbunden ist, ist umfangreicher Polymorphismus/Entenschrift/generisches Programmieren. Z.B. Der Großteil meines Python-Codes funktioniert genauso gut, wenn jemand kommt und ihm etwas von einem anderen Typ übergibt, solange er die Felder/Methoden hat, die mein Code verwendet (vorausgesetzt, diese sind auch ungefähr gleichwertig). Im Grunde erspart es uns den Aufwand, ein möglichst minimalistisches Interface zu erstellen, das explizit in jeder Klasse implementiert wird, die wir an diese bestimmte Funktion übergeben möchten. Die Vorteile sollten selbstverständlich sein.

Wie oben erwähnt, diese in keinem Zusammenhang ist zu statisch/dynamisch Typisierung (es gibt dieses structural typing Dingen, die imho nach unten läuft darauf hinaus, Duck Typing mit umfangreichen compilance Kontrollen an compiletime). In der Praxis kommen diese beiden jedoch Hand in Hand, da es keine statisch typisierte Mainstream-Sprache mit struktureller Typisierung gibt (ML/Ocaml/Haskell/... sind alles andere als Mainstream, und Go hat noch einen langen Weg vor sich) mögliche Ausnahme von C++ - Templates (die im Vergleich zu zB Haskell unendlich Schmerz sind).

0

IMHO ist dynamische Typisierung im besten Fall "Meh" und führt im Worst Case zu mehr Fehlern, wenn es um Werte geht. Mit anderen Worten, ich finde keine Vorteile in Bezug auf die Werte.

Der wahre Wert kommt mit dem Metaprogrammierungspotential von dynamisch typisierten Sprachen. Frameworks wie Grails wären ohne sie nicht möglich. Ein Beispiel dafür, was grails macht, ist: Wenn Sie eine Domain-Klasse haben, fügen Sie ihr eine Variable hinzu, dann stellt das Framework automatisch die Methode "findByYourVar" für die Domain-Klasse zur Verfügung, die zur Laufzeit verfügbar ist. Daher werden Ihnen alle gängigen Persistenzmethoden, die Sie in Java (oder was auch immer) schreiben müssen, vom Framework zur Verfügung gestellt.

Verwandte Themen