EineTypisierung dient in derInformatik dazu, dass dieObjekte (hier Objekte im mathematisch-abstrakten Sinne verstanden) derProgrammiersprachen, wie z. B.Variablen,Funktionen oderObjekte (im Sinne derobjektorientierten Programmierung) korrekt verwendet werden. Ein Ziel der Typisierung ist die Vermeidung vonLaufzeitfehlern.
Der BegriffTypsystem bezeichnet in derInformatik eine Komponente, die inProgrammiersprachen zum Einsatz kommen kann, um den Wertebereich von Variablen einzuschränken. Programmiersprachen, die über ein Typsystem verfügen, nennt mantypisiert. Je nach Ausprägung des Typsystems spricht man gelegentlich auch vonstark typisierten oderschwach 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.Ein Typsystem wird durch folgende Bestandteile gebildet:
Typsysteme lassen sich entlang vier Dimensionen klassifizieren:
Zu den Aufgaben eines Typsystems gehören:
Die folgenden Beispiele sollen die Klassifizierung verdeutlichen; die Einordnung von Sprachen in diese Kategorien ist aber bis zu einem gewissen Grad subjektiv (C++ z. B. ist stärker typisiert als C, aber schwächer alsOCAML), und viele Typsysteme haben je nach Verwendung mehrere Aspekte (Polymorphe Werte,Typumwandlung etc.).
keine:x86 Assembler
movah,0x0e; Weise dem oberen Byte des Registers ax den Wert 14 zu.moval,'!'; Weise dem unteren Byte den Wert des Zeichens '!' zu.int0x10; Erzeuge Interrupt 0x10 um das Zeichen '!' auszugeben.
Statisch, explizit, schwach:C
intx;// Weise x explizit den Typ int (Ganzzahl) zu.char*str=x;// Weist str als Anfangsadresse den Wert von x zu.// Da x undefiniert ist, kann die Ausgabe von str zum Programmabsturz führen.x=&str;// Weist x die Speicheradresse von str zu.*(char**)x="text";// Schreibt die Anfangsadresse des Strings "text" in die Adresse von str.printf("%s",str);// Ausgabe von "text"
Statisch und dynamisch, explizit und implizit, stark:C#
objectaddmax(objecta,intb,shortc){intmax=Math.Max(b,c);// Aufruf von Max(int b, int c) der Klasse Mathintsum=(int)a+max;// InvalidCastException falls a nicht konvertierbar,// NullReferenceException falls a undefiniertreturnsum;// implizite Konvertierung (Boxing) von int zu object}
Statisch, explizit und implizit, stark:Java
Integeraddmax(Objecta,intb,shortc){intmax=Math.max(b,c);// Aufruf von max(int b, int c) der Klasse Mathintsum=(int)a+max;// ClassCastException falls a nicht konvertierbar,// NullPointerException falls a undefiniertreturnsum;// implizite Konvertierung (boxing) zu Integer}
Statisch, implizit, stark:OCAML
letmyAddab=(* Wir definieren eine Funktion, die zwei nicht näher bezeichnete Werte nimmt *)a+.b;;(* +. ist der Additionsoperator für Gleitkommazahlen *)(* val myAdd : float -> float -> float = <fun> *)(* Ocaml hat von selbst erkannt, dass diese Funktion zwei Gleitkommazahlen erwartet und eine zurückgibt *)myAdd12.5;;(* Addiere zwei Zahlen, aber eine davon ist eine Ganzzahl *)(* '''Compilerfehler:''' This expression has type int but is here used with type float *)myAdd(float_of_int1)2.5;;(* Addiere zwei Zahlen, wandle Ganzzahl zuvor in Gleitkommazahl um, ergibt 3.5 *)letx=objectmethoda=10end;;(* definiere ein Objekt mit einer Methode a, die den Wert 10 zurückgibt *)lety=objectmethoda=10methodb=11end;;(* definiere ein Objekt mit zwei Methoden a und b, die jeweils unterschiedliche Ints zurückgeben. *)letl=[x;(y:><a:int>)];;(* speichere x und y in einer Liste. y wird dabei in den Typ von x umgewandelt *)
Statisch und dynamisch, explizit, stark:Pascal
vara,b:integer;c:char;begina:=33;{ Weise a den ganzzahligen Wert 33 zu. }c:=chr(a);{ Weise c den Buchstaben zu, der dem ASCII-Wert von a entspricht. }b:=ord(c);{ Weise b den ASCII-Wert von c zu. }writeln(b,c);{ Gibt "33 !" aus. }b:=a/2;{ Laufzeitfehler, da die Division keinen ganzzahligen Wert ergibt. }end
Dynamisch, implizit, schwach:Perl
$x=1.5;# x ist nicht die Zeichenkette "1.5", sondern die Zahl 1.5$x=$x+"4-2";# x ist nun 5.5 da nur der Zahlenteil von "4-2", also 4 addiert wurde$x=$x+"text";# x ist unverändert, da "text" nicht mit einer Zahl beginnt
Dynamisch, implizit, schwach:PHP
$x=1;// Weise x explizit den Wert 1 zu.$x=2+"42";// Addiere eine Zahl und eine Zeichenkette,// wandle dazu die Zeichenkette in eine Zahl um// $x ist jetzt 44$x=2+"Ich bin keine Zahl";// Wie oben, ungültige Zeichenkette wird zu 0 umgewandelt// $x ist jetzt 2
Dynamisch, implizit, stark:Python
x=1# Weise x explizit den Wert 1 zu.x=2+"42"# Addiere eine Zahl und eine Zeichenkette, Laufzeitfehler ("TypeError")x=2+int("42")# Addiere eine Zahl und eine Zahl, die aus einer Zeichenkette erstellt wird# x ist jetzt 44x=2+int("Ich bin keine Zahl")# Laufzeitfehler ("ValueError")
Statisch und dynamisch, explizit, stark:Pike
intx=1;// Definiere x als int und weise explizit den Wert 1 zu.x=2-"42";// Subtrahiere eine Zeichenkette von einer Zahl, Kompilier- oder Laufzeitfehler ("Bad argument 2 to `-.")x="42";// Weise x den wert "42" zu. Kompilierfehler ("Bad type in assignment")x=2+(int)"42";// Addiere eine Zahl und eine Zahl, die aus einer Zeichenkette erstellt wird// x ist jetzt 44x=2+(int)"Ich bin keine Zahl"// Ungültige Zeichenkette wird zu 0 umgewandelt// x ist jetzt 2