Skip to content

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

@vitekform

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions