问题标签 [dynamic-dispatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
433 浏览

language-agnostic - 动态调度实现

我目前正在寻找实现动态调度的各种方法。

据我所知,有两种“简单”的方法可以实现这一点:

  • 虚函数表,如 C++ 中的
  • Message Dispatcher,就像在 SmallTalk 中一样(这有点类似于 Python 将方法存储为属性的想法__dict__

我会注意到,据我所知,选择 VFT 是因为它们执行合理且易于实现(也因为它们非常适合 C++ 单独编译模型),而不是因为它们是最快的方法。

我已经阅读了几篇文章和出版物,但是大多数都是“旧的”(我读到的最后一篇文章(*)提到了使用 Pentium 200MHz ...嗯),所以我怀疑它们是否代表了最先进的技术除非研究陷入僵局。

我对感兴趣:

  • 动态调度策略,如果它们支持多方法就更好了。
  • 各种策略的基准

我对最近的文章和不寻常的策略特别感兴趣(即使它们没有被证明是有效的)。

欢迎出版物,如果它们可以免费获得会更好,否则对所呈现的技术和结果的总结会很棒。

也欢迎真正编译器实现的技术文章。

(*)这篇关于 Eiffel 的文章说明了整个程序分析如何帮助删除虚拟呼叫站点。

0 投票
1 回答
266 浏览

monkeypatching - 如何猴子修补泛型类型标记函数表

我发现阅读可以在sicp中进行功能性动态调度的一种方法很有趣- 使用类型为标签 + 名称的表 -> 可以从中获取或添加的函数。

我想知道,这是动态非 OO 语言的典型类型调度机制吗?

还有什么是猴子路径的典型方法,使用表的链接列表(如果你在第一个表中没有找到它,递归地尝试下一个表)?将本地范围内的表重新绑定到修改后的副本?等等?

0 投票
3 回答
730 浏览

java - 在 Java 中:方法链调用继承层次结构的代码重用可能吗?

我有一些类继承 SubClass < MidClass < SuperClass 并希望为所有这些类执行一些向上的任务。TASK 相当复杂,仅在 3 个类中进行了微小的更改,我将它们移到了私有方法 m2() 中。

我目前的解决方案是非常样板:

我可以利用一些代码重用机制而不是复制 TASK 吗?

像下面这样的东西,m1() 只在 SuperClass 中,不起作用:

因为 super.m1() 不是指在超类的上下文中执行相同的继承方法,而是指被覆盖的方法实现。由于 m1() 在 Object 中不存在,我另外得到一个编译器错误......

将 TASK 放入 SuperClass 中受保护的最终 helper() 方法中并调用 helper() 而不是复制 TASK 将不起作用,因为那时总是调用 SuperClass.m2() 。

我能想到的唯一选择是缓慢、复杂和不安全:使用类型标记作为参数,即protected final void m1(Class<? extends SuperClass> clazz)在 SuperClass 中,并通过反射完成任务(需要将 m2() 设为公共静态或在 m2() 上使用 setAccessible(true)) .

你知道更好的解决方案吗?奥普?也许是一些可以将方法注入类的框架(如在 C# 中)?还是我错过了什么???

0 投票
4 回答
2719 浏览

java - 这是动态调度吗?

这是动态调度:

完全在另一个班级:

我不确定这是否是动态调度,因为两个子类的行为相同?

如果不是,如果行为是根据子类定义的,它会是动态调度吗?

0 投票
2 回答
1509 浏览

java - Java,替换“if not null”语句的聪明方法?

我有一个Vector完整的longs。

我希望能够始终调用getFirstElement()Vector 然后执行一个动作,比如说addToOtherVector(). 我希望能够不担心是否真的有一个值可以从我的原始向量返回。我想我可以通过这样覆盖来做到这addToOtherVector()一点:

但我不确定我需要做什么,因为它不会接受null作为参数?

我这样做的原因是因为我不希望每次尝试检索时都检查向量的大小

0 投票
2 回答
317 浏览

haskell - 动态调度、智能构造函数、模板 Haskell?

我正在查看HaskellWiki > Existential type # Dynamic dispatch mechanism

而且我在想,在 Template Haskell 中应该有一种方法来参与这部分:

并自动推导出这部分:

这是在模板 Haskell 中完成的吗?这可以在 TH 中完成吗?是否可以在普通的旧 Haskell 中完成类似的操作,而无需手动写出所有智能构造函数?这是否需要一个比 TH 更强大的特殊预处理器?

0 投票
2 回答
150 浏览

function - 根据类型为泛型函数提供不同的函数体

假设我有一些通用功能

但是对于特定类型,有一种更有效的方法genericFunc可以完成。

将这两个函数体组合成相同的最佳方法是什么genericFunc,这样当用于 时ParticularType,它会doSomeEasyWork,但当用于其他类型时,它会doSomeHardWork?我特别排除了使用不同名称或不同模块的选项。

我相信这可以通过 typeclass 来完成,但我对使用语言 pragma 的解决方案更感兴趣。我有一个模糊的想法,这可以通过语言杂注来完成,但我不知道如何。如果您比较和对比这些方法和/或任何其他可能的方法,则可以加分。

0 投票
1 回答
72 浏览

jvm - 通过早期调用预加载方法调度缓存?

缓存是 VM 用来使动态方法调度与基于静态“v-table”的方法查找相媲美的常用策略。我们能否利用这一点智能地“预调用”我们期望应用程序创建的各种对象的方法,希望在程序在其“正常”执行流程中实际使用该方法时避免缓存未命中?是否有任何带有 VM 的语言鼓励或以某种方式使这种做法变得更容易?当程序没有做太多工作时,虚拟机本身可以自动化这个过程吗?

0 投票
4 回答
1042 浏览

java - Java中的动态调度

假设我有一个A定义方法的类bar()。该方法bar()调用另一个方法foo()。然后我扩展AB覆盖foo()而不覆盖bar()(因此它被继承)。foo()在这两种情况下调用哪个?

0 投票
6 回答
443 浏览

c++ - O'Reilly 的“Objective-C Pocket Reference”声称 C++ 不支持动态调度,这是真的吗?

在第 4 页上,它说:

Objective-C 动态决定——在运行时——通过搜索接收者的类和父类来处理消息的代码。(Objective-C 运行时缓存搜索结果以获得更好的性能。)相比之下,C++ 编译器在编译时静态构造调度表。

我在 StackOverflow 和 Wikipedia 上阅读了很多内容,足以说明我对 C++ 是否支持 Dynamic Dispatch(有人说是动态绑定的实现)完全感到困惑。

任何人都能够弄清楚动态调度、动态绑定以及 C++ 是否支持其中之一或两者之间的区别?我不是 C++ 或 Objective-C 专家,我来自 Java、Python 和 PHP 世界。