<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>JIT编译优化 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《对象、属性、Map，天哪！——动态语言的对象形状（Object Shapes）解析》</title><link>https://channel.meo-ai.com/posts/737</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/737</guid><pubDate>Sat, 31 Oct 2026 00:56:19 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《对象、属性、Map，天哪！——动态语言的对象形状（Object Shapes）解析》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0&quot; title=&quot;#编程语言实现&quot;&gt;#编程语言实现&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BC%98%E5%8C%96&quot; title=&quot;#虚拟机优化&quot;&gt;#虚拟机优化&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%AF%B9%E8%B1%A1%E5%BD%A2%E7%8A%B6&quot; title=&quot;#对象形状&quot;&gt;#对象形状&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HiddenClass&quot; title=&quot;#HiddenClass&quot;&gt;#HiddenClass&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%86%85%E8%81%94%E7%BC%93%E5%AD%98&quot; title=&quot;#内联缓存&quot;&gt;#内联缓存&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8A%A8%E6%80%81%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80&quot; title=&quot;#动态类型语言&quot;&gt;#动态类型语言&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23JIT%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96&quot; title=&quot;#JIT编译优化&quot;&gt;#JIT编译优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80&quot; title=&quot;#内存布局&quot;&gt;#内存布局&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这篇博文讲解了动态类型语言（Python、Ruby、JavaScript 等）运行时如何用“对象形状”（maps / hidden classes）替代朴素的“哈希表存属性”模型。作者基于 CF Bolz-Tereick 的极简对象模型，用不足一页的 Python 代码完整实现了形状树、内联缓存（inline cache）的核心逻辑，并延伸到存储策略、类型冻结、类版本化等进阶优化，最后用 C++ 草绘了 V8、JSC、Skybison 等真实运行时的内存布局。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 朴素模型用哈希表存对象属性：虽然概念上是 O(1)，但每次属性访问都要做字符串哈希、探测和一次额外的间接内存跳转，热路径上可能耗费成百上千条 CPU 指令。&lt;br /&gt;2. 形状（map/hidden class）同时解决三个问题：把字符串查找换成小整数偏移、让属性内联存储在对象内部消除间接跳转、作为不可变的稳定标识供快速比对——属性一旦变化就沿形状树换到新 map，旧 map 永不修改。&lt;br /&gt;3. 形状是持久化数据结构（树/字典树）：所有空对象共享同一个空 map，按相同顺序加属性则共享同一形状；加属性顺序不同（如 &lt;code&gt;a&lt;/code&gt; 后 &lt;code&gt;b&lt;/code&gt; vs 反过来，或条件分支里赋值）会产生不同形状，这是实践中缓存命中率下降的常见原因。&lt;br /&gt;4. 内联缓存的工作方式：缓存“期望 map + 属性偏移”的组合，用指针相等（&lt;code&gt;is&lt;/code&gt;）做极快校验，命中则直接按偏移加载；未命中走字符串慢路径并回填缓存——真机实现中快速路径内联、慢速路径外联，JIT 编译器还会进一步消除这层“解释态”。&lt;br /&gt;5. 形状与类是两个概念：不同类的对象可以有相同形状，这让内联缓存保持单态（monomorphic）、命中率更高；但也意味着形状不能作为类的代理（如 Ruby &lt;code&gt;attr_reader&lt;/code&gt; 需要“类查方法 + 形状查偏移”两段式查找）。&lt;br /&gt;6. 进阶方向包括：给 map 附带类型信息（类型冻结，记录“该属性永远是 float”以减少守卫）、按存储策略单态化集合（空列表、小整数列表等专用布局）、类版本化，以及给真实运行时预留“溢出槽”处理对象估不准的大小。&lt;br /&gt;7. 实用启示：大多数对象字段很少（&amp;lt;20 个），Ruby 等运行时会在对象过大时退回哈希表模式；性能回归中缓存命中与未命中在热路径上可能有 2 倍以上的差距，Rails 等项目已有通过保持形状单态来优化 JIT 的实战 PR。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://bernsteinbear.com/blog/object-shapes/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://bernsteinbear.com/blog/object-shapes/&quot;&gt;https://bernsteinbear.com/blog/object-shapes/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://bernsteinbear.com/blog/object-shapes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Or, IC UC we all C for ICs.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Max Bernstein&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Objects, attributes, maps, oh my!&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Or, IC UC we all C for ICs.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Python 3.15的JIT编译器重回正轨》</title><link>https://channel.meo-ai.com/posts/577</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/577</guid><pubDate>Wed, 18 Mar 2026 11:21:29 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Python 3.15的JIT编译器重回正轨》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23Python&quot; title=&quot;#Python&quot;&gt;#Python&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23JIT&quot; title=&quot;#JIT&quot;&gt;#JIT&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CPython&quot; title=&quot;#CPython&quot;&gt;#CPython&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Faster_CPython&quot; title=&quot;#Faster_CPython&quot;&gt;#Faster_CPython&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BC%96%E8%AF%91%E5%99%A8&quot; title=&quot;#编译器&quot;&gt;#编译器&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E7%A4%BE%E5%8C%BA&quot; title=&quot;#开源社区&quot;&gt;#开源社区&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;Python 3.15的JIT编译器开发取得突破性进展，在失去主要赞助商后通过社区协作成功实现性能目标。目前macOS AArch64平台比解释器快11-12%，Linux x86_64快5-6%，提前完成预定目标。文章强调了团队建设、任务分解和幸运的技术决策（如追踪记录解释器和引用计数消除）对项目成功的关键作用。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;- **性能目标提前达成**：Python 3.15的JIT在macOS AArch64上比尾调用解释器快11-12%，在Linux x86_64上比标准解释器快5-6%，提前一年多完成目标&lt;br /&gt;- **从困境中重生**：Faster CPython团队2025年失去主要赞助商后，通过社区托管模式维持开发，作者曾怀疑JIT项目能否成功&lt;br /&gt;- **降低&quot;巴士因子&quot;风险**：团队计划在JIT的前端（区域选择器）、中端（优化器）、后端（代码生成器）各配备2名活跃维护者，目前中端已有4名贡献者&lt;br /&gt;- **任务分解吸引新人**：将复杂优化问题拆分为简单任务（如&quot;优化单条指令&quot;），提供详细可操作的指导，让无JIT经验的C程序员也能参与，共11人参与核心重构&lt;br /&gt;- **关键技术决策**：Brandt建议改用追踪式前端，Mark建议双分派表机制，意外地将追踪解释器性能从慢6%提升到快1.x%，并将JIT代码覆盖率提升50%&lt;br /&gt;- **引用计数消除优化**：消除每条Python指令的分支操作，这一优化易于并行化且适合教学，是3.15版本的主要优化方向&lt;br /&gt;- **基础设施支撑**：Savannah Ostrowski一人搭建了等效于整个基础设施团队的CI系统，每日性能测试帮助快速发现回归问题&lt;br /&gt;&lt;br /&gt;文章URL：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://fidget-spinner.github.io/posts/jit-on-track.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://fidget-spinner.github.io/posts/jit-on-track.html&quot;&gt;https://fidget-spinner.github.io/posts/jit-on-track.html&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://fidget-spinner.github.io/posts/jit-on-track.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Ken Jin’s Blog&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;Python 3.15’s JIT is now back on track&lt;/div&gt;
  
&lt;/a&gt;</content:encoded></item></channel></rss>