1. Lexer (tokenizace)
Prerekvizita – první fáze překladu. Studenti znají automaty, tohle je přímá aplikace.
- Co je token – typy (klíčové slovo, identifikátor, literál, operátor)
- Lexer jako konečný automat – přímé napojení na teorii
- Jak lexer řeší whitespace, komentáře, chyby
- 🔢 Příklad: tokenizace jednoduchého Python výrazu
x = 1 + 2 krok za krokem
2. Parser a AST
Prerekvizita – druhá fáze překladu. Studenti znají gramatiky, tohle je přímá aplikace.
- Syntaktická analýza – ověření struktury tokenů
- Abstract Syntax Tree (AST) – co to je, jak vypadá
- Rekurzivní sestup – jak gramatika přímo odpovídá kódu parseru
- Precedence operátorů – jak parser řeší
1 + 2 * 3
- 🔢 Příklad: parsování výrazu
x = 1 + 2 * 3 → AST krok za krokem
3. Interpreter
Nejjednodušší způsob spuštění kódu – přímé procházení AST.
- Tree-walking interpreter – rekurzivní vyhodnocování AST
- Prostředí (environment) – jak se ukládají proměnné
- Scope a closures – jak interpreter řeší vnořené funkce
- 🔢 Příklad: vyhodnocení jednoduchého programu krok za krokem
4. Bytecode kompilace
Efektivnější alternativa k tree-walking – AST se přeloží na instrukce pro VM.
- Proč bytecode – rychlejší než procházení AST
- Instrukční sada VM – stack-based vs register-based
- Kompilace AST → bytecode – konkrétní mapování uzlů na instrukce
- CPython bytecode –
dis modul, jak vypadá skutečný Python bytecode
- 🔢 Příklad: kompilace
x = 1 + 2 do bytecode krok za krokem
5. Virtuální stroj (VM)
Jak se bytecode skutečně spouští.
- Stack-based VM – zásobník operandů, fetch-decode-execute
- CPython VM – jak Python spouští
.pyc soubory
- JVM – architektura, class loading, bytecode verifikace
- Porovnání CPython vs JVM – design filozofie
- 🔢 Příklad: ruční simulace stack VM na jednoduchém programu
6. Garbage Collector
Správa paměti v runtime – nutná součást každého interpreteru.
- Proč GC – ruční správa paměti není možná
- Reference counting – CPython přístup, cyklické reference
- Mark and sweep – základ JVM GC
- Generační GC – proč mladé objekty umírají rychleji
- Stop-the-world vs concurrent GC
- 🔢 Příklad: ukázka reference counting na konkrétním Python kódu
7. JIT kompilace
Vrchol – bytecode se za běhu kompiluje na nativní instrukce.
- Proč JIT – interpreter je pomalý, statická kompilace ztrácí informace
- Profiling – jak VM zjistí co stojí za JIT
- Warm-up – proč JVM je zpočátku pomalé
- Tracing JIT vs method JIT – V8 vs JVM přístup
- Deoptimizace – co se stane když JIT přestane platit
- 🔢 Příklad: ukázka JIT efektu – stejný kód před a po warm-up (Node.js / JVM benchmark)
8. Srovnání reálných implementací
Zastřešení – propojení teorie s konkrétními systémy které studenti znají.
- CPython – bytecode, GIL, proč není JIT (PyPy jako alternativa)
- JVM – JIT, GC, multiplatformnost, class loading
- V8 (Node.js) – hidden classes, Turbofan JIT, garbage collector
- Klíčové design rozhodnutí a jejich důsledky
1. Lexer (tokenizace)
Prerekvizita – první fáze překladu. Studenti znají automaty, tohle je přímá aplikace.
x = 1 + 2krok za krokem2. Parser a AST
Prerekvizita – druhá fáze překladu. Studenti znají gramatiky, tohle je přímá aplikace.
1 + 2 * 3x = 1 + 2 * 3→ AST krok za krokem3. Interpreter
Nejjednodušší způsob spuštění kódu – přímé procházení AST.
4. Bytecode kompilace
Efektivnější alternativa k tree-walking – AST se přeloží na instrukce pro VM.
dismodul, jak vypadá skutečný Python bytecodex = 1 + 2do bytecode krok za krokem5. Virtuální stroj (VM)
Jak se bytecode skutečně spouští.
.pycsoubory6. Garbage Collector
Správa paměti v runtime – nutná součást každého interpreteru.
7. JIT kompilace
Vrchol – bytecode se za běhu kompiluje na nativní instrukce.
8. Srovnání reálných implementací
Zastřešení – propojení teorie s konkrétními systémy které studenti znají.