feat: 字节码VM基础设施 — 编译器、VM执行循环、Runtime trait

Phase 1-3: 基础VM架构
- 新增 Runtime trait: 抽象树遍历解释器和VM的共同接口
- NativeFn 改为接受 &mut dyn Runtime
- 重构所有内置函数使用新签名
- vm/opcode.rs: 33个字节码指令 + 编码/解码辅助函数
- vm/compiler.rs: AST→字节码编译器,支持变量解析、跳转回填、作用域
- vm/vm.rs: 栈式VM执行循环,支持全局变量、原生函数调用
- lib.rs: 新增 run_file_vm() + --vm CLI标志
- 修复: 跳转偏移计算、对象字面量编译

工作特性: 算术、变量、while/for循环、条件、数组、对象、字符串
待完成: 用户定义函数调用、闭包/upvalue捕获、完整require支持

Release模式: 1M算术循环 VM 0.44s vs 树遍历 0.89s (2.0x加速)
This commit is contained in:
2026-06-25 01:08:49 +08:00
parent 89952139c5
commit d854b22006
15 changed files with 2185 additions and 74 deletions
+38
View File
@@ -2,12 +2,15 @@ pub mod lexer;
pub mod ast;
pub mod parser;
pub mod interpreter;
pub mod vm;
pub mod error;
pub mod analysis;
use lexer::Lexer;
use parser::Parser;
use interpreter::Interpreter;
use vm::compiler::Compiler;
use vm::vm::Vm;
use error::RuntimeError;
use std::io::Write;
@@ -46,6 +49,41 @@ pub fn run_file(filename: &str, src: String) {
}
}
/// Run a file using the bytecode VM (for performance comparison).
pub fn run_file_vm(filename: &str, src: String) {
let (tokens, lex_errors) = Lexer::new(&src).tokenize();
if !lex_errors.is_empty() {
print_errors(&lex_errors);
std::process::exit(65);
}
let mut parser = Parser::new(tokens);
let (stmts, parse_errors) = parser.parse();
if !parse_errors.is_empty() {
print_errors(&parse_errors);
std::process::exit(65);
}
let script_dir = std::path::Path::new(filename)
.parent()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_else(|| ".".to_string());
let proto = match Compiler::compile(&stmts) {
Ok(p) => p,
Err(e) => {
eprintln!("Compile Error: {}", e);
std::process::exit(70);
}
};
let mut vm = Vm::with_current_dir(script_dir);
if let Err(e) = vm.run(std::rc::Rc::new(proto)) {
eprintln!("Error: {}", e);
std::process::exit(70);
}
}
pub fn run_repl() {
println!("Welcome to Aster REPL!");
println!("Type ':exit' to quit.");