Preview only show first 10 pages with watermark. For full document please download

Einführung In Die Systemprogrammierung

   EMBED


Share

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)