#vm #cirru #preprocessor #calcit #dynamic #language #calx

bin+lib calx_vm

基于堆栈的虚拟机,具有动态数据,用于实验

8 个版本

0.2.0 2024 年 1 月 22 日
0.2.0-a12024 年 1 月 21 日
0.1.5 2024 年 1 月 6 日
0.1.4 2022 年 7 月 19 日
0.1.2 2021 年 9 月 19 日

37模拟器

每月 45 次下载

MIT 许可证

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/ 上找到文档。

高度灵感来自

预处理

在 Calx 运行指令之前,Calx 对它们进行预处理。有几个任务

  • blockloop 被展开,因为有 block-end 指令
  • brbr-if 也被展开为 jmpjmp-if 指令,内部
  • 检查堆栈大小以确保分支之间一致,并在函数结束时进行整理
  • 局部变量被重命名为索引

随着我对 WASM 的了解越来越多,代码库将得到更新。

许可证

MIT

依赖项

~3.5–5.5MB
~102K SLoC