121 lines
2.7 KiB
Markdown
121 lines
2.7 KiB
Markdown
## 📘 **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`)
|
||
|
||
--- |