Statische und dynamische Typisierung

Es wird sehr viel „Informatik-Theologie“ um die Frage der statischen und dynamischen Typisierung betrieben. Da ich mir zu dieser Frage noch keine abschließende Meinung gebildet habe, kann ich hier nur ein paar Überlegungen zu der Thematik darlegen.

Eine Frage ist, wie statisch ist diese statische Typisierung eigentlich? Ein typischer Kandidat ist Java, das immer gerne als Musterbeispiel für statische Typisierung aufgeführt wird. Nun ist Java aber erst einmal sicher dynamisch typisiert. Jedes Java-Objekt hat seinen Typ dabei und dieser wird zur Laufzeit beachtet. Es gibt dann „ClassCastException“ oder so etwas. Man kommt recht weit ohne Casts. Früher brauchte man die für die Collections, aber das ist durch Generics ein Stück weit entschärft worden. Nun sind aber Generics in einigen Kombinationen dermaßen schwierig zu handhaben, man denke nur an die Kombination aus Collections und Arrays. Und wie viele kennen Kovarianz und Kontravarianz Manche Fälle werden dann in der Realität so gelöst, dass man die Generics wegcastet. Das ist Realität in den Java-Quelltexten dieser Welt, auch wenn man es noch so schlecht findet… Was bleibt ist die dynamische Typisierung und „etwas“ statische Typisierung. Es ist viel statische Typisierung, aber keineswegs durchgängig. Andere Programmiersprachen, wie z.B. F#, Scala oder Haskell haben die statische Typisierung konsequenter umgesetzt und dort funktioniert sie auch besser.

Man braucht natürlich einen Mechanismus, um die richtige Funktionalität für die Daten zu verwenden. Das kann durch eine Art von dynamischer Typisierung geschehen, im Prinzip für Polymorphie wichtig. Oder es kann auch programmatisch geschehen, indem quasi die richtige Funktionalität aufgerufen wird und das entsprechend schon zur Compilezeit so festgelegt wird. Das kann durch statische Typisierung unterstützt werden, aber es gibt natürlich auch andere Mechanismen.

Was statische Typisierung verspricht ist aber, dass man weniger Fehler macht. Man kann sagen, dass statische Typen eine Art „Constraints“ sind. Man sieht dadurch bestimmte Fehler, die man vermeiden kann. Die Freunde dynamischer Typisierung schreiben aber genügend Unit-Tests und so findet man die Fehler sowieso. Und die Unit-Tests muss man auch bei statisch typisierten Sprachen schreiben. Also gewinnt man etwas durch die statische Typisierung? Ein bisschen schon, aber es relativiert sich, wenn man seriös Unit-Tests schreibt.

Nun kann eine statische Typisierung den Vorteil haben, dass sie Variablen, Parameter und Rückgabewerte dokumentiert und zwar auf eine Art, die immer aktualisiert werden muss und nicht den Stand von vor ein paar Monaten widerspiegelt, der nie aktualisiert worden ist, weil das vergessen wurde oder die Zeit gefehlt hat.

Dynamische Typisierung kann vorteilhaft sein, wenn man Schnittstellen entwickelt, die mit einem Spektrum von Versionen von Software zusammenarbeiten können, indem man einfach die Typen zur Laufzeit erkennt und richtig behandelt. So kann man ein großes System robuster bauen, weil es zunehmend schwierig ist, ein größeres System komplett auf einmal zu aktualisieren, je größer dieses ist.

Share Button

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*