1 个稳定版本
1.4.0 | 2021 年 12 月 18 日 |
---|
#696 在 嵌入式开发
1.5MB
26K SLoC
Rhai - Rust 的嵌入式脚本语言和评估引擎
Rhai 是一个针对 Rust 的嵌入式脚本语言和评估引擎,它为任何应用程序添加脚本提供了安全且简单的方式。
目标和构建
- Rust 所支持的 所有 CPU 和操作系统目标,包括
- WebAssembly (WASM)
no-std
- 最小 Rust 版本 1.51
标准功能
- 类似于 JavaScript+Rust 的简单语言,具有 动态 类型。
- 相对高效的评估(单核、2.3 GHz Linux 虚拟机上的 0.3 秒内 1 百万次迭代)。
- 与原生 Rust 函数 和 类型 紧密集成,包括 获取器/设置器、方法 和 索引器。
- 通过外部
Scope
将 Rust 值作为 变量/常量 传递到脚本中 - 所有可克隆的 Rust 类型都受支持;无需实现任何特殊特质。或者直接访问 变量解析过程。 - 内置对大多数常见 数据类型 的支持,包括布尔值、整数、浮点数(包括
Decimal
)、字符串、Unicode 字符、数组 和 对象映射。 - 轻松从 Rust 调用脚本定义的函数。
- 相对较少的
unsafe
代码(是的,出于性能原因,有一些)。 - 依赖项很少 - 当前仅包含
smallvec
、num-traits
、ahash
和smartstring
。 - 可重入的脚本引擎可以通过
Send + Sync
特性实现(通过sync
特性)。 - 编译一次生成 AST 形式,以便重复评估。
- 脚本经过 优化(适用于基于模板的机器生成脚本)。
- 通过基于过程宏的 插件系统 实现易于定制的 API 开发。
- 支持 函数重载 和 操作符重载。
- 通过 函数指针 实现动态分发,并额外支持 柯里化。
- 支持捕获共享值的 闭包(匿名函数)。
- 对 面向对象编程(OOP) 提供一些语法支持。
- 使用动态加载的 模块 组织代码库,可选项 覆盖解析过程。
- 通过 serde 支持序列化和反序列化(需要
serde
特性)。 - 通过排除不必要的语言 特性 支持最小化构建。
防止攻击
- 不要恐慌 保证 - 任何恐慌都是错误。Rhai 订阅的座右铭是库永远不应该使宿主系统恐慌,并且以此为代码。
- 沙盒化 - 脚本引擎,如果声明为不可变,则除非 明确允许,否则不能修改包含的环境。
- 坚固耐用 - 防止恶意攻击(例如 栈溢出、数据过大、失控脚本 等),这些可能来自不可信的第三方用户空间脚本。
- 跟踪脚本评估 进度 并手动终止脚本运行。
对于那些真正想要自己的语言的人来说
示例
scripts
子目录包含示例 Rhai 脚本。
以下是脚本语言的标准 斐波那契 示例
// This Rhai script calculates the n-th Fibonacci number using a
// really dumb algorithm to test the speed of the scripting engine.
const TARGET = 28;
const REPEAT = 5;
const ANSWER = 317_811;
fn fib(n) {
if n < 2 {
n
} else {
fib(n-1) + fib(n-2)
}
}
print(`Running Fibonacci(${TARGET}) x ${REPEAT} times...`);
print("Ready... Go!");
let result;
let now = timestamp();
for n in 0..REPEAT {
result = fib(TARGET);
}
print(`Finished. Run time = ${now.elapsed} seconds.`);
print(`Fibonacci number #${TARGET} = ${result}`);
if result != ANSWER {
print(`The answer is WRONG! Should be ${ANSWER}!`);
}
项目网站
文档
有关 Rhai 脚本引擎和语言的详细信息,请参阅 Rhai 书籍。
游乐场
有一个 在线游乐场,具有语法高亮编辑器,由 WebAssembly 驱动。
可以直接从编辑器中评估脚本。
许可证
根据您选择以下任一项授权
除非另有明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在本软件包中的贡献,应如上双授权,不附加任何额外条款或条件。
依赖关系
~0.5–1.5MB
~33K SLoC