Compilers

60 篇内容

工程实践Meta Engineering

How We Built TLX: A Hardware-Native GPU Compiler for Production ML at Scale

文章介绍 Meta 为弥合 Triton 的高生产力与 CUDA 底层控制之间的鸿沟而构建的 TLX:它在 Triton 之上引入以 warp group 为一级执行单元的 MIMW 抽象,显式表达生产者/消费者分工、mbarrier 同步、TMA/TMEM 异步内存搬运、cluster 协作和可选布局。TLX 保留 Triton 的 Python 编程与自动调优体验,同时让开发者直接编排现代 GPU 的异步执行结构。文中给出 GEM 推荐模型训练、RecSys 推理 IKBO 和 MoE 分布式 grouped GEMM 三个生产案例,报告 20–25% E2E MFU、最高约 2/3 计算密集延迟下降和 4 倍单 kernel 加速。其适用边界是主要覆盖 NVIDIA Hopper/Blackwell 与 AMD MI300/MI350x,自动生成编排及 torch.compile 后端仍在推进。

推荐收录:文章不仅解释 TLX 的 MIMW 抽象和五类扩展,还用 GEM、IKBO、分布式 grouped GEMM 的生产部署及量化收益证明其工程价值。适合 GPU 编译器、训练/推理性能和 ML 基础设施工程师,尤其关注 Triton 扩展、warp specialization 与 kernel 融合的读者。可迁移的是从真实负载出发、以生产力与性能为乘数、渐进扩展而非重写语言的编译器设计方法;需注意案例依赖 Meta 的 PyTorch/Triton 栈,外部复现证据有限。

工程实践Fzakaria Blog

Making profile-guided optimization reproducible

文章讨论 PGO 在包管理器中因训练运行不确定而难以复现的问题:同一源码经插桩、训练、再编译后,线程调度等因素会让 profile 计数不同,进而生成不同二进制。作者以 Nix 与 Guix 禁用 Python/GCC 的 PGO 构建为背景,提出用确定性虚拟机 Rewind 固定启动时钟、随机种子、线程调度和 CPU 模型,把构建拆成插桩编译、VM 内训练、最终编译三个 derivation,并校验 CPU vendor。文中用一个多线程 C 示例展示 profile 每次变化、不同调度导致 compress 被误判为死代码,最终通过 nix-build --check 验证 profile 和二进制可逐位复现。边界是训练运行需绑定 AMD/Intel vendor、依赖 KVM 与特定 system-features,且训练负载选择仍带艺术性,示例较简单。

推荐收录:文章不是泛泛谈 PGO,而是给出可执行的 Nix derivation,并用 nix-build --check 证明 profile 和最终二进制逐位一致;同时用多线程示例说明训练运行为何不确定、调度如何影响 profile。适合构建系统、包管理、编译器优化和可复现基础设施的读者,可迁移的要点是把非确定性训练隔离到可控 VM 中,并将 vendor、seed、schedule 等作为 derivation 输入。主要风险是方案绑定 CPU vendor 和 KVM,示例规模有限,真实程序的训练负载选择仍需额外判断。

技术文章Daniel Lemire

In C++, = default and {} are not the same constructor

文章解释 C++ 中 `span() = default` 与 `span() {}` 并非等价:前者在首次声明时使类型保持 trivial,而后者是用户提供的构造函数。作者用包含指针、长度和尾指针的 span 结构展示,`= default` 配合 `{}` 值初始化会零初始化整个对象(含填充字节),`{}` 版本则不会。在循环构造 `box` 的微基准中,GCC 15/16 为 `= default` 版本生成临时对象和额外拷贝,导致约 1.73 ns/span 对 7.75–8.04 ns/span,慢四倍以上;GCC 14 和 clang 21 无明显差异。结论适用于关注 C++ 对象初始化语义和性能的代码,但属于特定编译器版本和微基准结果,需在目标工具链上验证。

推荐收录,因为文章用可复现的汇编差异和实测数据说明了 C++ triviality 与值初始化的隐蔽性能影响,GCC 15/16 下 `= default` 版本约慢四倍。适合 C++ 库作者、性能敏感后端开发者和编译器优化读者,其中对象初始化语义、基准方法和工具链差异分析可迁移到实际代码审查与性能验证中;主要风险是结论依赖编译器版本和微基准场景,不能无条件外推。

技术文章Daniel Lemire

Beating the compiler at signed 32-bit division

文章讨论 64 位处理器上有符号 32 位整数除法的优化。编译器对常量除数通常用乘法加移位,但当最优乘数需要 33 位时,会插入加回 x 的修正步骤;作者利用被除数绝对值不超过 2^31,把乘数当成 32 位无符号数并与有符号 32 位被除数做 64 位乘法,从而直接得到商,并给出乘数 c=ceil(2^s/d) 的选取依据和模板实现。实测在 Emerald Rapids 与 Apple M4 上,对 7、60、365 等需要修正的除数可缩短关键路径约 2 个周期,clang 吞吐提升超过 20%,但对 1000 这类无需修正的除数没有收益,M4 上甚至略慢。文章还把思路推广到运行时除数,用 mul128_s64_hi 的无分支实现更新 fastmod 0.2.0,避免随机符号导致的分支误预测。适用边界是正且非 2 的幂的常量除数或运行时除数库,性能收益依赖微架构与编译器。

推荐收录,因为文章不仅给出可复现的模板代码和数学条件,还用 GCC/clang 在 Emerald Rapids、M4 上的延迟与吞吐数据验证收益及无收益场景。适合编译器代码生成、底层性能优化和整数算法库的读者,其利用 64 位乘法空闲位消除修正步骤的思路可迁移到其他常量运算优化。

工程实践知乎 - SmartCode 得物技术

国产算力·昇腾 910C 大模型推理优化(下):源码修改与算子优化,提速30%|得物技术

文章复盘昇腾910C上vllm-ascend的大模型推理优化,针对Qwen3.5-35B-A3B从参数调优深入到源码、算子与MTP投机解码。核心改造包括MoE共享专家多流重叠、decode host开销裁剪、block table CPU快路径、GDN算子融合,以及贪婪采样掩码缓存和词表并行argmax。算子层使用FUSED_MC2、SuperKernel和910C专用matmul_allreduce_add_rmsnorm融合算子,并修复静态kernel编译。结果显示c=1 TPOT降至5.0ms、真实业务数据较基线下降64.8%,但收益受batch、模型结构和数据接受率影响,高并发调度与版本迁移仍是边界。

推荐收录:文章给出从profiling定位、源码补丁、AscendC算子改造到A/B压测的完整链路,并附c=1/c=4/c=8及真实业务数据集的量化收益。适合做大模型推理、国产算力适配和vLLM二次开发的工程师参考,其减少host开销、融合通信与计算、按捕获尺寸调cudagraph等方法可迁移;但需注意其强依赖910C/特定版本与模型结构,高并发和通用性仍有限。

技术文章NVIDIA Technical Blog

Scaling NVIDIA TensorRT Performance Optimization Beyond a Single Build Route with the Global Performance Tuner, Part 2

文章是 TensorRT 11.1 全局性能调优器系列的第二篇,阐述其算法与架构设计。核心思路是把不同调度策略表示为显式、可搜索的 build route,也就是 200 多个编译器 knob 的具体取值组合,并提供 C++ API,用于设置和查询路由、枚举可调配置空间。trtexec 把正则式路由表达式展开为候选列表,逐个构建并测量,剔除构建崩溃或精度不达标的候选,最终选出最快的合规引擎。文章用 Q/DQ 插入的思想实验说明如何以精度为约束、以性能为排序准则来解耦二者的纠缠。十个负载上相对默认路由取得 1.14x–1.63x 加速,并给出按搜索空间选择 fast/mixed/full、用 --dryRun 预检、借助缓存增量续跑、环境变更后重调优等实践,同时强调最优路由不可跨模型、形状、GPU 与软件栈直接迁移。

推荐收录:文章给出可复用的调优抽象(build route 与 knob 配置空间)、具体 C++ API、trtexec 搜索循环以及精度约束下的候选筛选流程,并有十个负载 1.14x–1.63x 的量化结果支撑,而非泛泛的性能宣传。适合做推理部署、深度学习编译器或 GPU 性能优化的工程师参考;主要风险是结论强绑定具体模型、输入形状、目标 GPU 与 TensorRT 版本,读者需在自身环境重新测量验证。

技术文章NVIDIA Technical Blog

Scaling NVIDIA TensorRT Performance Optimization Beyond a Single Build Route with the Global Performance Tuner, Part 1

文章围绕 TensorRT 11.1 的 Global Performance Tuner,解释深度学习编译器为何不能依赖单一构建路线。作者把编译过程抽象为模型空间、解空间、构建算法和搜索算法,用运行时间函数与准确率约束形式化最优引擎选择,并将编译器 pass 序列建模为可定制 build route。Global Performance Tuner 以准确率感知调优、可定制构建路线和扩大可行解空间为三原则,在满足精度约束的候选中选端到端最快者。文章也指出启发式剪枝、局部 profiling 与端到端执行不一致会导致次优。其边界是 Part 1 侧重概念与数学框架,尚未展开具体算法、架构和实测数据。

