Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compilation 动态调度实现-虚拟功能表偏移_Compilation_Compiler Construction - Fatal编程技术网

Compilation 动态调度实现-虚拟功能表偏移

Compilation 动态调度实现-虚拟功能表偏移,compilation,compiler-construction,Compilation,Compiler Construction,我目前正处于为类Java语言构建编译器的代码生成阶段。我试图理解如何为虚拟方法实现动态调度 我知道如何为每个类构建一个虚拟函数表,并在每个对象中存储指向它的指针。我没有得到的是-当为函数调用生成代码时,如何知道表中该函数的偏移量是多少 谢谢。你怎么知道你的语言里有什么东西?你在解析的时候把它写在某个地方 我在我的一种玩具语言中所做的是为每个类保留一个“vtable size”,当你向一个类添加一个新方法时,你把vtable size写下来作为某个地方方法的偏移量(即,你创建一个查找表,将方法名映

我目前正处于为类Java语言构建编译器的代码生成阶段。我试图理解如何为虚拟方法实现动态调度

我知道如何为每个类构建一个虚拟函数表,并在每个对象中存储指向它的指针。我没有得到的是-当为函数调用生成代码时,如何知道表中该函数的偏移量是多少


谢谢。

你怎么知道你的语言里有什么东西?你在解析的时候把它写在某个地方

我在我的一种玩具语言中所做的是为每个类保留一个“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),但有变化和其他的替代方案。总的来说,这个问题太宽泛了,这里无法回答。您如何知道数据成员的偏移量?这两个问题有何不同?