6 个版本
0.6.0 | 2023 年 10 月 24 日 |
---|---|
0.5.5 | 2020 年 3 月 10 日 |
0.5.4 | 2019 年 2 月 23 日 |
0.5.3 | 2018 年 12 月 17 日 |
#362 在 编程语言 中
在 2 crate 中使用
56KB
1.5K SLoC
简介
锶是一个具有类型寄存器和多方法的字节码机器,用于静态和动态类型编程语言。
它主要用于支持 Mag 作为语言引擎的底层执行部分。任何 Mag 源代码首先通过解析器,然后编译为 Strontium 字节码,最后由这个虚拟机解释。
指令集架构
使用轻量级的 RISC 类指令集架构,以保持指令数量小且易于维护,同时使用多个字节码指令的组合来实现更复杂的功能。
寄存器
机器启动时预分配以下寄存器
寄存器 | 类型 | 内容 | 描述 |
---|---|---|---|
ip |
UInt64 |
0 |
从 bc 寄存器中读取下一个字节的索引。 |
bc |
Array<UInt8> |
[] |
运行程序的字节码。 |
r1..r8 |
Empty |
通用寄存器 |
使用 LOAD
指令在运行时从字节码中加载值到通用寄存器。
指令集
以下指令可以用于程序字节码来操作寄存器
操作码 | 名称 | 描述 |
---|---|---|
0 | HALT |
立即停止所有执行。 |
1 | LOAD |
从程序字节码中加载一个 Value 到寄存器中。 |
2 | MOVE |
将一个值从一个寄存器移动到另一个寄存器。操作后源寄存器将被清空。 |
3 | COPY |
将一个值从一个寄存器复制到另一个寄存器。源寄存器将保持不变。 |
4 | CALCULATE |
在两个寄存器上执行计算(ADD 、SUBTRACT 、MULTIPLY 、DIVIDE ),并将结果写入第三个寄存器。 |
5 | COMPARE |
在两个寄存器上执行比较(EQ 、NEQ 、LT 、LTE 、GT 、GTE ),并将结果写入第三个寄存器。 |
6 | BITWISE |
对一个寄存器(NOT )或两个寄存器(AND 、OR 、XOR 、LSH 、RSH )执行位运算,并将结果写入另一个寄存器。 |
7 | 跳转 |
使用以下方法之一(绝对 、正向 、反向 )将程序计数器设置为存储位置中的值。 |
8 | JUMPC |
与上一条指令相同,但额外带有一个寄存器地址参数。只有当指定的寄存器包含值为真时,才会执行跳转。 |
9 | 中断 |
发出需要立即关注的事件(读取 、打印 )。 |
10 | 调用 |
未实现的调用指令 |
11 | 返回 |
未实现的返回指令 |
本README将很快更新,添加更多文档。
项目状态
该项目仍处于alpha阶段,因此该库的语义和API表面将在一段时间内动态变化。请勿在生产环境中依赖于此,并预期会有重大变化。
如果您有兴趣参与这个项目,请与我们联系!
测试
即将推出
许可协议
MIT许可协议下授权。
依赖项
约7-18MB
约239K SLoC