Programming languages vtable的替代方案

Programming languages vtable的替代方案,programming-languages,methods,virtual,vtable,Programming Languages,Methods,Virtual,Vtable,Vtables在大多数OO实现中无处不在,但它们有替代方案吗?vtables的wiki页面有一个简短的简介,但实际上没有太多的信息(和存根链接) 您知道一些不使用vtables的语言实现吗 是否有讨论替代方案的免费在线页面 是的,有很多选择 Vtables仅在两种情况下可用 所有方法调用都可以静态确定。如果可以按字符串名称调用函数,或者如果没有关于调用方法的对象的类型信息,则不能使用vtables,因为无法将每个方法映射到某个表中的索引。类似地,如果可以在运行时向类添加函数,则不能静态地为vta

Vtables在大多数OO实现中无处不在,但它们有替代方案吗?vtables的wiki页面有一个简短的简介,但实际上没有太多的信息(和存根链接)

您知道一些不使用vtables的语言实现吗


是否有讨论替代方案的免费在线页面

是的,有很多选择

Vtables仅在两种情况下可用

  • 所有方法调用都可以静态确定。如果可以按字符串名称调用函数,或者如果没有关于调用方法的对象的类型信息,则不能使用vtables,因为无法将每个方法映射到某个表中的索引。类似地,如果可以在运行时向类添加函数,则不能静态地为vtable中的所有方法分配索引
  • 继承可以静态确定。如果您使用原型继承,或者使用另一种继承方案,无法静态地判断继承结构是什么样子,则无法预计算表中每个方法的索引,也无法预计算插槽中的特定类的方法
  • 通常,继承是通过使用基于字符串的表将函数名映射到它们的实现来实现的,同时使用指针允许每个类查找其基类。然后,通过遍历该结构,在实现该方法的接收方对象的类处或之上查找最低的类,来实现方法分派。为了加快执行速度,经常使用内联缓存等技术,其中调用站点根据对象的类型存储应该调用哪个方法的猜测,以避免花费时间遍历整个结构。自编程语言使用了这种思想,然后将其合并到HotSpot JVM中以处理接口(标准继承仍然使用vtables)

    另一种选择是使用跟踪,编译器发出代码猜测对象的类型,然后硬编码要调用到跟踪中的方法。Mozilla Firefox在其JavaScript解释器中使用了这一点,因为没有为每个对象构建vtables的方法

    我刚教完一门编译器课程,我的一堂课是关于各种编程语言中对象的实现以及相关的权衡。如果你愿意,你可以看看幻灯片

    希望这有帮助