2.7 KiB
📘 Zusammenfassung: VA Compiler – Computerarchitektur
🔄 Vom Quellcode zum ausführbaren Programm
-
Compiler-Toolchain:
-
Übersetzt Hochsprache in Maschinencode
-
Tools: GCC, Clang, MSVC, Intel Compiler
-
Ergebnis: ausführbare Datei (PE, ELF, Mach-O)
-
-
Loader (Betriebssystem):
- Lädt die Datei in den Speicher & startet die Ausführung
🧱 Phasen des Compilers
| Phase | Aufgabe |
|---|---|
| Lexikalische Analyse | Zerlegt Quelltext in Tokens: <Tokenname, Attributwert> |
| Syntaktische Analyse | Erzeugt Syntaxbaum (AST) aus Tokens |
| Semantische Analyse | Prüft Typen, ergänzt Typkonvertierungen, Symboltabelle wird erweitert |
| Zwischencode-Gen. | Erzeugt maschinenunabhängigen Zwischencode (z. B. 3-Adress-Code) |
| Optimierung | Vereinfachung & Effizienzsteigerung (lokal/global, konstante Faltung, tote Code-Elimination) |
| Codegenerator | Übersetzt in Zielmaschinencode, Register- und Speicherzuweisung |
🔥 Optimierungstechniken
🏃 Lokale Optimierungen (Basisblock)
-
Gemeinsame Teilausdrücke eliminieren
-
Toten Code entfernen
-
Registernutzung reduzieren (Operandenumordnung)
-
Kostenreduktion: Multiplikation → Addition ersetzen
🌎 Globale Optimierungen
-
Registerzuteilung über mehrere Basisblöcke hinweg
-
Schleifeninvariante Codebewegung
-
Induktionsvariablen optimieren (i++ statt i = i+1)
📝 Beispiel (3-Adress-Code)
t1 = id3 * 60.0
id1 = id2 + t1
🌳 Flussgraph & DAG
-
Grundblöcke: Sequenzen ohne Sprünge
-
Flussgraph: zeigt Steuerfluss zwischen Grundblöcken
-
DAG (Directed Acyclic Graph): erkennt gemeinsame Teilausdrücke
🔗 Binden & Laden
-
Relokation: Anpassung der Adressen bei Modulzusammenführung
-
Dynamisches Binden:
-
Windows: DLLs (Dynamic Link Libraries)
-
Unix: Shared Objects (.so)
-
MULTICS: Prozeduradresse erst beim ersten Aufruf zugewiesen
-
⚙️ Compiler Tools
| Tool | Aufgabe |
|---|---|
cc -E |
Preprocessing (Makros expandieren) |
cc -S |
Erzeugt Assembler-Code |
cc -c |
Erzeugt Objektcode |
cc -o |
Linkt Objektcode zu ausführbarer Datei |
📚 Literatur
-
Dragon Book: Compilers: Principles, Techniques, and Tools (Aho, Sethi, Ullman, Lam)
-
Wirth: Compilerbau
📝 Für die Klausur merken
✅ Compiler-Phasen & deren Aufgaben
✅ Unterschied Inline Assembler ↔ Compiler
✅ Optimierungen: lokal (Basisblock), global (Flussgraph)
✅ DAG & Flussgraph: Aufbau und Nutzen
✅ Dynamisches Binden unter Windows/Unix
✅ Tools & Compiler-Optionen (z. B. cc -S, cc -c)