推荐收录:文章把 TensorRT 的性能调优从零散启发式提升为可复用的编译调度模型,明确给出 build route、准确率约束和搜索空间的形式化,并讨论了剪枝与局部 profiling 导致次优的边界。适合深度学习编译器、推理优化和 GPU 性能工程师阅读;但 Part 1 偏概念,需结合 Part 2 或文档才能落地。

工程实践Amazon Science

The science behind TorchNeuron, Amazon’s new PyTorch backend for AWS Trainium chips

文章介绍 Amazon 为 AWS Trainium 推出的开源 PyTorch 后端 TorchNeuron,目标是以极少代码改动把 PyTorch 程序映射到 Trainium 执行。其运行时创新包括可选的 adaptive eager 模式:在 CPU 端累积子图并并行编译、缓存和排队执行,以隐藏编译开销;同时用 NEFF 多级缓存和共享编译服务避免多加速器重复编译。评估上,团队用 AI agent 扫描 Hugging Face,按架构特征筛出 841 个代表性模型,并从实际运行中提炼数万种张量形状构建 registry,形成单元测试、代表模型、全量模型的分级回归流程。文章称这些优化可将大模型跨加速器首次训练步时间降低约三分之一,但结果来自 Amazon 自测,且偏产品技术说明,独立复现和第三方验证有限。

推荐收录,因为文章不是单纯发布稿,而是具体说明了 TorchNeuron 的 adaptive eager、NEFF 缓存、共享编译及基于 841 个代表模型和形状 registry 的分级评测方法。这些机制和评测流程对做 AI 编译器、训练/推理后端、性能回归与大模型基础设施的读者有可迁移价值;需注意性能数字为厂商自测,缺少独立复现。

技术文章Microsoft Research Blog

Flint-interactive: A language for creating interactive data visualizations

文章介绍微软研究院的 Flint-interactive,一种用于生成交互式数据可视化的语言。它针对 AI 代理生成交互图表成本高、可靠性差的问题,把交互逻辑抽象为语义事件与更新算子,由 Flint 编译器负责命中测试、布局和渲染等视觉逻辑。作者用联动刷选、表格与图表互操作、DimpVis 等例子展示如何在聊天、应用和自定义 API 中使用。其核心是分离视觉逻辑与交互逻辑,并让事件和更新可组合,从而连接图表、文本、表格与外部状态。文章偏系统概览,未给出量化评估和实现细节,适合了解方法框架而非复现。

推荐收录为技术概览:文章明确给出 Flint-interactive 的问题定义、语义事件与更新算子机制,以及编译器承担视觉依赖解析的分工,并用联动刷选、表格与图表互操作等例子说明可迁移的交互抽象。适合关注 AI 生成可视化、HCI 和可视化语言设计的读者;主要不足是缺少量化实验与实现边界,不能替代论文级复现材料。

技术文章Max Bernstein

Objects, attributes, maps, oh my!

文章从动态语言把对象属性简单建模为哈希表入手,分析其哈希开销、间接寻址和缓存不友好问题,引出 maps/shapes/hidden classes 的对象布局机制。作者基于 CF Bolz-Tereick 的简化对象模型,用 Python 实现 Map 树、对象 storage 和 InlineCache,说明如何用 map 指针比较加偏移量缓存避免快速路径上的字符串查找。文章还讨论 shape 与 class 解耦、属性添加顺序和数量对多态缓存的影响,并引用存储策略、type freezing 等论文扩展,最后给出 C++ 小原型示意内联属性存储。适合理解动态语言运行时优化,但实现是教学草图,未覆盖完整类/方法语义、并发和真实 JIT 细节。

推荐收录:文章不仅解释 shape/map 和 inline cache 的抽象概念,还给出可运行的 Python 草图、C++ 内存布局原型及论文线索,展示了从哈希表到偏移量缓存的具体机制。适合编译器/运行时开发者和想理解动态语言对象模型性能的读者,可作为实现内联缓存与对象布局的教学参考;但需注意示例为简化原型,不覆盖生产运行时的完整语义与并发细节。

工程实践Max Bernstein

Rails is a JIT compiler

文章从 Rails enum 如何为状态生成谓词方法切入,指出 define_method 配合 public_send 的写法会带来不必要的动态派发,并尝试用 module_eval 生成静态方法、把枚举值直接烧录进方法体。作者记录了在 Rails 测试和真实应用中遇到的边界情况,例如 Etc/GMT+1 这类特殊符号、大写开头符号以及非有限浮点数,并最终改用 ActiveSupport::CodeGenerator 生成代码。微基准显示,改动后 shippable? 在 YJIT/ZJIT 下从约 3.6M/3.8M 提升到 16.3M/18.5M i/s。文章结论是静态常量和直接调用通常优于 public_send 等动态机制,性能问题可优先在上游代码生成层修复,而不必动辄自定义编译器。需要注意的是,这些数字来自微基准,真实收益仍取决于代码生成复杂度、框架兼容性和运行时 JIT 行为。

推荐收录,因为文章给出了真实 Rails PR、可复现的微基准和明确的代码生成改动,展示了从识别 public_send 动态派发到用 module_eval 烧录常量、再到处理特殊枚举名与浮点边界的完整工程路径。对使用 Ruby/Rails、做代码生成或运行时性能优化的读者,文中的静态化思路、基准对比和上游修复策略可直接迁移;但需注意收益主要来自微基准,生产环境还应验证兼容性与 JIT 下的实际表现。

工程实践美团技术团队

SLM 生成式高并发推理引擎:延迟约束下的有效吞吐优化

美团技术团队面向搜索推荐中 SLM 的极低延迟推理,提出以静态 DAG 为执行抽象的专用引擎。文章将 Prefill-Only 与固定 Beam Search 归纳为有界生成负载,以完整业务请求作为调度、测量和容量规划边界,用 CPU 节点处理文本与结果,把模型计算和固定搜索编译进 AOTI 节点。节点内组合 Packed Prefill、请求内 shared-prefix K/V、选择性 FP8、byte trie tokenizer 等优化,并在算子、节点、DAG 和在线服务四层验证正确性与性能。约 0.6B 模型上,Prefill-Only 达约 100 request QPS,Beam Search 达 300/120 request QPS,平均时延低于 20ms,Prefill-Only 有效 MFU 约 67%。作者明确该方案只适合控制流和状态有界、输出较短的负载,动态 decode、长文本等场景仍应使用 vLLM/SGLang。

推荐收录。文章给出完整的有界生成负载定义、静态 DAG 分层编译执行架构,以及 Packed Prefill、shared-prefix K/V、选择性 FP8 等优化的分层 A/B 与端到端数据,并诚实标注了不适用场景。对做搜索推荐在线推理、SLM 部署、GPU 推理性能优化的工程师有高迁移价值,尤其适合判断何时应放弃通用生成引擎路径而针对固定负载重构。

技术文章知乎 - 南山烟雨珠江潮

C++神技之__builtin_frame_address

本文系统讲解 GCC/Clang 内建函数 __builtin_frame_address 的原理与用法。文章从栈指针 SP 与帧指针 FP 的基础讲起,说明 x86-64 与 ARM64 上双字帧记录的统一布局,即 [fp] 存旧 FP、[fp+8] 存返回地址。作者通过可运行工程演示 level=0 探秘当前栈帧、估算栈使用量、观察局部变量的对齐与填充,并用 level=N 配合 __builtin_return_address 沿帧指针链手搓简易 backtrace。文章还深入剖析 level 必须为编译期常量、-fomit-frame-pointer 导致链条断裂、内联与尾调用、返回 NULL、跨架构可移植性等陷阱,并与 backtrace()、_Unwind_Backtrace、std::stacktrace 做方案对比,指出帧指针方案适合采样剖析与受限环境。

推荐收录。文章没有停留在 API 罗列,而是把栈帧布局、帧记录结构、编译选项影响和实测输出串成完整证据链,并逐条给出陷阱与边界,读者可据此理解调用栈的机器层机制。对想深入 C++ 底层、编译器与可观测性的工程师,其栈用量测量、手工 backtrace 与方案取舍方法都有较强迁移价值。

工程实践Fzakaria Blog

Nixpkgs for the frontend impaired

文章介绍 jinx:一个把 Nix 转译成 TypeScript 的工具,并把整个 nixpkgs 编译成 TypeScript 模块。作者认为 Nix 的核心价值不在语言,而在 store 模型与 nixpkgs 二十年积累;转译能让 TypeScript 生态复用这些成果。jinx 保留惰性求值,用 thunk 包装表达式,生成代码可读并带 source map,可在 Node 或浏览器中求值。验证方面,作者对 nixpkgs 在 x86_64-linux、aarch64-linux、aarch64-darwin 三平台与 nix-eval-jobs 对比 231,777 个属性,229,063 个 drvPath 完全一致,2,714 个双方均失败,差异和单边失败均为零。工具支持编辑器 LSP、断点、REPL、node:test 以及用 TypeScript 写包;不足是求值比 Nix 慢约 3-5 倍、内存高约 2-4 倍,且求值不写 /nix/store,更适合探索与教学而非性能敏感生产。

推荐收录:文章给出把 nixpkgs 转译为 TypeScript 的完整工程证据,并以 231,777 个属性跨三平台对比 drvPath,实现零差异,验证扎实。适合研究 Nix store 模型、转译器/运行时可复现性、开发者工具或浏览器求值的读者;其 source map、LSP、基准与跨平台验证方法可迁移到其他语言生态。主要风险是性能与内存开销明显,且工具维护性需结合 AI 参与实现的具体情况自行评估。

技术文章Niko Matsakis

Why 'externalized' proofs of cyclic trait impls does not work

文章探讨 Rust 中循环 trait impl 处理 supertrait 的两种证明策略:模块化证明(impl 自身必须证明 supertrait 成立)与外部证明(调用方需证明 supertrait)。作者先用 Magic: Copy 等例子说明模块化证明的直觉与递归风险,再指出外部证明虽然能让非法 impl 合法但不可用,却与 unsafe trait 的语义冲突:unsafe impl 被信任去证明安全性,同理 impl 也应被信任去证明 supertrait。因此作者结论是必须采用模块化证明,并需引入防止证明递归依赖 impl 自身的规则;文章属于系列讨论,尚未给出完整终止性方案。

推荐收录:文章用清晰的推理规则和函数契约类比,论证了外部证明方案与 unsafe trait 语义的不兼容,并明确得出模块化证明是唯一可行路径。适合 Rust 编译器开发者、编程语言研究者及类型系统爱好者阅读,有助于理解 trait 系统的证明义务、unsafe 语义及循环 impl 设计权衡。局限是方案尚未落地,终止性规则留待后续。

技术文章Go Blog

Arch-specific SIMD in Go

本文介绍 Go 1.27 通过 GOEXPERIMENT=simd 在 amd64、arm64 和 wasm 上提供的 simd/archsimd 架构相关 SIMD API。核心设计包括用 Float32x4、Int32x8 等类型表达向量形状与元素类型,统一语义相同操作的方法名,并用 Mask、Grouped 等区分架构边界行为;掩码操作和 ToBits/Reshape 等零成本转换可由编译器融合为硬件指令。文中给出 GFNI 位反转、AVX2 8x8 转置等示例,并解释 CPU 特性检查、循环边界写法、避免大复合类型以保证寄存器分配和消除边界检查。适用边界是仅覆盖固定宽度向量,SVE/SVE2 与矩阵扩展尚未完成,且须启用实验开关。

推荐收录,因为这是 Go 官方对 archsimd API 设计、跨架构语义差异、编译器 lowering 与优化实践的系统说明,并附可运行示例和未来路线。适合用 Go 做高性能计算、编解码或 Wasm 的工程师,也可供研究语言与编译器 SIMD 支持的读者参考;需注意其 API 仍属实验特性,架构覆盖和寄存器优化仍在演进。

工程实践Amazon Science

A kernel-centric path to real-time video generation on Trainium

文章复盘 Amazon Neuron Science 与 Reactor 在 Trainium 上优化自回归扩散视频模型 Rolling Forcing 的工程实践,目标是实时流式视频生成。团队采用 kernel 中心的自底向上方法,用 NKI 定制 3D-RoPE、KV cache 拷贝和 attention transpose 等热点,并设计序列并行与张量并行的混合分片,解决 12 个 attention heads 与 8 个 Neuron core 不整除及 3D token 切分问题。优化后 3D-RoPE 从 5 秒降至 1.8 毫秒、每层 cache 拷贝从 23 毫秒降至 1.9 毫秒、VAE 解码器加速 8.25 倍,首次端到端运行即生成正确视频。文章称这些技术可迁移到其他实时自回归扩散模型,但主要依赖特定硬件和单一模型,缺少完整基准与复现细节。

推荐收录,因为文章不是产品宣传,而是给出 NKI 内核定制、混合 SP/TP 分片和模型结构改造的具体方案,并附 3D-RoPE、cache 拷贝和 VAE 解码器的量化收益。对从事生成式 AI 推理、视频生成、AI 加速器或性能优化的读者,这些方法可迁移到长序列实时推理场景;风险是结论主要基于 Trainium 与 Rolling Forcing,缺少跨硬件/模型对比和完整复现细节。

技术文章Go Blog

Platform-independent SIMD in Go

文章介绍 Go 1.26/1.27 的实验性 SIMD 支持:archsimd 提供架构相关 API,新的 simd 包则提供平台和向量长度无关的可移植接口。面对各架构在向量长度、掩码和指令集合上的差异,simd 只暴露操作交集,并用 archsimd 指令或标量代码补齐缺失操作,同时支持 ToArch/FromArch 回退到平台专用实现。文中列出 Load/Store、算术、比较、掩码、转换、移位和 reshape 等 API,并以 OnesCount 为例展示 amd64、NEON、wasm 和纯模拟的跨平台实现,说明编译器会按 SIMD 宽度特化并消除类型分支。GODEBUG=simd=0/128/256/512 可强制模拟或指定向量宽度,便于测试不同硬件能力。当前 API 仍属实验性,ReduceSum 等操作尚未提供,方法集合因跨平台约束而较保守,SVE 等支持仍在规划中。

推荐收录。文章来自 Go 官方博客,给出完整 API 表、跨平台实现示例、GODEBUG 测试开关及编译器特化细节,证据充分,不是概念介绍。适合 Go 语言、编译器、性能优化和底层系统开发者阅读,可迁移到可移植 SIMD API 设计、跨架构模拟与性能验证。风险是 API 仍为实验性,部分操作缺失且 GODEBUG 行为可能随版本变化。

工程实践Null Program

What's been going on in w64devkit the past year

本文盘点 w64devkit 过去一年的演进,覆盖发布安全、工具链、新工具与运行时。发布侧引入代码签名、GitHub Actions 自动构建和不可篡改发布,签名工具 aas-sign 被 MSYS2 采用;x64 版本改为 multilib,可用 -m32 或 i686-w64-mingw32 前缀工具编译 32 位程序。工具链侧,Binutils 现在按需自动升级到 bigobj COFF,缓解 C++ 大工程链接失败并恢复 cgo,静态运行时从 -Os 改为 -O2。新增 CMake/Ninja、Ccache、quilt、NSIS、zstd、widl 等工具,并重写 C11 threads 实现(基于 SRW 锁,需 Windows 7+,不含递归锁)。未来计划分发 FatLTO 运行时并重新启用 LTO,但作者对 Fortran 运行时错误仍缺乏信心,上游拒收相关补丁。

推荐收录:文章不是简单的新版本通告,而是给出了发布签名与不可篡改发布的具体做法、Binutils bigobj 自动升级的原因与取舍、从 -Os 转向 -O2 的依据,以及 C11 threads 实现中对标准缺陷的批评。对维护 Windows 交叉工具链、构建分发或发布安全的开发者有直接参考价值,其中 LTO 缺陷修复与 FatLTO 设想也可迁移到其他编译器分发场景。

工程实践NVIDIA Technical Blog

Translating CUDA Tile Operations from Python to Rust Using Agentic AI

文章介绍 NVIDIA 用 Agentic AI 将 CUDA Tile 算子从 Python 翻译到 Rust 的工程实践。cuTile Python、Triton-TileIR 与 cuTile Rust 共享同一 CUDA Tile IR,因此移植不是重新优化,而是用更安全的主机语言重写同一 tile 程序,并可通过比对参考内核与生成内核的 Tile IR 做结构性验证。作者构建了一个有界多智能体流水线,覆盖分析、设备内核、主机与 FFI 代码、正确性和性能校验,每个阶段都以可机器检查的判决收尾,并配有 IR diff 分析与残余性能归因两个专职诊断子代理。团队据此移植了全部 24 个 TileGym 公开算子(约 40 个内核),在 DGX B200 上达到 cuTile Python 平均 99.5% 的性能,约三分之一算子反超。文章也指出 Rust 需显式声明特化、C ABI 之后无安全网、部分内核仍依赖非安全 API 等边界。

推荐收录。它以真实算子库为对象,给出了多智能体流水线的编排契约、判定路由、IR diff 验证与实测性能数据,并给出 softmax 的 Python/Rust 逐行对照和 C ABI 集成细节。适合做 GPU 内核、编译器前端或 AI 工程化落地的读者参考其可验证的翻译与代理编排方法,风险在于其结论依赖共享 Tile IR 与 Blackwell 工具链,迁移到其他体系需重新验证。

技术文章Go Blog

Size-Specialized Memory Allocation

文章介绍 Go 1.27 引入的按大小特化的内存分配,针对小于 80 字节的堆分配生成专用 mallocgc 变体。作者解释 span class 如何编码尺寸等级与是否含指针,并据此为 tiny 及各非 tiny span class 生成函数;编译器已知大小时可直接调用,否则由 mallocgc 动态分派并回退通用路径。优化包括常量大小下直接清零、免去 span class 计算、手工内联和慢路径拆分,同时需权衡代码体积与指令缓存占用。基准显示小对象分配快 20-30%,分配密集程序最多快 1%,16/24 字节收益最大;收益随尺寸增大而减小,并受 GC 活跃等边界影响,可用 GOEXPERIMENT=nosizespecializedmalloc 关闭。

推荐收录:这是 Go 官方博客对运行时与编译器协同优化的完整实现说明,包含基准数据、指令缓存权衡,以及用生成器避免特化代码漂移的做法。适合 Go 开发者、运行时/编译器工程师和性能优化读者,可迁移到其他语言运行时的分配器特化与代码体积取舍。注意结论版本特定,关闭开关应仅作为问题排查手段。

工程实践Trail of Bits Blog

A “proof” of Fermat’s Last Theorem that fits the margin

Trail of Bits 披露了 Lean 4.33.1 及之前版本中的一项严重 bug,可通过制造矛盾来让 Lean 认可 Fermat 大定理的“证明”。根因是 `String.Pos.Raw.extract` 在极大位置上的逻辑定义与原生求值不一致:前者返回空串,后者返回整个原始字符串。这种不一致可推出空串等于非空串,一旦得到矛盾,任意命题都可被证明。文章认为这不是内核 soundness 问题,而是 `native_decide` 引入了编译器这一额外信任边界,并建议验证外部证明时使用 `#print axioms`。Lean 团队快速修复了内存问题并最终解决语义不匹配,展示了对证明工具可信性的持续加固。

推荐收录。本文以真实漏洞为例,清晰揭示了形式化证明工具中逻辑求值与原生求值不一致造成的信任边界问题,填补了普通资料对 `native_decide` 风险的讨论不足。适合使用 Lean 做证明、依赖机器检查结果的研究者与安全工程师;文中发现问题的思路及验证证明的正确方法具有很强的可迁移性与警示价值。

技术文章LWN.net

[$] Stabilizing Rust's never type

文章介绍了 Rust 语言中 "never" 类型(以感叹号 ! 表示)的稳定化过程。该类型用于标记永不返回的函数以及其他永远不可能产生值的场景,长期以来它只是编译器内部功能,属于不稳定特性。直到 2024 年 8 月 24 日,Rust 编译器贡献者 "waffle" 经过两年多的工作终于将其稳定化。过程耗时较长,部分原因是该特性涉及对旧版本 Rust 的一个小的破坏性变更,编译器维护者需要确认这不会对大量实际代码造成影响。文章还涉及类型强制转换、编译器演进、版本兼容性处理等细节,有助于理解 Rust 类型系统的演进路径和语言特性稳定化背后的工程权衡。

推荐收录,这是一篇来自 LWN 的权威技术报道,直接解释了 Rust never 类型的设计意图与稳定化过程中遇到的版本兼容性挑战。适合作 Rust 开发者、编程语言设计者和编译器爱好者阅读,其中关于破坏性变更评估和跨版本兼容的经验也可迁移到其他系统的长期演进中。

工程实践Xe Iaso

It took a year to ship WebAssembly in Anubis

文章讲述作者花一年把 WebAssembly 工作量证明引入 Go 反爬服务 Anubis 的完整工程经过。原实现需在 JavaScript 与 Go 间维护两份代码,且难度按前导半字节计数、最坏情况加一级会放大千倍;新方案用 Rust no_std 生成 wasm32-unknown-unknown 二进制,由浏览器和服务器执行同一份产物,并使用 argon2id 内存硬算法改善手机端体验。文中详述了无法使用 WebAssembly Component Model 时如何手工设计三缓冲 ABI、为兼容 Chrome 75 做 SIMD 拆分与 wasm-opt 特性裁剪,以及如何用 wasm2js 兜底禁用 WebAssembly 的浏览器。工程陷阱包括首次遇到的 LLVM 编译器 bug、rust-std 预编译导致旧浏览器崩溃,作者用提交构建工具与 chromesweep 旧浏览器测试应对。功能计划在 v1.28.0 默认关闭,v1.29.0 根据反馈再决定是否打开,并保留了若干已知边界。

推荐收录。文章是真实项目的一手长程复盘,明确写出了共享二进制方案、手工 ABI 限制、旧浏览器兼容成本和编译器工具链意外,并保留已知问题而不是包装成完美故事。适合研究 WebAssembly 模块化、反爬 PoW 或 Go/Rust 混合构建的工程师,其可复现构建、特性裁剪和多版本浏览器测试思路可直接迁移到同类项目。

科研议题Max Bernstein

Support Local Variables

这篇博客由 CRuby 编译器团队成员撰写,围绕新论文《Support Local Variables》介绍了 ZJIT 编译器如何处理 Ruby 局部变量的复杂语义。ZJIT 是继 YJIT 之后的新方法级 JIT,基于 SSA 的高层中间表示,并带多个全局/局部优化 pass。与其他 Ruby 编译器的处理方式不同,ZJIT 直接将局部变量提升为 SSA 值,而不是继续使用内存读写或依靠部分求值恢复 SSA。文章指出 Ruby 局部变量的动态语义在正确性和优化上都有不少陷阱,并总结了作者在 ZJIT 中的解法;该论文也是首篇正式记录 ZJIT 的学术文献,发表在 VMIL 2026。博文本身是论文的摘要与背景介绍,完整的实现细节仍需查阅引用的 PDF。

这是来自 CRuby/YJIT 团队的一手技术分享,明确给出了 ZJIT 的定位、SSA 表示和局部变量优化的设计选择,并有论文和学术发表作为支撑。适合编译器实现者、语言设计者和虚拟机研究者阅读,可借此理解动态语言局部变量在 SSA 化时的语义难点,以及一种不同于内存标量替换的方法。由于博文篇幅有限,实际优化细节和边界在 PDF 中,阅读时应以论文为主,避免仅凭摘要下结论。

技术文章matklad

Rust Glancer

文章由rust-analyzer作者撰写,围绕低内存Rust LSP服务Rust Glancer展开,深入反思了rust-analyzer的架构设计。作者认为rowan语法树适合增量编辑,但大多数依赖包只需浅层分析,主张AST应基于数组存储,并对函数体分析采用惰性策略。文中对比IntelliJ的PSI多后端(语法树、stub树、class反编译)与rustc的.rmeta文件,提出类似的分层架构:用户编辑的文件用增量AST,依赖包用紧凑的元数据。还讨论了proc macro展开成本高,可借用Sorbet的shim思路规避,以及LSP数据同步的固有缺陷。最后点明rust-analyzer核心抽象API未完成的问题。这是对IDE工具链架构的深度思考。

推荐收录:作者是rust-analyzer核心开发者,文章直接给出IDE架构的关键权衡,如AST存储、惰性分析、依赖元数据复用,以及对IntelliJ/rustc机制的迁移分析。适合编译器/IDE开发者、编程语言工具链研究者阅读,其“分层源码表示”思路可迁移到其他语言工具。风险是部分观点属个人倾向,需结合工程验证。

工程实践DuckDB Engineering Blog

DuckDB v2.0: Your Database Deserves a Better Parser

本文是 DuckDB 工程团队关于 v2.0 用 PEG 解析器替换 PostgreSQL 派生解析器的深度技术说明。文章先阐明解析器在查询流水线中的角色,并区分了 DuckSQL 方言与解析器实现本身。接着指出旧的 YACC/Bison LALR(1) 解析器在扩展语法时容易引入 shift/reduce 冲突,而 PEG 通过有序选择避免了这类冲突。工程化过程中,作者重点解决了回溯导致的指数级重复工作,借助 packrat 记忆化使得恶意输入(如大量未闭合括号)的解析时间从指数级降为近乎常数,并给出实测数据。文章还演示了运行时扩展语法的方法:扩展可注册自定义规则并复用 DuckDB 既有语法与转换函数,以 Google pipe query syntax 为例展示了从语法到 AST 的完整过程。最后说明扩展 API 仍是预览,若发现现有查询行为不一致可提交 issue。该文对数据库解析器设计、语法扩展机制和解析性能优化具有长期参考价值。

本文基于真实工程改造,给出了从动机、原型到生产化的完整路径,包含 packrat 记忆化解决指数级回溯的性能对比数据,以及通过扩展点复用现有语法和转换函数的具体 API 示例。适合数据库内核、编译前端或开发者工具方向的工程师阅读。文中的运行时语法扩展思路与回溯性能治理方法可以迁移到其他解析器或语言实现;需注意扩展 API 仍为预览,兼容性验证细节未完全展开。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 1. SELECT, INSERT, CREATE and a REPL

本篇文章是“用 Go 从零写 SQL 数据库”系列的第一篇,目标是实现支持基本的 CREATE、INSERT、SELECT 命令和交互式 REPL 的最小数据库。作者从词法分析入手,设计 lexer 将输入转换为 token,依据 PostgreSQL 规则处理数字、字符串和标识符,并用 longestMatch 解决关键词前缀冲突;然后定义 AST 模型与递归下降解析器,分别解析三种语句。最后实现内存后端,用 map 存储表,以二进制表示 INT、字节串表示 TEXT,完成建表、插入和查询功能。文章给出完整代码与运行示例,并附测试,边界明确:仅支持单表基础操作,无持久化、事务和复杂表达式,适合初学者理解数据库与解析原理。

推荐收录,因为文章以可运行的 Go 代码完整展示了一个最小 SQL 数据库的词法分析、语法分析和内存执行流程,技术细节具体、步骤清晰,并配有测试样例与后续系列链接。适合想了解数据库内部机制、解析器实现或 Go 语言实践的中级读者,文中的 lexer/parser 组织方式和内存存储结构可直接迁移到其他小型解释器或教学项目。

技术文章Phil Eaton - databases

Writing a SQL database from scratch in Go: 2. binary expressions and WHERE filters

