8个不稳定版本 (3个重大变更)
0.4.0 | 2019年12月29日 |
---|---|
0.3.0 | 2019年11月20日 |
0.2.0 | 2019年10月19日 |
0.1.4 | 2019年9月22日 |
在 编程语言 中排名 569
775KB
21K SLoC
SMPL
S(ome) M(ore) P(rogramming) L(anguage),发音为 'simple'。
这是什么?
SMPL是一种简单的静态类型编程语言,旨在易于嵌入到 Rust 中并编写独立程序。
动机
SMPL被构建来替换我的选择自己的冒险引擎 CYOA 的脚本语言 Popstcl。
优点
- Rust-like 语法。
- 静态类型
- 词法作用域
具有Rust代码生成器的编译器- 可嵌入的(异步)解释器
- 函数管道
- 基于宽度的结构化子类型
- 泛型(具有基于宽度的结构化约束)
缺点
- 不完全匹配Rust 1:1
- 没有移动语义
- 没有生命周期概念
- 基础标准库
使用代码
项目分为两部分
- smpl
- 定义语言的内核crate
- 包括
- 解析器
- 静态分析器
- 字节码数据结构
- 字节码生成器
- 元数据收集器
- smpli
- smpl字节码的解释器
- 从解析和分析的SMPL模块创建AVM
- 为SMPL函数启动指令执行器
- 提供映射Rust -> SMPL(内建)函数的接口
- 运行时数据结构
- smpl字节码的解释器
示例
有关更多嵌入示例,请参阅 examples/tic-tac-toe
SMPL代码
// In a file or as a String
mod test;
// From interpreter's stdlib
use log;
struct Point3d {
x: int,
y: int,
z: int,
}
fn modify2d(type P)(point: P, x: int, y: int) -> P
where P: { x: int, y: int } {
point.x = x;
point.y = y;
return point;
}
fn getX(point: { x: int }) -> int {
return point.x;
}
fn add(l: int, r: int) -> int {
return l + r;
}
fn main() {
let p = init Point {
x: 0,
y: 0,
z: 0,
};
let p = modify2d(type Point)(p, 1, 2);
// Should print '4'
log::println(add(getX(p), 1) |> add(2));
}
Rust代码
// Running the above SMPL code using the 'smpli' crate
let scripts = vec![
// If you have a path, can use:
// parse_module(UnparsedModule::file(path, &str_buff))
VmModule::new(
parse_module(UnparsedModule::anonymous(module_string))
.unwrap()
)
];
let std = StdBuilder::default().log(true).build().unwrap();
let vm = AVM::new(std, scripts)?;
let fn_handle = vm.query_module("rt", "run").unwrap().unwrap();
let executor = match vm
.spawn_executor(fn_handle, None, SpawnOptions {
type_check: false
}) {
Ok(executor) => executor,
Err(e) => {
println!("{:?}", e);
process::exit(1);
}
};
let _result = match executor.execute_sync() {
Ok(val) => val,
Err(e) => {
println!("{:?}", e);
}
};
运行SMPL代码。
Rust后端暂时不支持。
SMPL旨在嵌入到其他Rust程序中。解释器是保证支持所有现有和未来语言功能的SMPL代码执行的唯一方法。
许可证
在 MIT许可证 下发布(见LICENSE-MIT)。
依赖项
~9.5MB
~166K SLoC