我目前正处于为类Java语言构建编译器的代码生成阶段。我正在尝试了解如何为虚拟方法实现动态调度。
我得到了如何为每个类构建虚函数表并在每个对象中存储指向它的指针。我没有得到的是 - 在为函数调用生成代码时,您如何知道表中该函数的偏移量?
感谢。
答案 0 :(得分:0)
你怎么知道你的语言是什么?你在解析的时候把它写在某个地方。
我用我的一种玩具语言做的是保持" vtable尺寸"对于每个类,当你向类添加一个新方法时,你将vtable大小写下来作为某个方法的偏移量(即你创建一个查找表,将方法名称映射到有关它的信息,比如它的参数类型和它在vtable中的偏移量),然后添加大小以考虑新添加的方法。
当然,这假设您的语言实际上使用了vtable,例如C ++。如果您使用Smalltalk或Objective-C样式的消息传递,那么您构建的这个表实际上会保存到已编译的产品中并直接使用。现在查表比直接访问偏移更慢,但也有一个优点,调用者不需要知道对象的类型来调用它上面的方法,并且你可以轻松地向对象添加方法而不需要重新编译整个程序。