本文是《Writing a SQL database from scratch in Go》系列第二篇,在首篇基础上为 gosql 增加二进制表达式与 WHERE 过滤。作者扩展 AST 加入 binaryExpression,采用 Pratt parsing 处理运算符优先级和括号;重构内存后端,让每个表达式针对表行求值。求值器支持标识符、数字/字符串/布尔字面量以及算术、比较、逻辑等运算符,并明确不进行隐式类型转换。SELECT 语句新增 WHERE 条件逐行过滤,投影列可通过表达式计算,文中给出 REPL 交互示例。该实现目前只支持单表、简单运算符,并依赖内存存储,是教学性质的 SQL 引擎骨架,尚未涉及索引、连接等真实数据库特性。

推荐收录,因为文章完整展示了在 Go 中实现 SQL 解析与求值的过程,包含 Pratt 解析器、AST 设计、表达式求值和内存表数据流,且代码与解释同步。适合对数据库内核、编译原理或解释器实现感兴趣的读者,可作为手写 SQL 引擎的参考起点。其可迁移价值在于解析器优先级处理和行上下文求值框架可复用于其他小型语言或查询引擎,但需注意示例省略了类型强制转换、优化和持久化等生产特性。

技术文章Phil Eaton - databases

Extending gosql to supporting LIMIT and OFFSET

本文记录作者在 Go 实现的 SQL 数据库 gosql 中添加 LIMIT 和 OFFSET 支持的过程。作者首先更新词法分析器以识别两个新关键字,然后扩展 AST 结构并调整生成代码的辅助函数,使打印结果包含 LIMIT 和 OFFSET。接着,解析器在 SELECT 语句中识别这些子句并解析其后的表达式,同时将 LIMIT 和 OFFSET 作为 WHERE 表达式的边界分隔符。运行时内存后端会先计算 limit 和 offset 数值,然后在逐行过滤中跳过 offset 之前的行,并在超出 limit+offset 范围后停止。文章特别指出,LIMIT/OFFSET 仍需要扫描至少 offset 数量的行,不适合大数据集分页,应优先考虑基于索引的分页。该实现仅针对内存存储,未涉及其他后端或优化策略。

推荐收录,本文不是零散片段,而是完整展示了为 SQL 引擎添加 LIMIT/OFFSET 语法所需的词法、语法分析和运行时三个层次改动,并附有代码 diff 与运行验证。适合对数据库实现、编译前端或 Go 语言工程感兴趣的读者,其修改顺序和边界意识可迁移到类似扩展场景。风险是实现针对特定内存后端,未深入讨论一般化架构,但作为参考案例足够。

工程实践Max Bernstein

Another partial SSI trick with canonicalize

本文介绍了一种在编译器中间表示(IR)中实现 canonicalize 传递的方法,用于通过类型保护重写合并冗余的 GuardType 指令。作者首先描述了一个块局部的版本,该版本在每个基本块内重映射操作数,使后续的常量折叠能消除多余的检查。随后,作者基于支配树实现了全局版本,通过在支配树中沿支配者向下级联重写来扩大优化范围,并讨论了慢速但易于验证的实现策略。文章进一步扩展该传递,当块是条件分支的目标时,在 rewrite_map 中预先填入条件变量的真假常量,使分支体得以了解其条件值,从而简化 30k_ifelse 等基准中的分支链。作者还提到该传递可能需要常量驻留来保证幂等性,并说明了其依赖 SSA 最小化传递的效果。文章以具体代码和 PR 为证据,展示了编译器优化开发中的工程取舍与实证验证。

推荐收录,因为文章详细记录了一个现实编译器中的优化实现过程,既有算法伪代码,又有对支配树、SSA 形式、常量驻留等底层概念的透彻解释。编译器开发者或编程语言研究者可以从中学习如何设计传递以利用支配关系传播类型信息,以及如何在正确性和性能之间做工程取舍。文中所探讨的块局部与全局重写级联技术,以及条件分支信息播种方法,均具有较强的可迁移性。

技术文章Niko Matsakis

Cylic trait implementations: motivation

文章由 Rust 语言核心设计者 Niko Matsakis 撰写,介绍 Rust trait 系统中长期存在的循环 trait 实现问题。作者从动机出发,区分了“内部证明”与“外部证明”两种概念,并通过贴近真实 Rust 的例子说明循环 trait 如何影响语言的一致性与表达能力。作为系列博文的开篇,它旨在为后续深入的技术探索和可能的 RFC 设计铺路,重在建立问题背景和抽象模型,而不是给出实现方案。

收录推荐。作者是 Rust 语言设计的权威,对循环 trait 的解析具有长久参考价值,尤其适合语言设计者、编译器开发者以及希望理解 trait 系统深层次约束的 Rust 用户。文中提出的“内部/外部证明”视角为思考类型系统中的循环依赖提供了可迁移的思维框架,有助于理解类似语言特性的设计取舍。

技术文章Daniel Lemire

Profile-guided optimization in Go

文章介绍了 Go 语言的 Profile-guided optimization (PGO) 原理与使用方法。作者解释了编译器在缺乏运行时信息时依赖启发式做优化决策,而 PGO 通过收集 CPU profile 让编译器了解热路径,从而更激进地内联热函数和去虚拟化接口调用。文中通过三个 JSON 文档的解析基准测试,展示了 PGO 可带来 2–4% 的吞吐量提升,但效果因训练数据与工作负载匹配程度而异,甚至可能出现略微性能回退。作者指出 Go 的 PGO 优化幅度有限但成本近乎为零,适合在发行版构建中默认启用。整体内容提供了可操作的实践指南和定量参考,但仅覆盖单个简单解析场景,未涉及更复杂的工作负载或 profile 采样策略。

本文以清晰的步骤和实际数据展示了 Go PGO 的用法与效果,避免了纯理论描述,为需要优化 Go 程序性能的开发者提供了可直接尝试的方法和预期参考。实验规模虽小,但结论谨慎,强调了 workload 匹配的重要性,可迁移到其他 Go 项目的构建流水线中。适合关注编译器优化、性能工程和 Go 工具链的读者。

技术文章MaskRay

Estimating branch probabilities

文章深入解析LLVM分支概率信息(BranchProbabilityInfo)在没有PGO(Profile-Guided Optimization)资料时的静态估计机制。作者首先梳理了LLVM估算分支概率的多级回退流程,重点剖析了calcEstimatedHeuristics算法,该算法利用不可达、noreturn、cold等区块的种子权重,通过支配树和后支配树反向传播,并结合循环结构对出口边进行缩放,从而为多后继终结指令分配概率。文中给出了独立的C++实现,并详细讨论了权重标度、边分类、循环嵌套森林的作用,以及不可归约循环对概率计算的影响。此外,还指出了与LLVM源码bit-per-bit匹配所需注意的实现细节,如种子顺序和工作列表顺序。该方法展示了静态分析中如何仅凭控制流图和循环结构生成合理分支猜测,对理解编译器优化有重要参考价值。

本文为编译器开发者、程序分析研究人员或对底层代码优化感兴趣的人员提供了LLVM分支概率静态估计的深入技术剖析,不仅解释了算法原理、设计取舍和工程考量,还附带可复现代码和对比案例。其详细程度足以帮助读者迁移到其他编译系统或静态分析工具的开发中,适合作为长期技术参考资料收录。

科研思考Stanford Hazy Research

Retire the Abstractions

文章深入探讨了AI代理(agents)对传统软件抽象层的冲击。作者以自身经历对比:去年编写megakernel需要构建C++抽象层来管理复杂度,今年借助代理可直接从模糊提示生成目标优化代码,消解了对抽象层的依赖。由此提出CUDA DSL等抽象层正走向退休的观点,认为当智能执行器能填补意图中的缺口时,精密但脆弱的代码库可能不再是唯一的知识载体。同时指出抽象层不仅是认知卸载工具,也是共享接口和测试复用的基础,消除后会带来验证挑战。文章最终强调,虽然抽象可能过时,但领域知识、不变量和测试等核心思想将保留,知识传递的方式则从代码转向提示和神谕。全文适用于对AI辅助编程、编译器设计和软件演化感兴趣的读者,但结论基于作者深厚的领域经验,对初学者和不明确神谕的领域可能不直接适用。

收录理由:文章提出了一个前沿且深刻的工程哲学命题,将AI代理与编译器抽象、代码库价值等经典概念结合,提供了可迁移的思考框架。适合关注AI如何影响系统软件开发、编程语言设计和工程实践的读者,对重新评估抽象层和代码资产具有启发性。

工程实践Fzakaria Blog

A C++ toolchain from 357 bytes, in Bazel

文章介绍了一个在 Bazel 中从 357 字节的 hex0 种子自举构建的 C++ 工具链。作者受 stage0 和发行版自举过程启发,利用 LLM 协助完成了这一机械但步骤繁多的工程,最终工具链能够无补丁编译 Bazel Central Registry 中的 Abseil 和 GoogleTest,并通过 236 项测试。工具链包含审计报告,利用 Bazel aspect 验证构建图中每个动作仅执行工具链自产的程序,确保了极高的封闭性。当前方案仍需系统提供的 shell,但显著提升了 Bazel 构建的可重现性,适用于对构建可信性、可移植性有要求的 C/C++ 项目。

推荐收录,因为它将一个很有挑战性的自举工具链工程在 Bazel 体系中完整实现,并用实际测试和审计报告证明了可行性。这对于关注构建可重现性、供应链安全以及工具链定制的工程师具有直接的参考价值,文中的自举流程和封闭性验证方法可直接迁移至类似基础设施建设项目。

技术文章LWN.net

[$] Debugging information for inlined functions

