Mode standalone

Binaire standalone avec VM embarquée (support JIT compilé).

Installation

Le binaire catnip-standalone est compilé et installé via :

make install-standalone
# Le binaire est installé dans .venv/bin/catnip-standalone

Build manuel

cd catnip_rs
cargo build --bin catnip-standalone --features embedded --release
# Binary : target/release/catnip-standalone

Usage

Modes d'exécution

# Exécuter script
catnip-standalone script.cat

# Évaluer expression
catnip-standalone -c "x = 10; x * 2"

# Lire depuis stdin
echo "2 + 3" | catnip-standalone --stdin

# Version
catnip-standalone --version

# Mode verbose avec stats
catnip-standalone script.cat -v
# Affiche : parse time, compile time, execute time, stats VM
$ catnip-standalone --version
catnip-standalone 0.0.6

Options JIT

# Désactiver le JIT (flag réservé)
catnip-standalone script.cat --no-jit

# Changer le seuil JIT (flag réservé)
catnip-standalone script.cat --jit-threshold 50

Note : dans la pipeline standalone actuelle, les options JIT sont acceptées mais ne sont pas encore prises en compte par l'exécution.

Mode Benchmark

# Benchmarker un script (10 iterations par défaut)
catnip-standalone bench script.cat

# Spécifier nombre d'iterations
catnip-standalone bench 20 script.cat

# Benchmark (options JIT acceptées, non appliquées pour l'instant)
catnip-standalone bench 10 script.cat --no-jit

Info Runtime

catnip-standalone info

Output :

Catnip Standalone Runtime
Version: 0.0.4

Features:
  - Rust VM: Yes (NaN-boxing)
  - JIT Compiler: Available (Cranelift x86-64)
  - Python Support: Embedded (PyO3)

Build Profile:
  - Mode: Release (LTO, optimized)

Usage:
  catnip-standalone script.cat
  catnip-standalone -c "x = 10; x * 2"
  echo "2 + 3" | catnip-standalone --stdin
  catnip-standalone bench script.cat  # Benchmark mode

Cas d'Usage

Scripts Production

#!/usr/bin/env catnip-standalone
# data_pipeline.cat

# Traitement batch
data = load_data()
processed = process(data)
save(processed)

Benchmarking

# Benchmark (options JIT acceptées, non appliquées pour l'instant)
catnip-standalone bench 50 script.cat
catnip-standalone bench 50 script.cat --no-jit

# Profiler avec verbose
catnip-standalone script.cat -v > stats.txt

CI/CD

# .gitlab-ci.yml
script:
  - catnip-standalone validate.cat
  - if [ $? -eq 0 ]; then deploy; fi

REPL Standalone

La REPL Rust vit dans le crate catnip_repl (_repl.run_repl()). Elle est disponible automatiquement avec pip install catnip-lang ou make compile. Aucun binaire séparé n'est nécessaire.

Le binaire standalone catnip-repl reste disponible comme option alternative :

Build binaire (optionnel)

make install-repl
# Binary installé : .venv/bin/catnip-repl
cd catnip_repl
cargo build --bin catnip-repl --features repl-standalone --release
# Binary : target/release/catnip-repl

Commandes REPL

Toutes les commandes commencent par / :

Commande Description
/help Afficher l'aide complète
/exit, /quit Quitter la REPL
/clear Effacer l'écran
/version Informations version et build
/history Afficher historique (20 dernières entrées)
/load <file> Charger et exécuter un fichier .cat
/stats Statistiques d'exécution (variables, JIT)
/jit Toggle compilateur JIT
/verbose Toggle mode verbose (timings)
/debug Toggle mode debug (IR + bytecode)
/time <expr> Benchmarker une expression
/version
Catnip REPL v0.0.6
Build: release mode
Features: JIT (Cranelift), NaN-boxing VM, Rust builtins

Mode Debug

Le mode debug affiche l'IR optimisé et le bytecode sans exécuter :

▸ /debug
Debug mode: enabled (shows IR and bytecode)

▸ x = 10 + 20
=== IR (after semantic analysis) ===
Assign(
    target: "x",
    value: BinOp(Add, Int(10), Int(20))
)

=== Bytecode ===
Instructions:
    0: LOAD_CONST(0)    # 10
    1: LOAD_CONST(1)    # 20
    2: BINARY_OP(Add)
    3: STORE_NAME("x")

Constants: 2 values
Names: ["x"]

Utile pour comprendre les optimisations appliquées et le code généré.

Auto-complétion

Tab complète :

  • Commandes REPL (/he/help)
  • Keywords (whwhile)
  • Builtins (priprint)
  • Variables définies
  • Méthodes après . (string/list/dict)
▸ x = "hello"
▸ x.<Tab>
capitalize  casefold  center  count  encode  endswith  find  format
index  isalnum  isalpha  join  lower  replace  split  strip  upper

Messages d'erreur

Affichage avec contexte visuel (ligne/colonne + pointeur) :

▸ x = 10 +
Syntax error at line 1, column 8
    1 | x = 10 +
      |        ^

Raccourcis clavier

Raccourci Action
Ctrl+D Quitter
Ctrl+C Annuler saisie
↑/↓ Naviguer historique
Tab Auto-complétion

Historique persistant dans $XDG_STATE_HOME/catnip/repl_history (1000 entrées max, défaut ~/.local/state/catnip/repl_history).

Syntax Highlighting

Coloration live en temps réel :

  • Keywords : cyan bold (if, while, for, match)
  • Constants : magenta bold (True, False, None)
  • Types : teal (dict, list, tuple, set)
  • Numbers : vert pâle
  • Strings : orange
  • Comments : gris
  • Operators : gris clair
  • Builtins : jaune (print, len, range)

Couleurs RGB 24-bit configurables dans catnip_rs/src/constants.rs.

Limitations

1. Dépendance Python Runtime

Malgré le nom "standalone", le binary nécessite :

  • Python installé (libpython.so)
  • Package catnip accessible (PYTHONPATH)

Workaround : Installer avec make install-lang pour assurer disponibilité.

2. Pas de Cross-Compilation Facile

Le binary est lié à :

  • Architecture CPU (x86-64)
  • Version Python (3.9+)
  • OS (Linux, macOS, Windows)

Solution : Builds séparés par plateforme.