Compilation 动态调度实现-虚拟功能表偏移
我目前正处于为类Java语言构建编译器的代码生成阶段。我试图理解如何为虚拟方法实现动态调度 我知道如何为每个类构建一个虚拟函数表,并在每个对象中存储指向它的指针。我没有得到的是-当为函数调用生成代码时,如何知道表中该函数的偏移量是多少Compilation 动态调度实现-虚拟功能表偏移,compilation,compiler-construction,Compilation,Compiler Construction,我目前正处于为类Java语言构建编译器的代码生成阶段。我试图理解如何为虚拟方法实现动态调度 我知道如何为每个类构建一个虚拟函数表,并在每个对象中存储指向它的指针。我没有得到的是-当为函数调用生成代码时,如何知道表中该函数的偏移量是多少 谢谢。你怎么知道你的语言里有什么东西?你在解析的时候把它写在某个地方 我在我的一种玩具语言中所做的是为每个类保留一个“vtable size”,当你向一个类添加一个新方法时,你把vtable size写下来作为某个地方方法的偏移量(即,你创建一个查找表,将方法名映
谢谢。你怎么知道你的语言里有什么东西?你在解析的时候把它写在某个地方 我在我的一种玩具语言中所做的是为每个类保留一个“vtable size”,当你向一个类添加一个新方法时,你把vtable size写下来作为某个地方方法的偏移量(即,你创建一个查找表,将方法名映射到关于它的信息,比如它的参数类型和它在vtable中的偏移量),然后添加到大小以说明新添加的方法
当然,假设你的语言实际使用了一个VTABLE,比如C++。如果您以Smalltalk或Objective-C的方式使用消息传递,那么您构建的这个表实际上会保存到编译后的产品中,并直接使用。现在,表查找比直接访问偏移量慢,但还有一个优点,即调用者不需要知道对象的类型就可以调用该对象上的方法,并且您可以轻松地向对象添加方法,而无需重新编译整个程序。您如何知道您的语言中有什么内容?你在解析的时候把它写在某个地方 我在我的一种玩具语言中所做的是为每个类保留一个“vtable size”,当你向一个类添加一个新方法时,你把vtable size写下来作为某个地方方法的偏移量(即,你创建一个查找表,将方法名映射到关于它的信息,比如它的参数类型和它在vtable中的偏移量),然后添加到大小以说明新添加的方法
当然,假设你的语言实际使用了一个VTABLE,比如C++。如果您以Smalltalk或Objective-C的方式使用消息传递,那么您构建的这个表实际上会保存到编译后的产品中,并直接使用。现在,表查找比直接访问偏移量慢,但还有一个优点,即调用者不需要知道对象的类型就可以调用该对象上的方法,并且您可以轻松地向对象添加方法,而无需重新编译整个程序。这是您的语言、编译器和,和二进制表示。您可以考虑研究JLS和JVM规范,以了解java是如何执行的(因为您提到java),但有变化和其他的替代方案。总的来说,这个问题太宽泛了,这里无法回答。您如何知道数据成员的偏移量?这两个问题有何不同?这是语言、编译器和二进制表示的设计问题。您可以考虑研究JLS和JVM规范,以了解java是如何执行的(因为您提到java),但有变化和其他的替代方案。总的来说,这个问题太宽泛了,这里无法回答。您如何知道数据成员的偏移量?这两个问题有何不同?