8 个版本
0.2.0 | 2024 年 1 月 22 日 |
---|---|
0.2.0-a1 | 2024 年 1 月 21 日 |
0.1.5 | 2024 年 1 月 6 日 |
0.1.4 | 2022 年 7 月 19 日 |
0.1.2 | 2021 年 9 月 19 日 |
37 在 模拟器
每月 45 次下载
76KB
2K SLoC
Calx VM
Calcit 运行器作为动态语言可能会很慢。Calx VM 尝试为非常简单但重复的任务提供一些辅助工具以加快计算速度。理想情况下,Calcit 应该使用 WASM 进行 CPU 重的计算。
用法
cargo install calx-vm
calx hello.cirru
它从 main
函数开始
fn main ()
const 1
call demo
const 0
call demo
fn demo (($a i64) ->)
local.get $a
if (->)
do
const 11
echo
do
const 20
echo
const 3
echo
-s
用于显示指令
$ calx demos/if.cirru -s
[calx] start preprocessing
loaded fn: CalxFunc main (-> )
00 Const(I64(1))
01 Call("demo")
02 Const(I64(0))
03 Call("demo")
loaded fn: CalxFunc demo (I64 -> )
local_names: 0_$a .
00 LocalGet(0)
01 JmpIf(5)
02 Const(I64(20))
03 Echo
04 Jmp(8)
05 Const(I64(11))
06 Echo
07 Jmp(8)
08 Const(I64(3))
09 Echo
[calx] start running
11
3
20
3
[calx] took 67.250µs: Nil
--emit-binary filename
用于将函数编码到二进制文件中。
--eval-binary
用于读取二进制输入文件以运行。
语法糖
代码
fn main ()
i.add
const 1
i.mul
const 2
const 3
echo
dup
assert "|expected 7"
i.eq
const 7
被转换成
fn main ()
const 2
const 3
i.mul
const 1
i.add
dup
echo
const 7
i.eq
assert "|expected 7"
指令
在 https://docs.rs/calx_vm/ 上找到文档。
高度灵感来自
- https://github.com/WebAssembly/design/blob/main/Semantics.md
- https://github.com/Darksecond/lox/blob/master/lox-vm/src/bettervm/vm.rs
预处理
在 Calx 运行指令之前,Calx 对它们进行预处理。有几个任务
block
和loop
被展开,因为有block-end
指令br
和br-if
也被展开为jmp
和jmp-if
指令,内部- 检查堆栈大小以确保分支之间一致,并在函数结束时进行整理
- 局部变量被重命名为索引
随着我对 WASM 的了解越来越多,代码库将得到更新。
许可证
MIT
依赖项
~3.5–5.5MB
~102K SLoC