Einführung in die Systemprogrammierung Vermeidung von Speicherfehlern in Höheren Programmiersprachen Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 25. Juni 2015 Systemprogrammierung und Hochsprachen Programm Bibliotheken Laufzeitsystem Systemprogramm Systembibliotheken Betriebssystem Rechnerarchitektur Vor- und Nachteile von Systemsprachen Hoher Grad an Kontrolle über Hardware: I I I Hohe Performanz erreichbar Speicheraufwand minimierbar Echtzeit-Programme möglich Detailkontrolle wird oft erzwungen: I I Speicherfehler (Relativ) geringe Entwicklungsgeschwindigkeit Gründe: I I I Speicherfehler Detailentscheidungen evtl. geringe Abstraktion Speicherfehler (Wiederholung) I I I I Doppel-free() Deallozierung vergessen Hängender Zeiger Zeigerarithmetik-Fehler: I I Falscher Typ Falscher Speicherbereich: I Array-Grenzen überschritten Wie können wir Speicherfehler einzäunen? Lösungsansatz #1: Starke Typisierung I I Jeder Speicherinhalt hat einen Typ Der Typ diktiert “Vertrag”: I I I Welche Speicherinhalte sind erlaubt? Was darf mit Speicherinhalt geschehen? Starke Typisierung: I I Erzwingt Typverträge Prüfungen können stattfinden: I I statisch (Bei Übersetzung) dynamisch (Bei Ausführung) Lösungsansatz #2: Automatische Speicherverwaltung I Viele Speicherfehler werden von free ausgelöst? ⇒ Sprachdesign ohne Free: I I Laufzeitsystem entsorgt ungenutzten Speicher automatisch Speicherallozierung kann explizit (Java) oder implizit (Haskell) stattfinden Laufzeitsystem benötigt Automatische Speicherverwaltung Hochsprachen-Lösungen für Speicherfehler I I Starke Typisierung [ST]: Automatische Speicherverwaltung [ASV] Doppel-free() Deallozierung vergessen Hängender Zeiger Falscher Typ Falscher Speicherbereich Array-Grenzen überschritten ST ST ST ST ASV (ASV) ASV Auch mit automatischer Speicherverwaltung sind vergessene Deallozierungen noch möglich Zusammenfassung: Speicherfehler und Hochsprachen I Hochsprachen vermeiden Speicherfehler durch I Starke Typisierung: I I I I Schließt ‘Typ-Verträge’ Erzwingt diese Verträge Verbietet Zeigertypen Automatische Speicherverwaltung: I I Kein explizites free Automatisches Speicherverwaltungssystem (garbage collection) Hochsprachen-Laufzeitsysteme I I C/C++ verwenden vergleichsweise einfaches Laufzeitsystem Andere Hochsprachen benötigen komplexere Laufzeitunterstützung: I I I I Umsetzung der Starken Typisierung Automatische Speicherverwaltung Code-Optimierung zur Laufzeit Unterstützung für Sprachfeatures: I I I I I I Objekte und Klassen Funktionen als Werte Nachladen von Code zur Laufzeit Nebenläufige Ausführung und Synchronisierung Ausnahmen Reflektion ... Hochsprachen-Laufzeitsysteme Wir betrachten heute die Laufzeitsysteme folgender Sprachen: I I I I Python Java Haskell AttoL All diese Sprachen leben in der gleichen Laufzeitumgebung wie C-Programme, nutzen sie aber unterschiedlich