## 📘 **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: ``| |**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) ```c 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`) ---