问题标签 [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.
language-agnostic - 动态调度实现
我目前正在寻找实现动态调度的各种方法。
据我所知,有两种“简单”的方法可以实现这一点:
- 虚函数表,如 C++ 中的
- Message Dispatcher,就像在 SmallTalk 中一样(这有点类似于 Python 将方法存储为属性的想法
__dict__
)
我会注意到,据我所知,选择 VFT 是因为它们执行合理且易于实现(也因为它们非常适合 C++ 单独编译模型),而不是因为它们是最快的方法。
我已经阅读了几篇文章和出版物,但是大多数都是“旧的”(我读到的最后一篇文章(*)提到了使用 Pentium 200MHz ...嗯),所以我怀疑它们是否代表了最先进的技术除非研究陷入僵局。
我对感兴趣:
- 动态调度策略,如果它们支持多方法就更好了。
- 各种策略的基准
我对最近的文章和不寻常的策略特别感兴趣(即使它们没有被证明是有效的)。
欢迎出版物,如果它们可以免费获得会更好,否则对所呈现的技术和结果的总结会很棒。
也欢迎真正编译器实现的技术文章。
(*)这篇关于 Eiffel 的文章说明了整个程序分析如何帮助删除虚拟呼叫站点。
monkeypatching - 如何猴子修补泛型类型标记函数表
我发现阅读可以在sicp中进行功能性动态调度的一种方法很有趣- 使用类型为标签 + 名称的表 -> 可以从中获取或添加的函数。
我想知道,这是动态非 OO 语言的典型类型调度机制吗?
还有什么是猴子路径的典型方法,使用表的链接列表(如果你在第一个表中没有找到它,递归地尝试下一个表)?将本地范围内的表重新绑定到修改后的副本?等等?
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# 中)?还是我错过了什么???
java - 这是动态调度吗?
这是动态调度:
完全在另一个班级:
我不确定这是否是动态调度,因为两个子类的行为相同?
如果不是,如果行为是根据子类定义的,它会是动态调度吗?
java - Java,替换“if not null”语句的聪明方法?
我有一个Vector
完整的long
s。
我希望能够始终调用getFirstElement()
Vector 然后执行一个动作,比如说addToOtherVector()
. 我希望能够不担心是否真的有一个值可以从我的原始向量返回。我想我可以通过这样覆盖来做到这addToOtherVector()
一点:
但我不确定我需要做什么,因为它不会接受null
作为参数?
我这样做的原因是因为我不希望每次尝试检索时都检查向量的大小
haskell - 动态调度、智能构造函数、模板 Haskell?
我正在查看HaskellWiki > Existential type # Dynamic dispatch mechanism。
而且我在想,在 Template Haskell 中应该有一种方法来参与这部分:
并自动推导出这部分:
这是在模板 Haskell 中完成的吗?这可以在 TH 中完成吗?是否可以在普通的旧 Haskell 中完成类似的操作,而无需手动写出所有智能构造函数?这是否需要一个比 TH 更强大的特殊预处理器?
function - 根据类型为泛型函数提供不同的函数体
假设我有一些通用功能
但是对于特定类型,有一种更有效的方法genericFunc
可以完成。
将这两个函数体组合成相同的最佳方法是什么genericFunc
,这样当用于 时ParticularType
,它会doSomeEasyWork
,但当用于其他类型时,它会doSomeHardWork
?我特别排除了使用不同名称或不同模块的选项。
我相信这可以通过 typeclass 来完成,但我对使用语言 pragma 的解决方案更感兴趣。我有一个模糊的想法,这可以通过语言杂注来完成,但我不知道如何。如果您比较和对比这些方法和/或任何其他可能的方法,则可以加分。
jvm - 通过早期调用预加载方法调度缓存?
缓存是 VM 用来使动态方法调度与基于静态“v-table”的方法查找相媲美的常用策略。我们能否利用这一点智能地“预调用”我们期望应用程序创建的各种对象的方法,希望在程序在其“正常”执行流程中实际使用该方法时避免缓存未命中?是否有任何带有 VM 的语言鼓励或以某种方式使这种做法变得更容易?当程序没有做太多工作时,虚拟机本身可以自动化这个过程吗?
java - Java中的动态调度
假设我有一个A
定义方法的类bar()
。该方法bar()
调用另一个方法foo()
。然后我扩展A
并B
覆盖foo()
而不覆盖bar()
(因此它被继承)。foo()
在这两种情况下调用哪个?
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 世界。