Stamon 文档站

回到首页
回到上一级

AstRunner开发文档

注意:此文档旨在说明AstRunner(以下简称“虚拟机”)的工作原理

虚拟机的运行原理为:将二进制文件读取为AstIr,交给AstIrConverter类解析为Running-Ast,最后交给vm/AstRunner.cpp递归运行。

我们规定:Stamon编译后的二进制文件为STVC文件,文件后缀为.stvc

我们来逐步讲解。

首先是二进制文件读取为AstIr,这部分的实现位于src/vm/AstIrReader.cpp,AstIrReader类的主要接口有:

想要完整的读取一个STVC文件,应该要先创建一个AstIrReader对象,然后先调用ReadHeader读取文件头信息,接着调用ReadIR来读取AstIr。调用这两个函数之后要分别检查是否有异常抛出。

接着是让AstIrConverter类解析为Running-Ast,这一部分在写了Ast与AstIr之间的互转工具部分里已经详细提及过了,故不再赘述。

最后是交给vm/AstRunner.cpp递归运行,AstRunner类采用了和语法分析器类似的结构,下面我们来看看重点的数据接口及接口:

AstRunner在递归执行Ast时的返回值为RetStatus类。RetStatus,全称Return-Status(返回状态),用于指示当前代码运行状况,我们来看看RetStatus的定义:

class RetStatus {   //返回的状态(Return Status)
        //这个类用于运行时
    public:
        int status; //状态码
        EasySmartPtr<Variable> retval;  //返回值(Return-Value),无返回值时为NULL
        RetStatus() {}
        RetStatus(const RetStatus& right) {
            status = right.status;
            retval = right.retval;
        }
        RetStatus(int status_code, EasySmartPtr<Variable> retvalue) {
            status = status_code;
            retval = retvalue;
        }
    };

其中的int status一行用于存储状态码,状态码有以下几类:

enum RET_STATUS_CODE {  //返回的状态码集合
    RetStatusErr = -1,  //错误退出(Error)
    RetStatusNor,       //正常退出(Normal)
    RetStatusCon,       //继续循环(Continue)
    RetStatusBrk,       //退出循环(Break)
    RetStatusRet        //函数返回(Return)
};

AstRunner的主要接口有:

  1. 抛出运行时异常,这些异常分别是:
void ThrowTypeError(int type);
void ThrowPostfixError();
void ThrowIndexError();
void ThrowConstantsError();
void ThrowDivZeroError();
void ThrowBreakError();
void ThrowContinueError();
void ThrowArgumentsError(int form_args, int actual_args);
void ThrowReturnError();
void ThrowUnknownOperatorError();
void ThrowUnknownMemberError(int id);
  1. 利用execute方法执行Running-Ast,它的函数原型是:
RetStatus execute(
    AstNode* main_node, bool isGC, int vm_mem_limit,
    ArrayList<DataType*> tableConst, ArrayList<String> args,
    STMException* e
);

虚拟机在执行过程中会向ObjectManager申请对象,来实现GC机制。

——摘自工作日志/20240512.md


查看该文件的提交记录