文章报道了 Alan Maguire 在 LSFMM+BPF 2026 峰会上关于在内核 BTF 调试信息中支持内联函数的提案。当前 BPF 程序通过 BTF 定位内核函数进行跟踪,但内联函数因无固定地址而无法被追踪。Maguire 建议扩展 BTF 格式以编码内联函数信息,如源代码位置和调用链,从而使跟踪工具能解析并附着探针。该方案需在 BTF 大小、复杂性和调试完整性之间权衡,并依赖编译器生成所需信息。这有助于提升 BPF 可观测性,但可能增加内核二进制体积,并需社区对格式变更达成共识。

推荐收录,因为它介绍了内核社区为解决 BPF 跟踪内联函数难题而提出的 BTF 扩展方案,涵盖了从问题、技术机制到潜在取舍的完整讨论。对从事内核调试、可观测性及 BPF 工具开发的读者,本文提供了关于跟踪信息格式设计及其工程权衡的一手参考,有助于理解内核调试基础设施的演进方向。

技术文章LWN.net

[$] Progress toward compiling Linux with gccrs

文章介绍了gccrs项目在2026年上半年以编译Linux内核为目标所取得的进展。通过针对内核crate进行测试,开发团队在属性处理、名称解析和资源管理等领域发现并修复了多个问题,显著提升了生成正确代码的能力。尽管目前编译器仅能处理简单的独立程序,但项目报告显示未来数月有望快速改善。文章基于项目周报和月报,呈现了编译器前端开发中遇到的具体技术挑战和解决过程。

推荐收录,因为它详细记录了将Rust前端集成到GCC中的工程实践,特别是针对Linux内核编译的具体适配工作和问题解决。这些内容对编译器开发者、Rust for Linux贡献者以及关注系统工具链进展的读者具有直接的参考价值,其中属性处理、名称解析等问题的解决思路可迁移至类似项目。

技术文章Max Bernstein

The inliner is yielding benefits for ZJIT

