Bytecode y Opcodes de la Máquina Virtual de Forja

Archivo: src/bytecode.rs

¿Por qué existe?

Estructuras clave

Enum BuiltinKind

Ejemplo: el enum BuiltinKind lista los builtin disponibles (Escribir, Longitud, Len, Tipo, ATexto, EsNumero, EsTexto, Empujar, Obtener, Remover, Nuevo).

Enum Opcode

Ejemplo: el enum Opcode define los códigos de operación de la VM, como PushEntero(i64), Add, Jump(usize), etc.

Interpretación del bytecode

  1. Se crea un Vec<Opcode> con el bytecode generado.
  2. Un bucle while pc < bytecode.len() despacha cada opcode mediante match.
  3. El stack es Vec<Valor> donde Valor engloba los tipos soportados.
  4. Variables por índice usan vectores pre‑alojados para acceso O(1).
  5. Llamadas a built‑ins o funciones se delegan al dispatcher correspondiente.
  6. Opcode‑fusion combina operaciones comunes para reducir sobrecarga.

Ejemplo de ejecución

let bytecode = vec![
    Opcode::PushTexto(Rc::from("Hola")),
    Opcode::CallBuiltin(BuiltinKind::Escribir, 1),
    Opcode::Halt,
];