#language #virtual-machine #garbage-collection #dynamic #stack-based #nan-tagging #ir-builder

nightly zubbers

一个快速的基于堆栈的动态语言虚拟机,具有直观的IR构建器、垃圾回收和NaN标记

1个不稳定版本

0.0.1 2023年1月12日

#16 in #基于堆栈

MIT 许可证

110KB
3K SLoC

Zub VM

一个超快的基于堆栈的动态语言虚拟机

警告

这个库最近被分叉,正在重做以添加新功能,不要期望太多东西是稳定的。

特性

  • NaN标记值表示
  • 标记和清除垃圾回收
  • 紧凑的字节码格式
  • 易于使用的中间表示

里程碑

  • 基于Briones先生工作的改进VM
  • 跟踪垃圾收集器
  • 高级IR
  • IR编译
  • 优化器(目前达到80-90%的Python速度,目标是更快)
  • 分析器和反汇编器

示例

构建IR很简单

让你的后端运行起来不应太困难。

以下代码构建了评估 sum = 20.0 + 30.0 的IR

let mut builder = IrBuilder::new();

let a = builder.number(20.0);
let b = builder.number(30.0);

let sum = builder.binary(a, BinaryOp::Add, b);

builder.bind(Binding::global("sum"), sum);

当你觉得IR看起来很顺畅时。只需让VM通过编译器运行,并执行它。

let mut vm = VM::new();
vm.exec(&builder.build());

语言

Hugorm

Hugorm是一种动态的、类似Python的语言,旨在为小型数据科学和游戏项目构建。

https://github.com/nilq/hugorm

示例

examples/ 文件夹中包含了两个在ZubVM上运行的简单语言实现。

Atto

Atto是一种功能性的、极简的语言,展示了实现一个有效的工作Turing完整语言需要多么少的代码。语法可以在以下预告中看到

fn sum x is
    if = x 0
        1
    + sum - x 1 sum - x 1

fn main is
    sum 12

Mini

Mini是一种简单的语言,看起来基本上是Rust和JavaScript的混合。它涵盖了比Atto更广泛的特性集合。尽管如此,这也在语言的大小上得到了体现。

let bar = 13.37;

fn foo() {
  fn baz(c) {
    return c + bar;
  }
  
  return baz(10);
}

global gangster = foo();

特别感谢

依赖项

~5–11MB
~129K SLoC