跳转到内容

嵌入概览

Vela 作为 Rust 拥有的脚本运行时嵌入应用。脚本描述业务逻辑,宿主 拥有持久状态、服务、IO、调度和部署策略。

典型宿主会创建 Engine,把源码编译成 program,创建 Runtime,再用 显式参数调用脚本入口。

use vela_engine::prelude::*;
let engine = Engine::builder()
.execution_profile(ExecutionProfile::embedded())
.register_script_host::<Player>()
.build()?;
let program = engine.compile_source(source)?;
let mut runtime = Runtime::new(engine, program);
let result = runtime.call(
"handle_tick",
CallArgs::new().with_host_mut("player", &mut player),
CallOptions::new(10_000, 1024 * 1024, 64),
)?;

Engine 是共享定义面。Runtime 是可变执行状态:heap、VM/extern state、 inline caches 和 hot-reload image。

脚本永远拿不到真实 Rust 引用。调用边界上的 &mut Player 在 VM 内会变成 调用作用域内的 HostRef。字段读写、复合赋值、keyed path 和 host method 调用都会经过 HostAccess

fn handle_tick(player: Player, amount) {
player.level += amount;
return player.level;
}

语法是普通字段访问,但运行时操作是显式的:读取当前宿主字段,计算新的 scalar 值,然后立即写穿到 adapter。

宿主拥有持久状态、对象生命周期、capability profile、执行预算、native 服务和热更新策略。脚本拥有的 records、arrays、maps、sets、strings、 closures 和 iterators 位于 Vela heap。宿主对象保留在 HostRefHostTargetPlanPathProxyHostAccess 之后。