Bernhard Bauer Riitta Höllerer Übersetzung objektorientierter Programmiersprachen Konzepte, abstrakte Maschinen und Praktikum Java-Compiler" Mit 29 Abbildungen Springer
Teil 1: Theorie 1 Einleitung 3 l. l Übersetzung von Programmiersprachen 3 1.2 Objektorientiertheit und objektorientierte Programmiersprachen 8 1.3 Reine und hybride objektorientierte Programmiersprachen 10 1.4 Die Programmiersprache Java 11 1.5 Überblick über die weiteren Kapitel 11 2 Objektorientierte Konzepte 15 2.1 Klassenbasierte objektorientierte Sprachen 16 2.1.1 Objekte und Klassen 16 2.1.2 Gleichheit und Kopieren von Objekten 25 2.1.3 Abstrakte Klassen und Interface-Klassen 27 2.1.4 Multi-Methoden 28 2.2 Vererbung 29 2.2.1 Einfachvererbung 30 2.2.2 Mehrfachvererbung 42 2.2.3 Dynamische Vererbung 46 2.3 Kapselung 46 2.4 Parametrisierung und generische Datentypen 48 2.5 Parametrisierung versus Vererbung 51 2.6 Polymorphismus 53 3 Übersetzung objektorientierter Konzepte und abstrakte Maschinen 55 3.1 Lose Übersetzung 56 3.1.1 Abstrakte Maschine AM 57 3.1.1.1 Laufzeitumgebung der abstrakten Maschine AM.57 3.1.1.2 Befehle der abstrakten Maschine AM 59 3.1.1.3 Adressierungsarten 63
3.1.2 Klassen und Einfachvererbung 64 3.1.3 Methodendeklarationen 65 3.1.4 Nachrichten und Methodenaufrufe 65 3.1.5 Objekte 67 3.1.6 Semiformale Beschreibung der Semantik der abstrakten Maschine 70 3.2 Smalltalk-80-Realisierung 75 3.2.1 Klassen und Einfachvererbung 77 3.2.2 Übersetzung von Methoden 81 3.2.3 Objekte 84 3.2.4 Objektverwaltung 84 3.2.5 Methodenaufruf 87 3.2.6 Die abstrakte Maschine für Smalltalk-80 88 3.3 Java-Realisierung 89 3.3.1 Klassen und einfache Vererbung 90 3.3.1.1 Einträge im Konstantenpool 92 3.3.1.2 Einträge für Instanzvariablen 94 3.3.1.3 Einträge für Methoden 95 3.3.1.4 Bemerkungen 96 3.3.2 Methodendeklarationen 96 3.3.3 Methodenaufruf und Rücksprung 99 3.3.4 Objekte 100 3.3.5 Die virtuelle Maschine von Java 100 3.4 C++-Realisierung 103 3.4.1 Methoden, Klassen und einfache Vererbung 103 3.4.2 Objekte 106 3.4.3 Methodenaufruf 107 3.4.4 Mehrfachvererbung 108 3.5 Parametrisierung 112 3.5.1 Kopierende Sicht 113 3.5.2 Echte generische Sicht 121 Typinferenz und Typüberprüfung 127 4.1 Typisierung und Binden 127 4.1.1 Typisierung 127 4.1.2 Binden und Methodensuche 128 4.1.3 Zusammenhang von Typisierung und Binden 129 4.1.4 Typisierungsprobleme 129 4.2 Typisierung mit Datenflußanalyse 130 4.2.1 Datenflußanalyse 130 4.2.2 Typisierung mit Datenflußanalyse 135 4.3 Typisierung mit Constraints 137
XI 5 Optimierungen 145 5.1 Standardoptimierungen 147 5.1.1 Elimination redundanter Ausdrücke 147 5.1.2 Konstantenfaltung 148 5.1.3 Elimination toten Programmcodes 149 5.1.4 Kopien-Verbreitung 150 5.1.5 Schleifenoptimierungen 150 5.1.6 Reduktion des Operators und algebraische Umformungen. 152 5.1.7 Kontrollflußoptimierungen 152 5.2 Objektorientierte Optimierungen 152 5.2.1 Intraprozedurale Klassenanalyse 153 5.2.2 Analyse der Klassenhierarchie 154 5.2.3 Effiziente Implementierung der Methodensuche zur Übersetzungszeit 154 5.2.4 Inkrementelle Programmentwicklung und separate Übersetzung 155 5.2.5 Klassentest 155 5.2.5.1 Einfach-Klassentest 156 5.2.5.2 Unterklassentest 157 5.2.5.3 Verwendung von Klassentests und Splitting... 158 5.2.6 Funktionsexpansion 160 5.2.7 Wertbasierte Analyse und Instanzvariablen-Optimierung.. 161 5.2.8 Profile-Informationen 162 5.2.9 Spezialisierte Varianten: Customization 162 5.2.10 Lookup- und Inline-Caches 163 6 Speicherbereinigung 165 6.1 Nicht-inkrementelle Techniken 166 6.1.1 Mark-Scan-Speicherbereinigung 166 6.1.2 Kopierende Speicherbereinigung 167 6.1.2.1 Kopierende Speicherbereinigung mit zwei Regionen 167 6.1.2.2 Kopierende Speicherbereinigung mit Generationen 170 6.2 Inkrementelle Techniken: Referenzzählende Algorithmen 172 7 Ausblick 175 7.1 Compiler-Entwicklung 175 7.1.1 Bootstrapping und Cross-Compiler 175 7.1.2 Compiler-Generatoren 176
XII Inhaltsverzeichnis 7.2 Varianten von Compilern 177 7.2.1 Dynamische Recompilierung 177 7.2.2 Deutsch-Schiffman-Technik 177 7.2.3 Just-In-Time Compiler 178 7.2.4 Compiler und Programmkorrektheit 178 7.3 Hardware-Unterstützung 179 Teil 2: Praxis 8 Compilerbaupraktikum 183 9 Java - Die Programmiersprache 185 9.1 Java-Merkmale 185 9.2 Objekte in Java 188 9.3 Ausdrücke und Statements 188 9.4 Einschränkungen 188 9.5 Aufgaben 189 10 Das MAX-System 191 10.1 Eigenschaften 191 10.2 MAX-Spezifikationen 191 10.3 Ordnungssortierte Terme 192 10.4 Occurrence- bzw. Knotensorten 193 10.5 Muster 194 10.5.1 Sondersymbole in den Mustern 194 10.5.2 Mustersyntax 194 10.6 Attribute 195 10.7 Funktionen 196 10.8 Kontextbedingungen 197 10.9 Generierung eines Java-Übersetzers mit dem MAX-System 198 10.10 Aufgaben 198 11 Befehle der virtuellen Java-Maschine 201 11.1 Konstanten auf den Keller laden 202 11.2 Lokale Variablen auf den Keller laden 202 11.3 Speichern in eine lokale Variable 203 11.4 Manipulation des Kellers 204 11.5 Behandlung von Objekten 204 11.6 Arithmetische Befehle 205 11.7 Sprungbefehle 206 11.8 Methodenaufruf und Rücksprung 207
XIII 11.9 Überprüfung der Klassenzugehörigkeit 209 11.10 Erzeugung des JVM-Codes 209 12 Übersetzerspezifikation 211 12.1 Bindungsanalyse (Identifikation) 211 12.1.1 Ziele der Bindungsanalyse 211 12.1.2 Bindungsanalyse für Java 211 12.1.3 Aufgaben 212 12.2 Typdeklarationen und Typisierung 213 12.2.1 Typdeklarationen 213 12.2.2 Typisierung von Ausdrücken 214 12.2.3 Aufgaben 218 12.3 MAX-Spezifikation der Klassendatei 219 12.3.1 Aufgaben 221 12.4 Ausdrücke und ihre Codeerzeugung 222 12.4.1 Wert eines Ausdrucks 222 12.4.2 Codeerzeugung für Ausdrücke 223 12.5 Statements und ihre Codeerzeugung 230 12.5.1 Statements 230 12.5.2 Code für Statements 230 12.5.3 Ausdrücke als Statements 233 12.5.4 Aufgaben 233 12.6 Methodendeklaration 234 12.6.1 Abstrakte Syntax 234 12.6.2 Methodeneinträge in die Klassendatei 235 12.6.3 Attributierung für Method -Knoten 236 12.7 Kellerrahmen von Java-Methodeninkarnationen 237 12.8 Methodenaufruf 238 12.8.1 Abstrakte Syntax 238 12.8.2 Methodenreferenzeinträge im Konstantenpool 239 12.8.3 JVM-Code 240 12.8.4 Attributierung für MethodCall -Knoten 241 12.8.5 Aufgaben 242 12.9 Vererbung 243 12.9.1 Vererbung in Java 243 12.9.2 Implementierung von Vererbung 244 12.9.3 Berücksichtigung der Vererbungshierarchie 245 12.9.4 Implementierung von super 245 12.9.5 Aufgaben 246 12.10 Ausgabeschnittstelle 247 12.10.1 Java-Klassen für print-ausgaben 247 12.10.2 Code für print-ausgaben 249 12.10.3 Aufgaben 250
XIV Inhaltsverzeichnis Anhang A: Klassenfile und Bytecode 253 Anhang B: Java-Syntax 257 Literatur 273 Sachverzeichnis 277