HeadlinesBriefing HeadlinesBriefing.com

对象映射、形状与隐藏类详解

Hacker News •
×

在 Python、Ruby 和 JavaScript 等动态类型语言中,对象看起来像是属性名到值的映射。这种灵活性促使运行时实现者用哈希表来建模属性,这似乎很自然,因为哈希表擅长将名称映射到值。

然而,哈希表方案存在缺陷。对于非常常见的操作,哈希计算和探测速度很慢。哈希表还增加了一次间接寻址,迫使程序从对象跳转到一个独立的存储结构。因此,像 a.b 这样简单的属性访问可能需要数百甚至数千条 CPU 指令,其中包括多次相互依赖的内存加载。由于属性访问非常频繁,将属性直接内联存储在对象上会高效得多。

为了解决这一问题,运行时使用了多种被称为 map、layout、shape 或隐藏类的结构。它们优化了属性的读取、写入和存储。许多生产级运行时包含复杂的、特定领域的边界情况,而许多博客文章只提供高层概述,缺乏实现细节。

作者以 CF Bolz-Tereick 的《A Simple Object Model》为基础,该文较为忠实地模拟了 Python。作者没有涵盖类和方法的机制,而是专注于实例属性和 map 部分,提炼出一个精简、清晰、不到 500 行代码的 map 系统,读者可以一次性在脑海中理解它。

来源: Hacker News · 由HeadlinesBriefing整理摘要