2 个版本
使用旧的 Rust 2015
0.2.1 | 2018年11月23日 |
---|---|
0.2.0 | 2018年11月16日 |
#609 in 编程语言
28KB
736 行
ILVM
中级虚拟机 (ILVM) 是一种解释器,它具有一些特性,使其比典型的汇编语言更高级
-
ILVM 有 malloc 和 free 指令,其工作方式类似于 C 函数。但是,free 列表不在程序内存中,因此程序无法意外地破坏它。
-
ILVM 有 if ... then .. else 指令,因此它支持结构化控制流。
-
ILVM 有打印到屏幕的原始指令。
注意:ILVM 实现了哈佛架构并且没有栈。
语言概述
块
ILVM 中的程序是一系列 块 的集合,其中每个块包含一系列指令。每个块都有一个唯一的数字,并且执行始终从块零开始。例如,以下程序只有一个块并打印 30
block 0 {
exit(30);
}
以下程序使用 goto 指令跳转到块 1,然后打印 20
block 1 {
exit(20);
}
block 0 {
goto(1);
}
请注意,块出现的顺序并不重要。
寄存器、加载和存储
ILVM 有编号为 r0 至 rn 的寄存器,其中 n 可以由用户设置。ILVM 支持基本二进制操作(+、-、*),这些操作可以接受寄存器或常量作为参数,并将结果存储在寄存器中。它还支持从堆中将数据加载到寄存器中的操作,以及将值从寄存器存储到堆中的操作。以下是一些这些操作的示例
block 0 {
r0 = 10; // set r0 to 10
r1 = r0 * 2; // set r1 to 20
*r1 = 50; // store 50 at heap address 20
r2 = *r1; // load the value at heap address in r1 into r2 (i.e., set
// r2 to 50
exit(0);
}
控制流
goto(n); 指令跳转到块 n。参数可以是文字常量,也可以是存储在寄存器中的值。例如,以下程序计算要跳转到的块的地址
block 0 {
r0 = 10;
r1 = r0 - 9;
goto(r1); // jumps to block 1
}
block 1 {
exit(0);
}
ifz r trueBlock else falseBlock 指令是一个有两个子块的条件语句。如果寄存器中的值为零,它执行 trueBlock,否则执行 falseBlock。例如,以下程序计算 factorial(5)
block 0 {
r2 = 1;
r1 = 5;
goto(1);
}
block 1 {
ifz r1 {
exit(r2);
}
else {
r2 = r2 * r1;
r1 = r1 - 1;
goto(1);
}
}
请注意,子块可能有嵌套的 ifz 指令。还请注意,子块没有编号。因此,程序不能使用 goto 跳转到子块。
终止和(缺乏)穿透
《exit(n)》指令正常终止程序,并产生值《n》。《abort;》指令是异常退出,如果可能应避免使用。请注意,每个块的指令序列《必须》以《exit》、《goto》或《abort》结束。换句话说,程序不能“跌落”到下一个块,必须显式跳转到另一个块或终止。
内存分配
ILVM的《字大小》为32位。
程序可以读取和写入任何内存地址。所有内存地址和寄存器中存储的初始值都是零。每个内存位置和寄存器都是一字长(即,32位)。
ILVM有一个《malloc(n)》指令,它返回一个长度为《n》个《字》的空闲内存块的地址,以及一个《free(a)》指令,该指令释放地址为《a》分配的块。可能使用这些函数代替手动编写分配可能更方便。请注意,这些运算符在内存的独立部分维护它们的元数据,因此不良行为的程序无法破坏《malloc》和《free》所需的状态。
程序不必使用《malloc》和《free》。但是,这样做可能更方便。
具体语法
Registers r ::= "r0" | ... | "r64"
Values val ::= r
| i Signed 32-bit integers
Operators op ::= "+"
| "-"
| "*"
| "/"
| "%"
| "=="
| "<"
Instructions instr ::= "goto" "(" val ")" ";"
| "exit" "(" val ")" ";"
| "abort" ";"
| r "=" val op val ";" instr
| r "=" val ";" instr
| r "=" "*" val ";" instr
| "*" r "=" val ";" instr
| "ifz" val "{" instr "}" "else" "{" instr "}""
| r "=" "malloc" "(" val ")" ";" instr
| "free" "("r ")" ";" instr
Blocks block ::= "block" n "{" instr "}"
Programs p ::= block
| block p
命令行界面
运行《code>ilvm --help以获取文档。
依赖关系
~2MB
~28K SLoC