#指令 #语言 # #解释器 #free #malloc #寄存器

app ilvm

类似于汇编语言的解释器

2 个版本

使用旧的 Rust 2015

0.2.1 2018年11月23日
0.2.0 2018年11月16日

#609 in 编程语言

BSD-3-Clause

28KB
736

ILVM

中级虚拟机 (ILVM) 是一种解释器,它具有一些特性,使其比典型的汇编语言更高级

  1. ILVM 有 mallocfree 指令,其工作方式类似于 C 函数。但是,free 列表不在程序内存中,因此程序无法意外地破坏它。

  2. ILVM 有 if ... then .. else 指令,因此它支持结构化控制流。

  3. ILVM 有打印到屏幕的原始指令。

注意:ILVM 实现了哈佛架构并且没有栈。

语言概述

ILVM 中的程序是一系列 的集合,其中每个块包含一系列指令。每个块都有一个唯一的数字,并且执行始终从块零开始。例如,以下程序只有一个块并打印 30

block 0 {
    exit(30);
}

以下程序使用 goto 指令跳转到块 1,然后打印 20

block 1 {
    exit(20);
}
block 0 {
    goto(1);
}

请注意,块出现的顺序并不重要。

寄存器、加载和存储

ILVM 有编号为 r0rn 的寄存器,其中 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