#指令 # #作者 #内存 #核心 #名称 #执行

bin+lib leptonvm

一个用于运行核心的虚拟机

1 个不稳定版本

0.1.0 2022年5月30日

#3 in #核心

GPL-2.0-or-later

34KB
597

这是关于 Nucleus 游戏 kaon 语言的介绍。目标是编写一个程序(夸克),它将在共享内存核心中存活时间最长。

安装说明

您可以使用 flakes 或 cargo 安装 lepton(nucleus 的实现)(待完成!)使用 nix flakes: nix run git+https://time.ta.rdis.dev/el/lepton 使用 cargo: cargo install leptonvm(!) (待完成!)

教程

“核心”是一个宽度为 4096 的线性随机访问内存序列。访问是 0 索引,并循环(地址 4096 与地址 0 相同)

示例核心(4 指令宽)

索引 指令

0

JUMP

1

ADD

2

JUMP

3

DIE

夸克是用一种称为 kaon 的语言编写的。每个夸克都必须从作者 + 标题行开始。所谓的“标题行”的格式为 @ 作者名称 : 程序名称,例如 @ John Doe : Brutus。鼓励夸克具有唯一的程序名称,以减少关于获胜者的混淆。

标题行之后,跟随一个或多个指令。每个指令以关键词开始,后跟一个或多个参数。参数以逗号分隔,参数和关键词之间有一个或多个空格。

所有参数也是地址。地址有四种类型:字面量、绝对、相对和相对偏移。字面量地址是一个数字,用作计算中的值。它们以 DIE 指令的形式存储在核心中。绝对地址以 # 为前缀,例如 #3。它们从核心的起始位置引用地址。相对地址是当前指令之前或之后的指令数,例如 .1(下一条指令)。每个相对指令都以前缀 . 开头。最后一种地址类型,相对偏移地址的形式为 .x#y。这类似于相对地址 除了 地址 y 的值会被添加到计算出的相对地址。这可以写成“从我所在位置起的 x 个单位的地址加上地址 y 的值”。

向前跳六条指令

die 5
jump .1#-1

如果地址 y 处的指令不是 DIE,量子将停止执行。例如,.1#-1 将将 .-1 的值移动到下一条指令(.1)之后。

每个量子都有自己的线程。每轮,计算机在线程之间切换。对于两个线程 A & B,这看起来像:ABABABABABABAB;对于三个:ABCABCABCABCABC。当程序死亡时,它就不再执行。如果程序 C 死亡:ABC ABC AB AB AB。死亡的量子 不会 将其内存清零或以其他方式删除。这意味着你可以跳入一个死亡的线程并将其复活(尽管不太可能)。当只剩下一个线程时,宣布获胜者。

莱普顿的使用

莱普顿是核的参考实现。它可在 https://time.ta.rdis.dev/el/lepton 获取。将每个程序作为命令行参数传递。使用 RUST_LOG 启用日志。 debug 将列出量子的加载和卸载。 trace 将打印正在执行的每条指令。通过传递 -p / --playback 将在每个周期生成核心的转储,以便进行调试/检查。每行包含当前周期的状态(第一行是在执行之前,第二行是在周期 1 之后)。要设置迭代次数,请使用 -i / --iterations(默认值为 4096*8)。

示例量子

一个简单的循环

@ Ellie : Loop
jump .0

跳转到当前地址

一个向前移动的量子

@ Ellie : Jogger
mov .0 .1

将当前指令复制到下一条指令(然后执行它)

一个使用 DIE 爆炸核心的量子

@ Ellie : Bomber
jump .2
die 0
mov .-1 .3#-1
add 1, .-2
jump .-2

这使用相对偏移地址使炸弹的目标向前移动(ADD)。

指令参考

指令语法

参数

结果

注意

移动x,y

x:源地址;y:目标地址

将值 x 复制到 y

y 不能是常量。

cmp x,y

x:任何值;y:任何值

比较 x 和 y,如果它们相等则设置相等标志

仅比较相等

ptlcmp x,y

x:任何值;y:任何值

比较指令类型 a 和 b。如果它们相等则设置标志

jump 0 == jump 1

ifa

a:任何地址

当设置相等标志时跳转到if(即最后一个cmp为真)

常数被视为绝对地址。

跳转到a

a:任何地址

将当前线程的执行移动到地址a。

常数被视为绝对地址。

添加a,b

a:任何值;b:任何地址

将a加到b并将结果存储在b中

b不能是常数。如果b是常数,程序将终止。

减a,b

a:任何值;b:任何地址

从b中减去a并将结果存储在b中

b不能是常数。如果b是常数,程序将终止。

乘a,b

a:任何值;b:任何地址

将a和b相乘并将结果存储在b中

b不能是常数。如果b是常数,程序将终止。

除以a,b

a:任何值;b:任何地址

将a除以b并将值存储在b中

b不能是常数。b的值不能为0。如果这些中的任何一个为真,程序将终止。

终止x

x:任何文字

如果执行此指令,程序将停止。但是,它会存储数据供其他指令使用。

魔法死亡陷阱

依赖关系

~6-15MB
~179K SLoC