我正在编写一个编译器,虽然我理解我需要做些什么才能处理内置类型,如Int
,它们可以放入寄存器并可以被压入堆栈或其他任何东西很好,我不知道如何处理用户定义的类型(该语言主要是面向对象的),所以给出了这样的例子:
class Color
{
Color(Int r, Int g, Int b)
r
g
b
{ }
method GetR() Int
{
return r
}
}
r
,g
和b
自动成为Int
类型的成员变量。如何处理Color
的实例,例如GetR()
。
我的想法
我认为,执行此操作的最佳方法是保留一个寄存器(或者每个方法的堆栈帧中的空格可能更好?)来保存指向this
的指针。然后,如果您想要实现GetR()
,假设r10
持有此指针并且r
成员完全在该地址开始,则可以生成:
_G_Color_GetR:
mov rax, [r10]
ret
这是解决问题的好方法,如果没有,其他语言的其他编译器如何处理它呢?