如何在编译器中实现类

tjm*_*tjm 7 compiler-construction language-design llvm

我想为我自己的小语言实现一个类类型,但我起初想的不会太难让我难过.我有解析器,这是我遇到问题的代码生成方面.任何人都可以对最佳/正确的方法有所了解吗?具体来说,我想在LLVM中这样做,所以当我需要知道这个任何特定LLVM代码的一般性时,我应该使用它会很棒.

谢谢T.


注意:我对LLVM的体验基本上来自于Kaleidoscope教程,而且还有一些额外的内容,但我还远远没有完全理解LLVM API.

moj*_*uba 6

一个非常非常不完整的概述:

是一个结构(你知道C/C++不是吗?)

除了它们接收额外的隐式参数外,方法是普通函数:对象本身.该参数在函数中通常称为"this"或"self".类方范围符号可以(C++,JavaScript)或不可以(PHP,Python)在方法中默认可访问.

继承本质上是将结构粘合在一起,也可能合并符号表,因为通常默认情况下可以从您正在解析的类的方法中访问基类的符号.当您在方法中遇到符号(字段或方法)时,您需要执行升序查找,从当前上一层的层次结构开始.或者您可以实现它,以便只在一个符号表中查找,这是合并的结果.

虚拟方法是间接调用的.在某些语言中,所有方法默认都是虚拟的.实现将取决于它是否是一个完全动态的语言,在这种情况下,您总是在运行时查找类的函数名称,因此您的所有方法都会自动变为虚拟; 或者在静态语言的情况下,编译器通常构建所谓的虚拟方法表.我不确定你是否需要这个,所以我不会在这里详述.

构造函数是在构造新对象时调用的特殊方法(通常使用'new'),或者在后代构造函数中作为构造函数调用链的一部分调用.这里有许多不同的实现,一个是构造函数采用隐式的'this'参数,如果尚未创建对象,则该参数可能为NULL,并返回它.

破坏者是普通的方法,通常在对象超出范围时隐式调用.同样,您需要考虑到析构函数的升序调用链的可能性.

接口很棘手,除非你的语言完全是动态的.