Files
2025-07-07 19:57:44 +02:00

121 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 📘 **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`)
---