mcfpp面向对象——编译器思路
基本结构
类框架包含四个Java类,分别是Class
,ClassObject
,ClassType
,ClassPointer
。
Class
Class类包含的是一个mcfpp类的信息,包括它的字段,函数。静态和非静态的函数分别存放在不同的缓冲中。
ClassObject
表示一个mcfpp类的对象。在visitor遍历解析constructorCall
之后将会返回一个ClassObject
。
ClassPointer
表示一个指针。实质上在mc中表现为一个记分板的类型。包含一个Int变量用于记录模拟堆中实例的值。在更改指针指向的变量的时候,将会根据上一篇文章中提到的垃圾处理器原理对对象的指针列表进行处理。
ClassType
代表了一个类的静态指针实体,继承类ClassObject
。可以通过这个类访问一个类的静态缓存。它不可被ClassPointer
指向。
创建对象
创建对象发生在constructorCall
上下文中,它只能出现在表达式内。使用visitor在遍历表达式的时候进行创建。
变量的创建分为四个过程。
- 实例创建。创建实例对象的指针实体,并以此为环境执行preinit函数。
- preinit过程。给对象在堆上分配地址。执行init函数
- init过程。init函数用于在调用构造函数之前,对成员变量进行初始化。
- construct过程。调用mcfpp声明的construct方法。
只有init过程和construct过程是可以被自定义的。init函数将会在文件结构解析期间构造完成,而constructor函数则在文件结构解析过程中注册,文件内容解析过程中构造完成。
大致过程:
#某个函数 summon ... execute as ... at ... run function preinit #classxxx.preinit scoreboard players operation @s xxx = $index xxx scoreboard players add xxx 1 function init #classxxx.init classmember init function construct #classxxx.construct //all from mcfpp construct
编译器流程
编译的流程大致为:
编译器流程 | 发生的函数 | Minecraft Funtion执行的步骤 |
---|---|---|
声明并创建类的信息 | Class._init_ | 创建类的地址记分板 向preinit函数中添加地址分配的命令 |
获取要创建的类的对象的类的信息和类的构造方法 | visitConstructorCall | – |
创建对象的jvm实例。创建临时指针的jvm实例(MCInt类) | Class.newInstance ClassObject._init_ | – |
调用此类的Minecraft构造方法 | Constructor.invoke | 创建对象的Minecraft实例实体marker 调用初始化mcf函数 分配地址 调用mcf构造函数 让临时指针指向对象的地址 |
引用类型的变量赋值 | exitFieldDeclaration | 将变量的记分板值与指针一致 |