1 个稳定版本
1.17.2 | 2024 年 2 月 14 日 |
---|
#185 在 嵌入式开发
2MB
36K SLoC
Rhai - Rust 的嵌入式脚本语言和评估引擎
Rhai 是一个用于 Rust 的嵌入式脚本语言和评估引擎,它为任何应用程序安全方便地添加脚本提供了途径。
目标和构建
- Rust 支持的所有 CPU 和操作系统目标,包括
- WebAssembly (WASM)
no-std
- 最小 Rust 版本 1.66.0
标准功能
- 类似于 JavaScript+Rust 的简单语言,具有 动态类型。
- 相当高效的评估(在单个核心 2.6 GHz Linux 虚拟机上,1 百万次迭代用时 0.14 秒)。
- 与原生 Rust 函数 和 类型 紧密集成,包括 获取器/设置器、方法 和 索引器。
- 通过外部
Scope
将 Rust 值作为 变量/常量传递到脚本中,所有可克隆的 Rust 类型都受支持;无需实现任何特殊 trait。或者直接访问 变量解析过程。 - 内置支持大多数常见 数据类型,包括布尔值、整数、浮点数(包括
Decimal
)、字符串、Unicode 字符、数组(包括打包的 字节数组)和 对象映射。 - 从 Rust 中轻松 调用脚本定义的函数。
- 相对较少的
不安全
代码(是的,出于性能原因,有一些)。 - 依赖项很少 - 目前只有
smallvec
、thin-vec
、num-traits
、once_cell
、ahash
、bitflags
和smartstring
。 - 可重入的脚本引擎可以通过
sync
功能实现Send + Sync
。 - 一次编译成AST形式,用于重复评估。
- 脚本经过优化(对于基于模板的机器生成脚本非常有用)。
- 通过插件系统轻松开发自定义API,该系统由过程宏提供支持。
- 支持函数重载和操作符重载。
- 通过函数指针进行动态分派,并额外支持柯里化。
- 闭包(匿名函数),可以捕获共享值。
- 对面向对象编程(OOP)提供一些语法支持。
- 使用动态可加载的模块组织代码库,可选地覆盖解析过程。
- 通过serde提供序列化/反序列化支持(需要
serde
功能)。 - 通过排除不需要的语言功能支持最小构建。
- 提供调试接口。
抵御攻击。
- 不要恐慌保证 - 任何恐慌都是错误。Rhai遵循的座右铭是库永远不应该使宿主系统恐慌,并且考虑到这一点进行编码。
- 沙盒化 - 如果脚本引擎被声明为不可变,除非明确允许,否则不能修改包含的环境。
- 坚固耐用 - 防止恶意攻击(例如栈溢出、过大的数据、失控脚本等),这些可能来自不受信任的第三方用户脚本。
- 跟踪脚本评估进度并手动终止脚本运行。
- 通过Miri。
对于那些真正想要自己的语言的人来说
示例
子目录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许可证中定义的,应按上述方式双许可,不附加任何额外条款或条件。
依赖项
约2.5-6MB
约108K SLoC