2012-08-10 55 views
3

当涉及到脚本解释器,如Rhino,Google V8,Python等 - 是否有任何通用的方法来确定底层的本地方法,只给予一串脚本语言?脚本语言解释器如何引用其基础功能?

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

+0

V8不是一个正常的解释器,它执行一些主要的优化,跳过任何中间格式,并直接跳转到低级执行。如果你想了解这一点,Python解释器可能是一个更好的候选人。 – voithos 2012-08-10 18:44:16

+1

Ralph,你是否介意通过“获取本地方法”确切地说明你的意思? – Malvolio 2012-08-10 18:50:22

+0

将“提取”更改为“确定”。即使使用V8,也必须有一些脚本中的字符串(例如方法名称)必须通过散列码算法,或者对其他字符串进行测试以确定要执行的操作。它是否正确? – 2012-08-10 19:18:19

回答

1

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

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

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

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

1

CPython广泛使用函数/方法调度的名称空间,这意味着哈希类型,即AKA“dictionary”。

Pypy,Jython,IronPython等可能会有自己的想法,如何做到最好。 Python!= CPython。

+0

CPython有一个方法缓存,用于存储方法查找结果,以避免在紧密的循环中一次又一次地执行相同的查找。 (Python中的缓存方法比JS中更容易,因为更多的东西是不可变的。) – 2012-08-10 19:34:58

1

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

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

用户甚至可以访问字典。这样,你可以尝试这种方式。然后,通过简单地将函数名称分配给另一个变量,您也可以轻松地赋予函数一个不同的名称(例如较短的名称) - 赋值始终意味着分配参考值。