- Typsystem
-
Der Begriff Typsystem bezeichnet in der Informatik eine Komponente, die in Programmiersprachen zum Einsatz kommen kann, um den Wertebereich von Variablen einzuschränken. Programmiersprachen, die über ein Typsystem verfügen, nennt man typisiert. Je nach Ausprägung des Typsystems spricht man gelegentlich auch von stark typisierten oder schwach typisierten Sprachen. Durch die Typisierung soll sichergestellt werden, dass auf den Inhalten von Variablen keine Operationen ausgeführt werden, die syntaktisch oder semantisch fehlerhaft sind.
Eine abstraktere Definition ist:
- [A type system is a] tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute.
- (Benjamin C. Pierce)
Inhaltsverzeichnis
Komponenten
Ein Typsystem wird durch folgende Bestandteile gebildet:
- Die Typen selbst, die entweder mittels Typdefinitionen erzeugt oder in der jeweiligen Sprache fest integriert (als primitive Datentypen) sind.
- Die Möglichkeit, Programmelemente (wie Variablen, Methodenparameter usw.) mittels Typannotation mit einem bestimmten Typ zu deklarieren.
- Regeln, nach denen die Werte von Ausdrücken einem bestimmten Typ zugeordnet werden.
- Regeln zur Prüfung der Typkorrektheit von Zuweisungen.
- Optional weitere Sprachbestandteile wie typbezogene Operatoren (z. B. "instanceof" in diversen Sprachen) oder eine Reflection API zur Ermittlung und Prüfung von Typinformation zur Laufzeit.
Statische und dynamische Typprüfung
Typprüfungen können zur Übersetzungszeit oder zur Laufzeit vorgenommen werden. Im ersten Fall spricht man von statischer Typprüfung, im zweiten von dynamischer Typprüfung. Grundsätzlich sind statische Typprüfungen wünschenswert, da sie Laufzeitfehler ebenso wie möglicherweise schwer auffindbare Folgefehler ausschließen. Strikte statische Typprüfungen verhindern jedoch immer auch Programmcode, der eigentlich typkorrekt ist, wie das folgende triviale Beispiel zeigt:
if (false) { int i = "irgendein Text"; }
Dieser Code (einer gedachten Programmiersprache) ist typkorrekt, da er niemals zu einer problematischen Zuweisung führen kann. Dennoch würde eine statische Typprüfung die Zuweisung eines Strings an eine Integer-Variable normalerweise als Typfehler auffassen und zur Übersetzungszeit scheitern lassen. Es lässt sich leicht überlegen, dass in weniger zugespitzten Fällen Programmcode vom Typsystem zurückgewiesen wird, obwohl er nachweislich typkorrekt ist. Das Typsystem müsste eine erhebliche Komplexität erreichen, um das Laufzeitverhalten von Programmen bei den Typprüfungen zu berücksichtigen, was umgekehrt das Typsystem komplexer und schwerer handhabbar (und damit anfälliger für Fehlverwendungen durch den Programmierer) machen würde. Typsysteme sind daher immer Kompromisse zwischen möglichst strikten statischen Prüfungen und einer die Flexibilität und Ausdrucksstärke der Sprache bewahrenden dynamischen Prüfung.
Aufgaben
Zu den Aufgaben eines Typsystems gehören:
- Erkennung von Typverletzungen bei der Übersetzung und Ausführung. Die Typinformation kann dabei als eine redundante Information aufgefasst werden, die verhindert, dass Variablen Werte zugewiesen werden, welche die betreffende Variable niemals annehmen sollte (sogenannte Typinvarianten). Sie verhindert so die Ausführung von Operationen auf den Inhalten dieser Variablen, die entweder unmöglich oder aus programmlogischen Gründen nicht sinnvoll ist.
- Typumwandlung (engl. type conversion), also Umwandlung bzw. Beförderung und Degradierung von Typen (engl. type promotion, type demotion). In vielen objektorientierten Sprachen stehen hierfür die drei Möglichkeiten up cast, down cast und cross cast zur Verfügung.
Siehe auch
Literatur
Wikimedia Foundation.