Bytecode y Opcodes de la Máquina Virtual de Forja
Archivo: src/bytecode.rs
¿Por qué existe?
- Separación de concerns entre compilador y VM.
- Portabilidad a distintas arquitecturas.
- Optimización mediante opcode‑fusion.
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
- Se crea un
Vec<Opcode>con el bytecode generado. - Un bucle
while pc < bytecode.len()despacha cada opcode mediantematch. - El stack es
Vec<Valor>dondeValorengloba los tipos soportados. - Variables por índice usan vectores pre‑alojados para acceso O(1).
- Llamadas a built‑ins o funciones se delegan al dispatcher correspondiente.
- 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,
];