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

```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`)

---