Class/structure 个动态编程语言解释器成员
Class/structure members in a dynamic programming language interpreter
对于静态类型语言,成员访问很容易,您只需在编译时计算成员的偏移量即可。然而 ruby 或 python 是如何做到的呢?可能有更多具有相同成员名称的结构,您甚至不确定变量持有哪种对象。他们是否使用某种字典在运行时查找成员?
如果您要从头开始实现动态类型语言,那么您可能会从这里开始 - 使用基于哈希表的字典之类的东西,这是一个非常好的解决方案。
一些针对大小而不是性能优化的动态语言运行时(例如 Jerryscript,高度优化大小的 Javascript 解释器)专门使用这种方法,并且效果很好。
然而,大多数基于 JIT 的现代动态语言运行时,例如 V8 Javascript 引擎(在 Chrome 和 Node.js 中使用)或 JSC Javascript 引擎使用在 Safari 中,如果他们不能做任何更好的事情,只使用这种字典作为后备。
我在其中描述了 V8 映射的工作原理以及它们如何使 属性 访问非常高效。它包含一个 link 更详细的描述,以及 V8 首席工程师之一 Lars Bak 的视频,如果您对这些东西的工作原理感兴趣,这很好。
使用 Ruby(与 Javascript 一样),有许多不同的实现(JRuby、MRI、Rubinius 等),所以要回答这个问题 "How does Ruby do it" 是困难的——每个实现都会以不同的方式来实现(尽管会有很多相似之处,这是由语言设计强加的)。
由于您似乎是在询问一般动态语言中的概念,希望您会发现上面的 link 为您提供了一些有关可能实现的有用信息。
对于静态类型语言,成员访问很容易,您只需在编译时计算成员的偏移量即可。然而 ruby 或 python 是如何做到的呢?可能有更多具有相同成员名称的结构,您甚至不确定变量持有哪种对象。他们是否使用某种字典在运行时查找成员?
如果您要从头开始实现动态类型语言,那么您可能会从这里开始 - 使用基于哈希表的字典之类的东西,这是一个非常好的解决方案。
一些针对大小而不是性能优化的动态语言运行时(例如 Jerryscript,高度优化大小的 Javascript 解释器)专门使用这种方法,并且效果很好。
然而,大多数基于 JIT 的现代动态语言运行时,例如 V8 Javascript 引擎(在 Chrome 和 Node.js 中使用)或 JSC Javascript 引擎使用在 Safari 中,如果他们不能做任何更好的事情,只使用这种字典作为后备。
使用 Ruby(与 Javascript 一样),有许多不同的实现(JRuby、MRI、Rubinius 等),所以要回答这个问题 "How does Ruby do it" 是困难的——每个实现都会以不同的方式来实现(尽管会有很多相似之处,这是由语言设计强加的)。
由于您似乎是在询问一般动态语言中的概念,希望您会发现上面的 link 为您提供了一些有关可能实现的有用信息。