1 个不稳定版本
0.1.0 | 2022年5月30日 |
---|
#3 in #核心
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 |
y 不能是常量。 |
|
x:任何值;y:任何值 |
比较 x 和 y,如果它们相等则设置相等标志 |
仅比较相等 |
|
x:任何值;y:任何值 |
比较指令类型 a 和 b。如果它们相等则设置标志 |
|
|
a:任何地址 |
当设置相等标志时跳转到if(即最后一个 |
常数被视为绝对地址。 |
|
a:任何地址 |
将当前线程的执行移动到地址a。 |
常数被视为绝对地址。 |
|
a:任何值;b:任何地址 |
将a加到b并将结果存储在b中 |
b不能是常数。如果b是常数,程序将终止。 |
|
a:任何值;b:任何地址 |
从b中减去a并将结果存储在b中 |
b不能是常数。如果b是常数,程序将终止。 |
|
a:任何值;b:任何地址 |
将a和b相乘并将结果存储在b中 |
b不能是常数。如果b是常数,程序将终止。 |
|
a:任何值;b:任何地址 |
将a除以b并将值存储在b中 |
b不能是常数。b的值不能为0。如果这些中的任何一个为真,程序将终止。 |
|
x:任何文字 |
如果执行此指令,程序将停止。但是,它会存储数据供其他指令使用。 |
魔法死亡陷阱 |
依赖关系
~6-15MB
~179K SLoC