Einführung in die Systemprogrammierung

Werbung
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)
Herunterladen