文章详细介绍了 Ruby 的 ZJIT 编译器中内联器(inliner)如何通过方法内联优化块(block)调用,从而提升性能。作者首先回顾了 Ruby 解释器中块的工作机制,随后解释 JIT 编译器如何通过类型特化来优化方法调用,并指出核心库方法(如 Array#each)因多态块调用导致优化困难。ZJIT 采用将 callee 的代码内联到 caller 中的方式,利用调用上下文将动态的 invokeblock 转换为直接的块调用和循环,消除了间接调用开销。文章展示了内联前后 HIR 的变化与微基准测试结果(如 cfunc_itself 达到 35 倍加速),并说明当前块内联尚未完全实现,内联阈值等参数仍在调优。适合对编译器设计、JIT 优化和 Ruby 运行时性能感兴趣的读者。

本文深入剖析了 ZJIT 内联器的设计动机、实现细节和实际收益,通过具体示例和基准数据展示了如何解决动态语言中块调用的优化难题。它对编译器开发者、语言虚拟机工程师和关注 Ruby 高性能优化的从业者具有直接的参考价值,其中基于调用上下文的代码重组思路也可迁移到其他 JIT 系统。

技术文章Fzakaria Blog

Seriously, what is the large code-model even for?

文章深入分析 x86-64 大代码模型(-mcmodel=large)在处理线程局部存储(TLS)时的根本性缺陷。作者通过构造超过 2 GiB 的 .bss 和 .text 示例,对比普通数据访问与 TLS 访问的编译器重定位类型,指出尽管大代码模型为普通数据生成了 64 位重定位,但 TLS 访问序列仍使用 32 位立即数(如 R_X86_64_TPOFF32),导致二进制文件超出 2 GiB 时链接失败。进一步剖析 GCC 与 LLVM 生成的指令序列,揭示问题并非编译器实现缺陷,而是 x86-64 psABI 从未定义大代码模型下的 TLS 访问模式,使得 64 位 TLS 偏移无法编码到指令中。文章提供了可复用的 Python 脚本用于生成巨型目标文件,验证了现象的通用性,并指出该限制对有大量线程局部变量的静态链接可执行文件尤为严重。

本文并非泛泛而谈,而是通过可复现的构造实验和汇编级分析,定位到 x86-64 ABI 规范的一项具体缺失,揭示了大型二进制工程中的一个隐蔽陷阱。其直接证据清晰、方法可迁移,适合从事工具链、系统软件或性能敏感大型应用开发的读者参考。文章还提供了生成测试用例的脚本,有助于读者在自己的环境中验证和延伸研究,具备长期的参考价值。

技术文章Mitchell Hashimoto

Everyone Should Know SIMD

文章倡导所有开发者了解 SIMD(单指令多数据流)并破除其过于复杂的迷思。作者以 Zig 语言为例,展示了一套通用的五步模式来将标量循环向量化:广播常量、按向量宽度迭代、执行向量操作、归约向量结果、处理标量尾部。通过终端模拟器 Ghostty 中查找控制字符的真实案例,详细解释了每步的实现细节和寄存器位运算。文章还讨论了编译器自动向量化的局限性,强调手动编写 SIMD 可以在可预测的情况下获得显著性能提升,同时指出该方法主要适用于大量连续数据的处理场景,对于复杂算法则需更高技巧。整体内容清晰、可迁移,降低了 SIMD 的入门门槛。

本文以易懂的案例和通用模板系统讲解了 SIMD 的基本模式,适合希望提升循环密集型代码性能的软件开发者。其提出的五步法具有高度的可迁移性,能帮助读者跨语言理解向量化思维,避免过度依赖容易失效的编译器自动向量化。对于日常优化中处理扫描、比较、计数等任务的工程师,本文是一份低门槛、高回报的入门参考。

技术文章MaskRay

Irreducible loops

文章聚焦于编译器和程序分析中的不可约循环(irreducible loops)问题,首先回顾了支配树和自然循环在可约控制流图上的局限性,指出在优化后的机器码及反编译输出中常见的多入口循环无法被基于支配关系的方法识别。随后详细介绍了韦韬等人在SAS 2007提出的单趟DFS算法,该算法无需支配树或UNION-FIND,通过将遍历中遇到的每条边分为五种情况,并结合“头部链”合并机制,在一次深度优先搜索中同时完成循环识别与头部标记。文章提供了完整的C++实现,并借助不可约核心图和嵌套结构示例验证了算法输出Havlak最细化循环嵌套森林,同时展示了可约情况下与自然循环的一致性。该算法的时间复杂度为O(N+k*E),其中k为衡量非结构化程度的系数,在实际代码中接近线性。文章也指出了算法对DFS顺序的依赖以及不可约循环头的不唯一性。

推荐收录,本文不是简单的算法复述,而是从理论缺陷出发,逐步引出单趟DFS解决方案,并配有清晰图示、完整代码和可运行示例。它对编译器工程、程序分析和反编译领域的读者具有直接的参考意义,能够帮助他们理解如何处理非结构化控制流,并将这套轻量级循环识别方法迁移到自己的静态分析工具中。

技术文章Random Oracle

Constructing quine loops with QCC

文章延续 QCC(Quining C Compiler)的话题,讨论如何把“单文件 C 程序变成 quine”的能力扩展到多程序循环。作者先构造一个基础链路:C 程序生成 Python 程序,Python 再打印出 C 源码,并说明关键前提是把任意字符串稳定转成可执行的目标语言程序,尤其要处理引号、换行和 Unicode 等转义问题。随后文章展示如何把链路继续扩展到 Rust,并指出理论上可继续叠加更多语言,但会受到行长与转义开销的限制。进一步地,作者把目标从“只会打印源码的程序”推广到保留原有业务功能的程序对,通过预处理宏或运行时文本切片从合并源码中裁出 A/B 两个版本,使它们既能执行原功能,也能按条件输出对方源码。文章最后总结这种构造可推广到多个程序,形成任意两两可达的完整图,但也坦承预处理方案会带来大量死代码,运行时裁剪会更干净。

推荐收录,因为文章给出了从单个 quine 到多程序 quine loop 的明确构造路径,包含字符串转目标语言程序、源码拼接、条件编译和可扩展性限制等直接证据。适合关注编程语言、自指程序、源到源转换和编译技术的读者,且其中关于宏裁剪与运行时裁剪的权衡具有可迁移价值。

技术文章Max Bernstein

A survey of inlining heuristics

这篇文章系统梳理了动态语言 JIT 和多种编译器中的内联启发式,重点讨论“何时内联”比“如何内联”更难。作者从代码体积、编译时延迟、缓存压力、递归、调用深度、调用频率、调用上下文和 profile 传播等维度,比较了 Cinder、PyPy、V8、JavaScriptCore、SpiderMonkey、HotSpot、.NET、Dart、ART、HHVM 等实现差异,并补充了机器学习、部分内联和 AOT 信息辅助等研究方向。文章的结论是:内联本质上是一个全局收益与局部预算之间的权衡问题,启发式设计必须结合目标运行时、可观测性和分层编译策略。

推荐收录,因为它不是泛泛而谈“内联能提速”,而是把多个真实编译器/JIT 的决策规则、预算约束和调用上下文处理方式放在一起比较,长期参考价值很高。对做编译器、语言运行时或性能优化的读者来说,这篇文章能直接提供可迁移的启发式设计框架和调参视角。

技术文章Max Bernstein

Checking assembly with Z3

这篇文章记录了作者如何用 Z3 验证一段 JIT 生成的分支less 汇编条件,目标是证明 `FIXNUM_MIN / -1` 这一溢出特殊情况的判定与原始 C 逻辑等价。文章不仅说明了 Ruby fixnum 在二进制补码下的边界行为,还展示了如何把等价性证明转成“寻找反例”的 SMT 问题,并通过故意改错常量来验证脚本确实能抓到反例。

推荐收录,因为它把一个很具体的编译/JIT 边界 bug,抽象成了可复用的形式化验证流程,适合做低层代码正确性检查的参考。对做编译器、JIT、运行时或底层位运算逻辑的读者来说,这种“用 Z3 证明等价性”的方法具有很强的迁移价值。

技术文章Max Bernstein

Partial static single information form

文章围绕编译器中的 static single information form(SSI)展开,重点讨论“partial SSI”这一更轻量的实现路径:不必完整实现复杂的 into-SSI / out-of-SSI 算法,而是可以在 SSA 构建阶段、或借助优化阶段已有的支配式重写机制,逐步插入和消除类型细化节点。作者用动态语言 JIT 的例子说明如何根据分支条件、guard 和对象形态推导更精确的类型信息,并进一步利用这些信息消除冗余操作、提升优化效果。

推荐收录,因为它不是泛泛介绍 SSA/SSI,而是把抽象的中间表示理论落到可实现的编译器工程路径上,清楚说明了如何以较低复杂度获得可用的类型细化能力。文章还讨论了适用边界、与完整 SSI 的差异以及 JIT/动态语言场景中的实现权衡,对编译器和运行时开发者都有长期参考价值。

技术文章Eli Bendersky

Thoughts on WebAssembly as a stack machine

文章围绕“WebAssembly 是否算堆栈机”展开,作者认为这更多是术语争论:WASM 虽然主要通过栈完成运算,但同时提供了 locals,使其不像纯粹只能靠栈交换操作(如 dup、swap)的语言那样受限。作者用 Forth 中依赖大量 tuck/swap 的写法作对比,说明在复杂数据流下,WASM 通过命名局部变量能显著提升可读性。接着给出一个 add_to_byte 示例,比较折叠写法与线性写法,强调栈只是中间执行模型,程序员无需手工管理所有压栈出栈顺序。文章进一步通过 wasmtime 生成的 x86-64 代码说明,编译器会把重复读取同一 local 优化掉,最终代码与手写 C/汇编几乎一致。作者最后指出,WASM 对 locals 的不可别名性质让重复加载消除更容易成立,但这些结论仍依赖于没有对同一 local 的中途写入这一前提。

推荐收录,因为文章直接给出了 WASM 栈语义、locals 设计和编译后机器码的对应关系,并用真实反汇编证明了“多次读取 local 不会带来性能损失”。适合关注编程语言实现、虚拟机设计和编译优化的读者,具有较强的可迁移分析价值。

技术文章Max Bernstein

Value numbering

本文系统讲解了编译器中的 value numbering:先从 SSA 中“同形表达式是否可复用”的问题切入,说明它如何用于公共子表达式消除,并区分纯操作与带副作用操作。作者给出局部 value numbering 的实现思路:用哈希表为指令建立值号,遇到已存在的等价指令就用 union-find/Assign 形式替换,从而在单个基本块内消除重复计算。随后文章把问题推进到全局 value numbering,重点解释了为何必须借助支配关系而不是简单按块遍历,以及在分支、汇合和循环中 phi 节点为何需要特殊处理。文章还讨论了内存相关指令的失效与转发,例如 Load/Store forwarding、跨块的 kill set 管理,并对 Maxine、ART、V8、HotSpot 等实现做了对照。最后作者补充了统一哈希表、value partitioning、scoped hash map、JIT 场景中的强度削弱等相关方向,指出该方法对重复纯表达式很有效,但处理副作用和循环时需要额外的可用性与失效管理。

推荐收录:文章明确覆盖了 value numbering、SSA、dominators、phi 处理、内存失效与 load/store forwarding 等关键机制,并给出 Maxine 等真实实现片段作为直接证据。适合编译器、JIT 和程序优化读者参考,迁移价值在于可直接借鉴其“哈希表+支配关系+失效管理”的分析框架;主要边界是它对复杂内存建模与循环优化仍是概述性质。

工程实践Max Bernstein

Using Perfetto in ZJIT

文章围绕 Ruby JIT 实现 ZJIT 如何借助 Perfetto 做性能诊断展开,核心目标是把“侧退出栈计数”这类静态统计,升级为能看时间分布、调用栈和热点聚集位置的可视化追踪。作者先说明仅靠 --zjit-stats 只能知道退出原因数量,却难以定位它们发生在哪些 Ruby 方法中、集中在启动期还是稳态阶段,因此需要引入 trace。随后通过 Perfetto 的时间线和 SQL 接口,把 slice 与 args 表关联起来统计退出原因和顶层方法,直接找到了 ActiveRecord 相关的 shape/type guard miss 热点。实现部分展示了如何导出 trace、为何 JSON 格式会膨胀到 8GB,以及改用更紧凑的 FXT 二进制格式和采样后将体积降到约 100MB。文章也提到还可以继续追踪编译阶段、代码大小、失效、分配和 GC 等事件,但当前结论依赖采样与单次基准,适合做定位和直觉建立,不适合替代完整性能评测。

文章给出了从计数器到可视化 trace 的完整落地路径,并用真实 JIT 热点证明 Perfetto 能直接帮助定位 side-exit 归因。适合做编译器、运行时和性能排障的参考,尤其对需要把追踪数据转成可查询、可视化分析流程的工程场景有可迁移价值。

技术文章Go Blog

Type Construction and Cycle Detection

文章深入解释了 Go 1.26 中类型检查器的“类型构造”和循环检测改进。作者先用简单的别名、切片、指针示例说明类型构造是一个深度优先的过程:只有依赖类型都完成后,当前类型才能变成 complete。随后文章引入递归类型,说明当类型构造返回 incomplete 类型时,许多依赖底层类型的检查必须延后到全部类型完成之后。接着作者用数组长度依赖 `unsafe.Sizeof` 的例子展示了“incomplete value” 与 downstream/upstream 运算符的区分,说明一旦值表达式会迫使对不完整类型做解构,就必须立即报 cycle error。最后文章概述了新的实现方式:在各类上游表达式处统一检查 completeness,阻止不完整值继续传播,并借此修复了旧算法中一些边缘崩溃问题,提升了编译器稳定性。

文章直接给出 Go 1.26 类型检查器的内部机制、错误边界和实现策略,不是泛泛而谈语言特性,而是可复用的编译器设计案例。适合编译器、语言实现和静态分析读者参考,尤其有助于理解递归类型、延迟检查与循环错误检测的通用思路。

技术文章Go Blog

//go:fix inline and the source-level inliner

文章介绍 Go 1.26 新版 go fix 中的 source-level inliner:它把函数调用按源代码层面展开,并通过 //go:fix inline 指令,让库作者为旧 API、重命名接口和类型/常量迁移提供“自助式”现代化方案。文中以 ioutil.ReadFile 迁移到 os.ReadFile、oldmath 包重构为例,说明 go fix 与 gopls 如何自动提示并批量改写调用点。作者进一步剖析了实现难点:参数消除、求值副作用顺序、可能在编译期失败的常量表达式、名字遮蔽、未使用变量以及 defer 作用域。文章强调该工具追求的是“可证明不改变语义”的整洁改写,因此在批处理场景会比人类更保守,甚至拒绝某些需要函数字面量包裹的情况。

文中直接展示了 //go:fix inline 的迁移用法,并系统解释了源级内联器如何处理语义边界,是理解 Go 代码改写与编译器式重构工具的可靠材料。适合做语言工具、重构引擎或 API 迁移方案的参考,但也要注意它在副作用和 defer 等场景下会刻意保守。

技术文章Go Blog

Allocating on the Stack

文章系统介绍 Go 编译器在切片分配上的栈化优化演进:从原先 append 扩容时频繁产生 1、2、4… 的堆分配和 GC 压力,到 Go 1.25 对小尺寸 make([]T,0,n) 的推测性栈分配,再到 Go 1.26 对 append 扩容场景也能先用栈上小缓冲、必要时再转堆。作者解释了返回切片等逃逸场景下,编译器如何借助 runtime.move2heap 把最终结果搬到堆上,同时尽量保留中间阶段的栈分配收益。文章还点明这些优化依赖切片最终大小、是否逃逸以及 32 字节等边界条件,并给出关闭优化的调试开关。整体上它展示了 Go 通过编译器与运行时协同减少分配、降低 GC 负担的具体机制与适用边界。

推荐收录,因为文章直接给出了 Go 1.25/1.26 在切片分配上从堆到栈、再到自动回迁堆的实现路径,属于可长期参考的编译器优化案例。适合关注 Go 性能、编译器和运行时协同的读者,也能帮助工程师判断哪些写法会触发或错过这些优化。

技术文章Max Bernstein

A fuzzer for the Toy Optimizer

文章延续 Toy Optimizer 系列,讲作者如何为一个玩具编译器优化器构建模糊测试器,目标不是找崩溃,而是检出优化引入的语义错误。作者随机生成由 load、store 和 escape 组成的小程序,再用解释器在“无别名”和“完全别名”两种参数环境下执行,比较优化前后 heap 与逃逸结果是否一致。文中展示了这种不变量如何迅速暴露故意注入的错误:一旦去掉别名写回的关键逻辑,测试会几乎立刻失败并给出具体差异。作者也说明了局限性,例如只覆盖两种极端别名情况,且该等价定义不适用于会删除分配的优化。整体上,这是一个关于编译器优化测试、属性测试和语义 oracle 设计的实用案例。

推荐收录,因为文章给出了可复用的编译器优化 fuzzing 方案:随机程序生成、语义解释器和基于别名场景的正确性判定,而且能用最小反例迅速暴露优化错误。适合编译器、语言实现和测试工程读者参考;但要注意它的 oracle 依赖当前优化模型,不能直接套到会改变分配语义的场景。

技术文章Max Bernstein

Type-based alias analysis in the Toy Optimizer

文章延续 Toy Optimizer 系列,围绕加载/存储转发中的别名分析展开,先指出仅按偏移量划分 alias class 太粗,会把不同类型对象上同一偏移的访问误判为冲突。作者借鉴 type-based alias analysis,用类型层次树的前序/后序区间表示各 heap region,将“是否可能别名”转化为区间重叠查询,并在缺少类型信息时退化到 Any。随后又补充了对象来源、分配点、常量对象和已知内建函数副作用等更强的别名线索,用于局部保留或部分失效缓存的 heap 信息。文章还讨论了未知调用、逃逸对象与保守失效的边界,强调这种做法在 JIT 和受控语言中能以较低成本提升优化精度,但在通用 C-like 场景下需要更强的分析配合。

推荐收录,因为文章给出了从偏移量别名到类型层次 TBAA 的具体改造路径,还展示了与对象来源、内建副作用和未知调用的联动处理。适合做编译器、JIT 和语言运行时优化的参考,尤其对需要在精度与分析成本之间取舍的读者很有迁移价值。

工程实践Anthropic Engineering

Building a C compiler with a team of parallel Claudes

文章复盘了 Anthropic 研究员用 16 个并行 Claude 实例,从零实现一个 Rust 版 C 编译器的过程。核心不是“让模型写代码”本身,而是设计一个能长期自治的 harness:用无限循环驱动任务推进、通过 git 文件锁避免重复劳动,并让不同代理分工处理测试、文档、性能和代码去重。作者强调,真正决定成败的是高质量测试、可自动判错的日志、以及把问题拆成可并行的小任务;当 Linux 内核编译这种“单大任务”卡住时,又引入 GCC 作为在线 oracle 和抽样测试来恢复并行性。最终产物可编译 Linux 6.9 及多个大型项目,但仍存在 16 位 x86、汇编器/链接器、代码质量和性能不足等边界,说明当前自治编程仍远未“全能”。

有直接工程证据:并行代理、任务锁、测试 harness、GCC oracle 和 CI 共同构成了可复用的方法论。适合做 AI 编程代理、自动化测试与编译器工程的参考,但也明确暴露了自治开发在正确性、效率和边界处理上的风险。

技术文章Max Bernstein

A multi-entry CFG design conundrum

文章讨论 ZJIT 在编译 Ruby 字节码时遇到的多入口控制流图设计难题。由于 Ruby 默认参数在调用时求值,编译器需要把默认参数逻辑放在被调函数内部,并同时支持解释器入口、JIT 入口和若干默认参数入口。作者展示了这种 HIR 设计如何让 SSA、RPO 遍历和 Cooper 风格支配树算法都变得别扭,因为图里不再存在唯一的起始块。文中系统比较了三种方案:保留特殊处理、合成超级入口块、或按入口复制整张 CFG,并说明复制方案虽然简单但会带来代码膨胀。最终更新里给出团队选择了 superblock/EBB 方案,接受了更复杂的 dominator 与 predecessor 处理,以换取更清晰的入口模型。文章的边界也很明确:结论主要适用于多入口 IR 设计,后续复杂分析仍需继续验证。

收录价值在于它不是泛泛谈“编译器设计”,而是拿真实的多入口函数 IR、支配树失配和三种可选方案做了具体权衡。适合编译器、语言运行时和 IR 设计读者参考,尤其是需要处理入口分裂、默认参数或多返回点的实现者。

技术文章Max Bernstein

The GDB JIT interface

文章系统梳理了 GDB 如何借助 JIT 接口恢复 JIT 代码的符号、函数名和行号信息,从而在断点、回溯和反汇编时避免大量“???”。作者先解释旧接口的工作流:JIT 在内存中生成一份包含 DWARF 的临时对象文件,再通过 __jit_debug_descriptor 和 __jit_debug_register_code 通知 GDB 读取。随后又介绍了新版自定义调试信息接口,说明 reader 需要实现的回调、匹配代码区间与帧信息的职责,以及目前各运行时的支持现状。文章还讨论了将 Linux perf map 复用到 GDB 的可行性、GDB JIT 链表导致的 O(n²) 问题,以及 GC/代码移动对符号稳定性的约束。整体来看,它不仅讲清了接口机制,也点出了工程实现中的性能与生命周期边界。

文中直接给出 GDB JIT 旧/新接口的调用链、reader 回调和典型坑位,是理解 JIT 调试基础设施的实用材料。适合做运行时、调试器或语言实现相关工作的读者参考,尤其能迁移到符号注册、代码生命周期管理和可观测性设计中。

工程实践Stanford Hazy Research

AMD GPUs go brrr

这篇文章深入分析了 AMD MI355X/CDNA4 GPU 上 AI kernel 的性能来源,并提出 HipKittens 作为面向 AMD 的编程原语集合。作者先从硬件结构入手,对比了 AMD 与 NVIDIA 在寄存器文件、SRAM、矩阵指令、chiplet/L2/LLC 组织以及编译器支持上的差异,说明许多在 NVIDIA 上有效的做法在 AMD 上会失效。文章重点解释了为什么 wave specialization 在 AMD 上表现不佳:没有寄存器重分配、AGPR/VGPR 约束更强、以及细粒度同步和内存指令行为更复杂。为此,作者提出 8-wave ping-pong 和 4-wave interleave 两种调度模式,并结合 chiplet-aware 的 grid 排布来提升缓存复用。实验表明,这些策略在 GEMM 和 attention 等工作负载上能达到接近或优于现有 AMD 基线的性能,但其方法强依赖 CDNA3/4 细节、HIPCC 行为和底层指令布局知识,移植到其他平台仍需重新验证。

收录依据很明确:文章不仅给出 AMD GPU 的硬件差异分析,还提供了寄存器调度、bank conflict、chiplet cache 复用和基准测试的完整证据链。适合做 GPU kernel、编译器和 AI 基础设施的长期参考,但读者需要接受其强 AMD/CDNA 绑定和大量底层实现细节。

工程实践Stanford Hazy Research

HipKittens: Fast and Furious AMD Kernels

文章围绕 AMD GPU 上的高性能 AI kernel 设计,介绍了 HipKittens 这一套面向 HIP 的 C++ 嵌入式原语。作者先分析现有 AMD 软件栈的问题:AITER、PyTorch、Triton、TileLang 和 CK 在若干 attention/GEMM 场景下难以稳定逼近峰值,部分还受限于寄存器分配、bank conflict、chiplet swizzle 等硬件细节。随后提出核心判断:tile 抽象可以跨架构复用,但真正决定性能的内存访问、调度和后端实现必须按 AMD/ NVIDIA 分开定制。基于这一思路,HipKittens 用约 500 行代码实现 attention 前向、不到 100 行热循环实现 GEMM,并在多项基准上超过现有基线。文章同时指出 wave specialization 在 CDNA3/4 上并不总有效,说明可移植的高层接口并不等于可移植的底层优化。

文中直接给出可验证的性能结果:HipKittens 的 attention 和 GEMM kernel 在 AMD MI355X 上超过多种基线,且代码规模很小,说明其方法不只是概念展示。适合做 GPU kernel、AI 编译器和多硬件适配的参考,尤其能帮助读者理解“统一接口、分离后端实现”的可迁移设计。

技术文章Faultlore

Pair Your Compilers At The ABI Café - Faultlore

文章讨论跨语言 ABI/FFI 兼容性,从 rustc、clang、gcc 对 __int128 的传递分歧切入,指出 ABI 多数未规范化,跨语言调用本质上是类型双关。作者介绍 abi-cafe:根据抽象类型与函数签名生成 caller/callee 代码,双方用 write_val 回调上报所见字节,由测试框架比对,从而在不预设 ABI 实现的前提下发现编译器分歧。1.0 因用具体值描述签名而无法表达枚举、联合等类型;2.0 改用 kdl-script 类型系统和 pun types 描述不同语言中结构不同的对应类型,并处理 tagged/untagged union、repr(transparent)、Option<&T> 优化等双关。核心未解难题是同步不同形状类型树的遍历与比较,项目仍属 WIP。适合编译器、FFI 与系统编程读者。

推荐收录:文章给出 abi-cafe 的黑盒 ABI 测试方法、graffiti value、复合类型树遍历等可迁移设计,并用 __int128 等真实编译器分歧证明其价值。它对 Rust/C FFI、编译器后端和系统编程读者尤其有用,可帮助理解 ABI 测试边界;需注意 2.0 仍为 WIP,复杂类型双关同步尚未完成。