Skip to content

Jak fungují interpretery, bytecode, JVM a JIT #65

Description

@vitekform

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions