javascript - 多态内联缓存如何与可变类型一起工作?

标签 javascript vm-implementation dynamic-typing cache-invalidation polymorphic-functions

多态内联缓存 (PIC) 通过按对象类型缓存实际方法来工作,以避免昂贵的查找过程(通常是哈希表查找)。

如果类型对象是可变的(即方法可能在运行时被猴子修补成不同的东西),如何处理类型比较?

我想出的一个想法是一个“类计数器”,每次调整一个方法时它都会递增,但是这似乎在一个大量修补猴子的环境中非常昂贵,因为它会杀死所有该类的 PIC,即使它们的方法没有改变。

我相信一定有一个很好的解决方案,因为这个问题直接适用于 JavaScript,据我所知,所有三个大型 JavaScript 虚拟机都有 PIC。

最佳答案

在 V8 中,我假设 monkeypatching 会更改对象的“隐藏类”(“映射”是 SELF 术语)。这在你猴子修补对象本身时会起作用。

如果你猴子修补类(你能做到吗?是 JS 吗?),我猜它会使所有 PIC 无效,因为这可能很少见。或者,它可能会重新编译旧方法以直接分派(dispatch)到新方法(我猜是在进行类型检查之后)

顺便说一句,我不认为其他“三巨头”实际上使用 PIC。我猜你指的是 squirrelfish 和 tracemonkey。前者是解释器,后者侧重于跟踪方法,我不记得听说过任何有关 PIC 的信息。事实上,我不认为 tracemonkey 对对象做了任何很酷的事情,但我可能是错的。

关于javascript - 多态内联缓存如何与可变类型一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053084/

相关文章:

programming-languages - 静态类型和动态类型语言有什么区别?

javascript - 使用 recorder.js 在 web2py 中实现录音

javascript - for循环中的多个函数

interpreter - VM 如何从解释代码切换到运行 JIT 代码?

pointers - 引用与指针的执行速度

javascript - TypeScript 接口(interface)是否应该在 *.d.ts 文件中定义

javascript - Handlebars.js 使用 noEscape 选项禁用转义?

python - 如何在 Python 中对变量进行类型检查?

variables - 动态类型语言中 map /列表的变量命名约定