3

对于脚本解释器,如 Rhino、Google V8、Python 等,是否有任何通用方法来确定底层本机方法,只给出一串脚本语言?

在某些时候,这些解释器是否使用带有字符串的哈希映射作为键?还是有很多字符串相等测试和分支?

4

3 回答 3

1

它们通常使用带有字符串键的哈希映射,但函数查找的结果通常会被缓存,以避免在几纳秒后再次进行完全相同的查找。

当然,如果发生一些疯狂的事情,例如程序分配或删除函数,则必须清除缓存。

JIT 编译器可以使用内联缓存来使可预测的函数调用在缓存填充后运行得非常快。

编译器甚至可以直接输出直接调用底层函数的机器代码。同样,如果程序替换或删除该函数,编译的代码将变得无效;因此解释器必须有办法检测这种情况并更新或丢弃无效的 JIT 代码。

于 2012-08-10T19:23:31.373 回答
1

CPython 将命名空间广泛用于函数/方法分派,这意味着哈希类型,又名“字典”。

Pypy、Jython、IronPython 等可能对如何最好地做到这一点有自己的想法。Python!= CPython。

于 2012-08-10T19:29:55.833 回答
1

对于 Python,当 Python 处理源代码时,所有定义(类及其方法、普通函数等)都会被编译。代码部分的编译结果存储为捕获代码的对象。名称存储在内部仅用于自省目的——从用户的角度来看,对象是未命名的。但是,(类、函数的)名称作为键存储在内部哈希映射(在 Python 中称为字典)中。该值是对未命名对象的引用。

Python 中的任何变量都是绑定到无类型引用(哈希映射中的键、值)的名称。每当名称出现在 Python 中时,您都在使用引用变量。它通过在提到的哈希映射(字典)中搜索自动取消引用。

用户甚至可以访问字典。这样,您可以尝试它以这种方式工作。然后,您还可以通过简单地将函数名称分配给另一个变量来轻松地为函数赋予不同的名称(例如更短的名称)——分配总是意味着分配引用值。

于 2012-08-10T19:32:58.710 回答