Max Bernstein Blog

RSS: https://bernsteinbear.com/feed.xml
Max Bernstein 的博客。

Another partial SSI trick with canonicalize

After reading Chris Fallin’s aegraph post, new ZJIT contributor dak2 landed a block-local version of the canonicalize function in #16828. The pseudocode of the block-local canonicalize function looks ...
评论点赞收藏2 天前

零知识证明的极简实现:30行代码讲清图3染色协议

用30行Python代码实现图3染色的零知识证明交互协议,不依赖加密货币。证明方通过哈希加随机盐锁定颜色,验证方随机选边要求打开,重复m²轮使作弊概率趋近于零。作者与Chris合作部署了可交互的网络演示,并扩展到数独等NP完全问题。
评论点赞收藏8 天前

ZJIT 的内联器带来显著收益

ZJIT 的 inliner 功能已启用,显著优化了 Ruby 程序中 block 的执行效率。文章通过 YARV 字节码分析展示了 inliner 如何减少 invokeblock 调用开销,并给出具体性能提升数据。适合对 Ruby 虚拟机和 JIT 编译感兴趣的开发者阅读。
评论点赞收藏19 天前

PLDI 2026 参会手记:从 e-graph 教程到编译器优化的实战交流

作者记录了参加 PLDI 2026 的经历,重点在于技术社交与动手实践。文中提到在研讨会现场促成“自建 e-graph”教程,并与多位研究者深入探讨编译器优化、线性扫描寄存器分配及 Datalog 实现。作者还分享了在 Ruby 中实现 Knuth-Bendix 补全时的具体踩坑细节。内容充满一线程序员的真实互动和技术探索过程,对关注编译器原理和学术社区互动的开发者有参考价值。
评论点赞收藏42 天前

内联启发式方法综述

Compilers, especially method just-in-time compilers, operate on one function at a time. It is a natural code unit size, especially for a dynamic language JIT: at a given point in time, what more infor...
评论点赞收藏71 天前

Checking Assembly with Z3

Short post today. New ZJIT contributor dak2 submitted a PR to fix an overflow bug in fixnum division in ZJIT. We did the division fine, but lied about the type of the result in the case of dividing FI...
评论点赞收藏74 天前

旅行笔记:RubyKaigi函馆之旅

I just got back from a three and a half week trip to Japan. It was the longest trip I have ever been on (aside from studying abroad in Germany, which felt different). I made the following wild circuit...
评论点赞收藏90 天前

值编号:用于消除公共子表达式的编译器优化技术

欢迎重返编译器的世界。今天,我们将探讨“值编号”这一概念——它与 SSA 有些相似,但又有所不同。 静态单赋值(SSA)为变量赋予了名称:每个表达式都有一个唯一的名称,而每一个名称都对应着且仅对应一个表达式。通过这种转换,我们可以将如下程序: 其中变量 x 在程序代码中被多次赋值,转化为如下形式: 其中对 x 的每一次赋值,都被替换为对一个全新的、全新的名字的赋值。 这种方法非常出色,因为...
评论点赞收藏134 天前

为玩具优化器编写的模糊测试器

Another entry in the Toy Optimizer series. It’s hard to get compiler optimizers right. Even if you build up a painstaking test suite by hand, you will likely miss corner cases, especially corner case...
评论点赞收藏172 天前

基于类型的别名分析在玩具优化器中的应用

在玩具优化器系列 中,又一项新成果。 上一次,我们是在玩具优化器的背景下实现了“加载-存储转发”机制。我们成功地在编译时对从堆中读取和向堆中写入的结果进行了缓存! 我们特别注意对象别名问题:根据读取/写入所引用的偏移量,我们将堆信息划分为不同的别名类。 这样一来,即使我们不知道对象 a 和 b 是否存在别名关系,至少也能确定不同偏移量永远不会发生别名(前提是我们的对象不会重叠, 且内存访问发生...
评论点赞收藏181 天前

多入口CFG设计难题

Background and bytecode design The ZJIT compiler compiles Ruby bytecode (YARV) to machine code. It starts by transforming the stack machine bytecode into a high-level graph-based intermediate represe...
评论点赞收藏206 天前

GDB JIT接口:调试JIT编译代码

本文详细介绍了如何在GDB中调试JIT编译代码的两种接口:旧方法需要生成ELF/Mach-O等可执行文件并嵌入DWARF调试信息,而新方法允许自定义二进制格式。文章还分析了实现难点,如GC稳定性、符号表维护以及性能问题(O(n²)复杂度),并讨论了与Linux perf map接口的潜在整合方案。内容技术性强,对开发者有实用价值。
评论点赞收藏211 天前

如何为perf/samply标注JIT代码

本文介绍了如何在YJIT/ZJIT和samply中使用perf映射接口来标注JIT代码,适用于Linux和macOS。作者提供了一个具体的实现示例,并解释了如何生成函数映射文件以便在perf或samply记录中显示JIT帧。文章还指出了当前实现的一个小错误,建议使用{:x}而不是{:#x}来避免输出0x前缀。
评论点赞收藏221 天前

GDB JIT 接口详解:从原理到实践

深入解析GDB的JIT调试接口,对比传统的DWARF对象生成方式与新的自定义调试信息读取器接口。文章梳理了V8、.NET、QEMU等主流运行时对GDB JIT的支持实现,指出了旧接口的O(n^2)性能瓶颈和GC移动问题,并探讨了复用Linux perf map接口的可能性及作者实现的插件。
评论点赞收藏229 天前

ZJIT现已在 Ruby 4.0 中可用

Originally published on Rails At Scale. ZJIT is a new just-in-time (JIT) Ruby compiler built into the reference Ruby implementation, YARV, by the same compiler group that brought you YJIT. We (Aaron ...
评论点赞收藏235 天前

Toy Optimizer中的加载与存储转发

Another entry in the Toy Optimizer series. A long, long time ago (two years!) CF Bolz-Tereick and I made a video about load/store forwarding and an accompanying GitHub Gist about load/store forwardi...
评论点赞收藏235 天前

软件开发工具导论(2024)

这是一门由东北大学开设的软件开发工具入门课程,涵盖命令行、版本控制(Git)、构建系统(Make)和软件正确性(测试与持续集成)四大核心领域。课程内容以模块划分,每模块包含讲座笔记、实践项目和阅读材料,旨在培养学生自主学习和工程化能力。课程强调通过动手实验和代码探索掌握工具使用,避免依赖外部答案,注重学术诚信与独立思考。无考试,仅通过8次作业评分,鼓励学生利用开源资源但禁止抄袭。课程设计参考了MIT、伯克利等名校的类似项目,适合希望提升软件工程实战能力的初学者。
评论点赞收藏242 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。