Einführung in die Systemprogrammierung Starke Typisierung Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 2. Juli 2015 Starke Typisierung Früh-Entdeckung der folgenden Typprobleme: I I I Falscher Speicherbereich Falscher Typ Array-Grenzen überschritten Vermeidung: Typfehler „Falscher Speicherbereich“ I I I Stark typisierte Sprachen haben keinen Zeigertyp Stattdessen: Referenzen Typvertrag für Referenzen: Referenz zeigt immer auf: I I NULL-Adresse, oder Anfang eines Objektes In stark typisierten Sprachen verboten: void qsort (int *daten , int len) { ... qsort (daten , links ); qsort ( daten + links + 1, // Zeigerarithmetik len - links - 1); } Ohne Zeigertypen keine Zeigerarithmetik Vermeidung: Typfehler „Falscher Typ“ (1/2) I Alle Operationen sind an bestimmte Typen gebunden I I I Explizite Typhierarchie (Java, C++) Keine Typhierarchie: Typ definiert sich ‘implizit’ durch Eigenschaften (Python, AttoL) Bei jeder Operation: Typprüfung I I Im Übersetzer (statisch) Zur Laufzeit (dynamisch) AttoL obj a = [1, 2, 3]; // Array a := a + 1; // Fehler: Arithmetik auf Array Nutzt Laufzeit-Typinformationen Vermeidung: Typfehler „Falscher Typ“ (2/2) AttoL $a0 obj a = ... ... a := a + 1; ⇒ ⇒ ⇒ ⇒ ⇒ fail: ⇒ ⇒ ⇒ ⇒ succeed: ⇒ ⇒ ⇒ Typdeskriptor $a0 + 8 ld beqz ld li beq $a0, $a0, $t0, $v0, $t0, li li li jalr $a0, 0x1c76cb0 $a1, 0x4276e8 $v0, 0x41a77e $v0 ld li add $a0, 8($a0) $a1, 0x1 $a0, $a1 0($gp) fail 0($a0) 0x62f3c0 $v0, succeed Wert ; lade ‘a’ ; Typ ‘int’ ; fail_at_node Vermeidung: Typfehler „Arraygrenzen überschritten“ (1/2) Arrayschrankenprüfung: I Jeder Arrayzugriff wird geprüft, bevor er erlaubt wird Java int[] array = ...; array[x] += 1; wird vom Laufzeitsystem transformiert: Java int[] array = ...; if (x < 0 || x >= array.length) throw new ArrayOutOfBoundsException(); else array[x] += 1; Vermeidung: Typfehler „Arraygrenzen überschritten“ (2/2) Array-Repräsentierung in AttoVM (ähnlich in Java): Objektreferenz Typdeskriptor Größe Element #0 Element #1 ... Zusammenfassung: Starke Typisierung I Starke Typisierung erzwingt Typverträge I I Typprüfungen können stattfinden: I I I Garantierte Erkennung von Typfehlern statisch: Übersetzungszeit dynamisch: Laufzeit Vermeidung von Fehlern: I Falscher Speicherbereich: I I Falscher Typ: I I durch Verbot von Zeigerarithmetik/Zeigertypen durch Typprüfung (statisch oder dynamisch) Arraygrenzen überschritten: I durch Arrayschrankenprüfung (meist dynamisch)