mcfpp面向对象——编译器思路

||

基本结构

类框架包含四个Java类,分别是ClassClassObjectClassTypeClassPointer

Class

Class类包含的是一个mcfpp类的信息,包括它的字段,函数。静态和非静态的函数分别存放在不同的缓冲中。

ClassObject

表示一个mcfpp类的对象。在visitor遍历解析constructorCall之后将会返回一个ClassObject

ClassPointer

表示一个指针。实质上在mc中表现为一个记分板的类型。包含一个Int变量用于记录模拟堆中实例的值。在更改指针指向的变量的时候,将会根据上一篇文章中提到的垃圾处理器原理对对象的指针列表进行处理。

ClassType

代表了一个类的静态指针实体,继承类ClassObject。可以通过这个类访问一个类的静态缓存。它不可被ClassPointer指向。

创建对象

创建对象发生在constructorCall上下文中,它只能出现在表达式内。使用visitor在遍历表达式的时候进行创建。

变量的创建分为四个过程。

  1. 实例创建。创建实例对象的指针实体,并以此为环境执行preinit函数。
  2. preinit过程。给对象在堆上分配地址。执行init函数
  3. init过程。init函数用于在调用构造函数之前,对成员变量进行初始化。
  4. 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将变量的记分板值与指针一致

类似文章

发表回复