脚本语言解释器如何引用其底层函数?

时间:2012-08-10 18:39:41

标签: python hashmap interpreter rhino v8

当谈到脚本解释器时,比如Rhino,Google V8,Python等 - 在给定一串脚本语言的情况下,是否存在确定底层本机方法的一般方法?

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

3 个答案:

答案 0 :(得分:1)

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

当然,如果发生了疯狂的事情,必须清除缓存,例如程序分配或删除该功能。

一旦填充了缓存,JIT编译器就可以使用inline caching使可预测的函数调用运行得非常快。

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

答案 1 :(得分:1)

CPython广泛使用名称空间进行函数/方法分派,这意味着哈希类型,即AKA“字典”。

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

答案 2 :(得分:1)

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

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

用户甚至可以访问字典。这样,您可以尝试以这种方式工作。然后,您也可以通过简单地将函数名称分配给另一个变量,轻松地为函数指定一个不同的名称(例如更短) - 赋值总是指分配参考值。