Documentation Développeur

Architecture interne et contribution au projet Catnip.

Si tu lis ceci, tu es déjà dans le circuit, branché au flux.

Vue d'ensemble

Catnip utilise une architecture pipeline à plusieurs étapes pour transformer du code source en résultats exécutables :

Source text
    ↓
Parser (Tree-sitter)
    ↓
Parse Tree (CST)
    ↓
Transformer (72 modules Rust)
    ↓
IR (Intermediate Representation avec IROpCode)
    ↓
Semantic Analyzer + 6 passes d'optimisation
    ↓
Op (Optimized AST avec OpCode final)
    ↓
┌─────────────────┐
│  Mode VM (on)   │──→ Compiler Bytecode → VM Stack-based → Result
├─────────────────┤
│ Mode AST (off)  │──→ Registry Direct Execution → Result
└─────────────────┘

L'architecture repose sur une stratégie hybride Rust + Python : les composants bas niveau sont en Rust (via PyO3), l'API de haut niveau reste en Python.

Étapes détaillées :

  1. Parsing : Tree-sitter génère un CST (Concrete Syntax Tree) depuis le texte source
  2. Transformation : 72 transformateurs Rust convertissent le CST en IR avec IROpCode (56 opcodes)
  3. Analyse sémantique : 6 passes d'optimisation transforment l'IR en Op final avec OpCode optimisé
  4. Compilation (mode VM) : Le compiler bytecode génère des instructions VM (65 opcodes) pour la stack machine
  5. Exécution :
  6. VM mode : Stack-based bytecode VM avec NaN-boxing et JIT Cranelift
  7. AST mode : Dispatch direct via Registry (52 opérations)

Composants principaux

Composant Rôle Implémentation Opcodes
Parser Analyse syntaxique Tree-sitter Rust -
Transformer Parse tree → IR (Intermediate Repr.) Rust (72 transformateurs) IROpCode 56
Semantic Analyse et optimisation IR → Op Rust (6 passes) OpCode 56
CFG Control Flow Graph pour analyse Rust (dominance, loops) -
Compiler Op → Bytecode (mode VM uniquement) Rust VMOpCode 68
VM Exécution bytecode stack-based Rust (NaN-boxing, JIT) -
Registry Dispatch direct des opérations (mode AST) Rust (52 opérations) -
Scope Gestion des variables O(1) Rust -
Context Environnement d'exécution, pragmas Python -

Documents de cette section

  • ARCHITECTURE - Pipeline complet, parsing, analyse sémantique, scopes
  • VM - Machine virtuelle Rust, NaN-boxing, modes d'exécution
  • ND_VM_ARCHITECTURE - Opérations ND dans le VM (@@, @>, @[])
  • JIT - Compilation Just-In-Time trace-based, Cranelift backend, hot detection
  • OPTIMIZATIONS - Passes d'optimisation, niveaux, quand les activer
  • CACHE - Système de cache multi-niveaux, backends intégrés, protocole custom
  • BENCHMARKING - Méthodologie de mesure et comparaison de performances
  • EXTENDING - Ajouter opcodes, opérations, extensions
  • CONSTANTS - Configuration par défaut (prompts, couleurs, seuils JIT, etc.)

Où trouver le code

catnip/
├── __init__.py          # Classe principale Catnip
├── context.py           # Contexte d'exécution
├── nodes.py             # Nœuds AST (Ref, patterns, signaux)
├── semantic/            # Wrappers Python pour semantic Rust
├── transformer/         # Wrappers Python pour transformer Rust
└── vm/                  # Bridge Python pour VM Rust

catnip_rs/
├── grammar/             # Grammaire Tree-sitter (grammar.js)
└── src/
    ├── core/            # Scope, Op, Registry
    ├── ir/              # OpCodes IR
    ├── parser/          # Transformateurs (72 modules)
    ├── semantic/        # Analyzer + 6 passes d'optimisation
    ├── cfg/             # Control Flow Graph (dominance, loops)
    ├── vm/              # VM bytecode (compiler, frame, value)
    ├── jit/             # JIT Cranelift
    ├── cache/           # Cache system (backends, memoization)
    ├── config/          # ConfigManager (TOML, XDG)
    └── pragma/          # Directives de compilation

Workflow de développement

# Après modification de fichiers Rust
uv pip install -e .

# Tests rapides Rust (~5s)
make rust-test-fast

# Tests complets Python (~25s)
make test

# Après modification de grammar.js
make grammar-deps

Pipeline simple et composable, dans l'esprit Unix. Chaque étape fait une chose et la fait bien. Sauf que chaque étape dépend de la précédente, ce qui est moins Unix mais plus pratique pour interpréter du code.