Transcript
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)