Programming Languages

65 篇内容

技术文章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

Writing a SQL database from scratch in Go: 4. a database/sql driver

文章是 Phil Eaton “从零用 Go 写 SQL 数据库”系列的第四篇,主题是让自制数据库 gosql 实现 Go 标准库 database/sql 驱动接口。作者展示了如何注册驱动、实现 Driver/Conn/Rows 等接口,以及如何将已有的解析、执行和结果处理逻辑封装到符合 database/sql 规范的 API 中。文中以具体代码说明 Open、Query、Next、Columns 等方法的实现要点,并明确指出当前版本不支持参数化查询、事务和预处理语句,仅处理第一条语句。最终通过一个使用标准 sql.Open 查询数据的示例验证了驱动的可用性。文章篇幅较短,重点在于解释接口契约与底层映射。

推荐收录,因为它以清晰代码展示了如何为自制数据库实现标准 database/sql 驱动,对理解 Go 数据库驱动接口的契约和低层数据流转有直接帮助。适合需要为自研存储系统提供标准 SQL 接入、或想学习 Go database/sql 内部机制的开发者。文章明确承认不支持参数化、事务和预处理,边界清楚,便于读者判断适用范围。

技术文章Phil Eaton - databases

How do databases execute expressions?

文章调查了 Cockroach、ClickHouse、DuckDB、PostgreSQL、SQLite、MySQL/MariaDB、MongoDB、TiDB 等系统如何执行查询表达式。作者通过阅读核心源码并以控制流函数为判断依据,区分了树遍历解释器、栈/寄存器虚拟机和 JIT 编译三类实现。结论显示多数数据库仍采用树遍历解释器,PostgreSQL 与 SQLite 使用虚拟机,MongoDB SBE 为栈式虚拟机,部分系统支持 JIT;ClickHouse、DuckDB、TiDB、Cockroach 还采用向量化执行。文章认为向量化和 JIT 更契合列存分析负载,事务系统迁移到编译器架构的收益未必显著;局限是结论来自源码阅读,可能存在误判且缺少性能基准。

本文通过大量数据库源码调查,给出了表达式执行模型的一手判断,具有长期技术索引价值。适合数据库内核开发者、查询引擎研究者以及想理解解释器与虚拟机差异的读者。其源码判断方法可直接迁移到其他系统,但需注意结论为静态阅读而非基准验证。

技术文章Phil Eaton - databases

Exploring PL/pgSQL part two: implementing a Forth-like interpreter

文章详细展示了如何在 PostgreSQL 的 PL/pgSQL 中从头实现一个类似 Forth 的栈式解释器。作者首先介绍 Forth 语言的基本概念,然后逐步实现数据栈、程序计数器、条件分支(IF/THEN)、内建指令(DUP、SWAP、算术运算等)以及函数定义(DEF)和调用(CALL)机制,并通过 hstore 扩展存储函数入口位置,使用返回指针栈处理嵌套调用。最终通过运行递归斐波那契函数验证了解释器的正确性。文章还指出了实现中的一些 PL/pgSQL 特性限制,如数组长度处理、NULL hstore 合并等问题。该实现仅为 Forth 的子集,未涉及完整 Forth 的诸多特性,但足以展示在受限的数据库过程语言中构造解释器的可行方法。

推荐收录,因为文章提供了一个完整可运行的 PL/pgSQL 解释器实现,包含逐步代码解释、设计取舍和实际运行验证,不是简单的语法介绍或新闻转述。适合对 PostgreSQL 内部过程语言、解释器构造或栈机器实现感兴趣的读者。其可迁移价值在于展示了在资源受限且语法特殊的嵌入式语言中实现编程语言核心机制的方法,对理解解释器原理和数据库编程均有启发,技术主题长期有效。

技术文章Phil Eaton - databases

A minimal RocksDB example with Zig

本文介绍用 Zig 编写一个最小 RocksDB 嵌入式键值数据库示例,封装 C API 实现 set、get 和基于前缀的 list 命令。作者先说明 RocksDB 以 C++ 编写但提供 C API,便于其他语言集成;随后逐步展示如何在 Zig 中用 @cImport 导入头文件,定义 RocksDB 包装结构,并调用 rocksdb_open、put、get 及迭代器接口。文中重点解释了 Zig 的类型系统和互操作细节,包括 error 类型缺陷、可选指针、C 字符串到切片的转换,以及匿名结构体在跨函数返回时的类型不兼容问题。最后给出 Linux 上的编译步骤、build.zig 配置和命令行运行结果。该示例仅适用于 Linux 与 Zig 0.10.x,RocksDB C API 文档不足,需参考头文件和测试代码。

文章提供了完整可运行的 Zig 调用 RocksDB C API 的最小示例,系统解释了 Zig 的错误处理、可选指针、C 字符串转换及构建配置,直接证据充分。适合希望学习系统编程语言与 C/C++ 库互操作、或集成嵌入式 KV 存储的开发者。可迁移价值在于 FFI 模式和 RocksDB 基础用法,但需注意 Zig 版本(0.10)与当前版本存在差异。

技术文章Phil Eaton - databases

Writing a SQL database, take two: Zig and RocksDB

文章展示了如何在 Zig 语言中用约 1700 行代码实现一个基于 RocksDB 的嵌入式 SQL 数据库。作者将项目拆分为词法分析、语法分析、存储层和执行层,详细讲解了每个组件的设计,包括手写 lexer/parser 支持 SELECT、INSERT、CREATE TABLE 等语句,以及如何用 RocksDB 持久化表元数据和行数据。文中还介绍了 Zig 的内存管理(Arena allocator)、数据序列化方案和表达式求值。该实现仅支持极小的 SQL 子集,无主键、事务和索引,主要用于学习数据库内部原理和 Zig/RocksDB 的实践,而非生产用途。

推荐收录,因为文章提供了完整可运行的代码实现和逐步讲解,清晰展示了从 SQL 解析到键值存储映射的完整流程。适合对数据库内部实现、Zig 语言或 RocksDB 感兴趣的开发者阅读,可迁移价值在于理解手写 lexer/parser 的实践、内存管理策略以及嵌入式数据库的架构设计。主要风险是项目功能有限,但作为教学参考具有长期价值。

技术文章Phil Eaton - databases

Exploring PL/pgSQL: Strings, arrays, recursion, and parsing JSON

本文是一篇面向 PL/pgSQL 初学者的实践教程,从基础函数定义、命名参数、OUT 参数和递归函数入手,逐步过渡到字符串与数组操作、自定义复合类型,最终实现一个能解析 JSON 对象子集的词法分析器和语法解析器。作者强调目标不是生产级代码,而是熟悉语言特性,因此明确排除了嵌套对象、数组、Unicode 和小数等复杂场景。文中给出了完整可运行代码、测试脚本和错误处理示例,展示了如何利用 PL/pgSQL 的内置 SQL 函数、数组操作和自定义类型完成命令式编程任务。

推荐收录,因为文章不是简单罗列语法,而是通过实现字符串转数组、递归斐波那契和 JSON 解析器三个递进式例子,让读者理解 PL/pgSQL 的函数声明、控制流、复合类型和错误处理机制。对需要在 PostgreSQL 中编写存储过程、触发器或复杂业务逻辑的开发者来说,文中的代码模式和调试方法具有直接参考价值,且作者对语言边界和适用场景的说明清晰克制。

技术文章SelectDB 技术分享

Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑 Doris Python UDF 提供的不只是一个函数扩展机制,而是一条连接 Doris 高...

文章系统介绍 Apache Doris 的 Python UDF 功能,旨在让 SQL 直接调用 Python 生态以应对 AI 和实时分析中日益复杂的业务逻辑。核心方法是通过 Arrow RecordBatch 批量传输数据到独立 Python Server 执行,并支持 Pandas Series 向量化计算,减少跨语言和跨进程开销。Doris Python UDF 完整支持标量 UDF、UDAF 和 UDTF,提供内联与 ZIP 模块化加载方式,并内置进程隔离、复用和自愈机制以保证生产环境稳定性。文中给出支付风险分级和金额分桶等示例,展示在数据不离开分析链路的情况下完成规则判断、特征加工和模型打分。该能力已在 SelectDB 商业化产品中提供,适合需要将 Python 逻辑嵌入实时分析查询的场景,但部署前需在所有 BE 节点配置 Python 环境并安装 pandas/pyarrow。

本文对 Doris Python UDF 的设计机制、使用方式和生产化保障做了完整阐述,包含 Arrow 批量执行、向量化优化和故障恢复等关键细节,而非泛泛介绍。适合数据库内核开发者、数据工程师和需要在 SQL 引擎中集成 Python 生态的读者,可迁移到其他分析型数据库的扩展机制设计,帮助理解如何平衡灵活性、性能与可运维性。

技术文章知乎 - 严格鸽

C++的一个并不零成本抽象的例子

文章通过C++代码示例展示抽象并非零成本:直接使用 std::vector<int>& 参数时,由于LLVM IR带有nonnull、readonly、dereferenceable等属性,编译器能提取data指针并生成SIMD向量化代码;但将其封装为View类后,这些属性丢失,且&&短路求值使编译器不敢提前解引用,导致无法优化。作者通过调整&&顺序或显式添加size陷阱检查恢复了优化,说明问题在于抽象包装丢失编译期信息。文章还提到Rust存在类似现象,并已提交LLVM issue。结论指出编译器优化有边界,但通常仍优于手动优化,适用于关注性能与编译器的C++开发者。

推荐收录,因为它以具体代码和Godbolt汇编对比揭示了C++抽象导致的编译期信息丢失和向量化失败,并给出了可复现的解决方案。适合关注性能优化、编译器行为或C++抽象设计的读者,可迁移价值在于理解编译器元数据如何影响优化,以及如何通过调整代码顺序或添加断言恢复优化。

工程实践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 用户。文中提出的“内部/外部证明”视角为思考类型系统中的循环依赖提供了可迁移的思维框架,有助于理解类似语言特性的设计取舍。

工程实践Stanford Hazy Research

Retire the Abstractions

本文以编写 CUDA megakernel 的经验为起点,提出 AI 编程智能体正在取代传统软件抽象层的认知卸载功能。作者回顾了去年依靠 C++ 抽象管理复杂性的痛苦,以及今年借助 agent 直接将不完整的提示转为优化代码的实践,由此预言 CUDA DSL 等抽象层即将退役。文章进一步讨论代码库角色的迁移:精确的代码库变得脆弱,而模糊但可传递的意图提示更适应智能执行器;信任将更多放在规约、测试和不变量等 oracle 上,而非实现细节。同时,作者也指出抽象层作为共享验证面、知识传递手段仍具价值,且专家经验在此转型中不可或缺。全文核心观点是抽象会退役,但领域知识永存。

推荐收录,因为本文不是泛泛而谈的未来预测,而是基于真实 megakernel 工程演进提出的具体论证,提供了从认知外包到代码生命周期重估的完整视角。适合关注 AI 辅助系统编程、DSL 设计与软件工程演化的研究者与工程师,可迁移的思考在于如何重新权衡代码、测试与意图描述在智能工具介入后的角色。

工程实践Fzakaria Blog

Super Mario Derivations

文章探索了利用Nix语言的惰性求值特性,将属性路径转化为Super Mario Bros. 3的按键输入序列。作者通过将每次按键操作定义为独立的派生(derivation),并使每个派生依赖前一帧的快照作为输入,从而实现了游戏状态的懒加载与增量构建。Nix store实际上充当了模拟器快照历史的持久层,分支或追加操作只需计算增量部分。文章还分析了递归深度限制(默认约2400次按键)、内核命令行参数长度限制(21,845次按键)以及构建时间线性增长等实际约束,并提出了通过文件输入绕过限制的方案。该工程案例展示了Nix派生机制在游戏状态机中的创意应用,但主要用于技术演示,性能开销较大。

推荐收录,因为这不是简单的技术玩梗,而是深入展示了Nix惰性求值、派生依赖和内容寻址存储的底层机制。文章提供了细致的基准测试和限制分析,对理解Nix的运行模型和扩展能力很有启发。适合对Nix或函数式构建系统感兴趣的工程师,其将输入序列拆分为可复用的派生单元的思想可迁移到其他需要增量构建或状态机复现的场景。

技术文章matklad

Zig's Io.Threaded is Neat

本文深入解析Zig语言标准库`std.Io.Threaded`的实现,重点介绍其如何在阻塞线程模型中可靠支持取消操作。作者先区分并发与并行,指出取消是并发的本质特征,而传统线程因系统调用阻塞难以取消。然后详细说明在POSIX上通过信号与共享内存标志位协作的取消协议,以及Windows上使用`NtCancelSynchronousIoFile`的更直接方式。文章还对比了Java线程中断和`pthread_cancel`的不足,并分析Zig在接口层面将`async`与`concurrent`分离的设计优势,从而在用户态实现清晰的取消语义。内容深入系统调用、运行时和语言设计的交界,展示了将一个“怪异”想法工程化落地的细节,但方案依赖特定平台机制,且线程池复用等工程权衡未充分展开。

推荐收录,因为本文不是泛泛介绍Zig特性,而是对并发取消这一底层难题给出具体实现解析,从信号/标志位协议到接口设计取舍均有清晰论述,并提供了跨平台对比。适合系统编程、语言运行时和并发模型设计者阅读,其按平台中断syscall的思路以及分离异步与并发的接口设计可供其他语言或框架参考。

科研思考Stanford Hazy Research

Retire the Abstractions

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

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

工程实践LWN.net

Twenty years of Pandoc

文章回顾了文档转换器 Pandoc 二十年的发展历程,从最初仅支持几种格式的简单 Markdown 转换器,到如今支持超过五十种文档格式并被数百万台计算机安装的开源工具。作者 John MacFarlane 讲述了项目起源、技术选型(如选择 Haskell 的理由及其影响)、解析器架构的演进(从老式解析到新式解析器),以及性能优化与正确性权衡。还分享了社区建设、长期维护的挑战与经验,包括商业支持与资金模式。文章指出,Pandoc 的成功源于持续改进、实用主义设计和对用户需求的关注,但也坦言 API 稳定性等未完全实现的目标,为开源维护者提供了真实案例。

推荐收录,因为这不是简单的功能介绍,而是作者从二十年亲身实践中提炼出的工程决策与开源维护经验,涵盖技术选型、架构权衡、性能取舍和社区建设。对从事开源工具开发、文档处理系统或函数式编程实践的读者都有直接参考价值,其关于长期项目可持续性的思考可迁移至类似工程场景。

技术文章Cloudflare Blog

Workers RPC now works across Python and JavaScript

文章介绍Cloudflare Workers RPC系统如何基于Cap'n Proto实现JavaScript与Python之间的跨语言透明远程调用。核心机制是利用Pyodide的FFI自动转换基本类型,并通过workers-runtime-sdk包将Web API对象(如Request、Response)映射为原生Python类型,使开发者无需定义模式或序列化格式即可传递对象、函数和流。文中以Pygments调用为例展示实践,并说明异常传播、参数转换等细节。该方法依赖Workers平台与Pyodide环境,类型转换受限于结构化克隆和代理机制,不适用于所有跨语言场景。

收录理由:该文展示了跨语言RPC的工程实现与类型系统桥接策略,对多语言分布式系统开发者有直接参考价值。其透明类型转换理念可迁移至其他类似环境,但需注意其强依赖Workers平台。适合关注服务集成、多语言协作的工程师阅读。

技术文章Daniel Lemire

How fast is C++26’s std::hive?

文章对 C++26 标准库新增容器 std::hive 进行了性能基准测试,并与 std::vector 和 std::list 在插入、遍历、删除和内存占用等方面进行对比。实验使用特定编译器、硬件和测试数据,测量了纳秒/元素、指令数和周期数。结果显示 hive 的插入成本约为 vector 的两倍,遍历速度与链表相当且远慢于 vector,主要因跳过字段和缺乏自动向量化;但在元素删除和内存占用上优于 list。作者指出 hive 不是更快的 vector,而是提供了稳定引用和常数时间删除的更好 list。该基准测试为 C++ 开发者在选择容器时提供了具体的性能参考,但结论受限于合成负载和单一硬件平台。

推荐收录,因为文章提供了针对 std::hive 的详细基准测试,用数据揭示了其与 vector 和 list 的性能差距和原因(如指令开销、缓存局部性、自动向量化影响),并给出了实际使用建议。适合 C++ 系统编程和性能优化场景的读者,可帮助他们在需要稳定引用与快速删除时做出容器选择,且评测方法论可迁移至其他数据结构的性能对比。

工程实践Fzakaria Blog

Nix finally has a source-bootstrapped OpenJDK

文章记录了在Nix包管理器中实现从源代码自举构建OpenJDK的完整过程,通过移植Guix的bootstrap链(jikes、GNU Classpath、JamVM等),从零开始逐步构建出OpenJDK 7至25,脱离了对预编译二进制JDK的依赖。作者详细对比了Nixpkgs传统依赖二进制seed与GuixPkgs全源代码构建的闭包差异,量化了引导额外引入的876个推导项,并指出共享的C++工具链占据闭包主体。该工作展示了可复现构建在持久化软件供应链中的进展,同时也揭示了当前JDK自举对特定历史工具链的依赖和构建环境的复杂性。

推荐收录,因为本文不是简单的工具介绍,而是提供了真实的工程方案和可复现的构建链细节,包括从jikes到OpenJDK 25的19次完整构建过程及闭包分析。适合关注可复现构建、软件供应链安全或Nix/Guix生态的开发者,文中的自举策略和依赖分析手法可直接迁移到其他编译型语言的自举实践中。

工具笔记Simon Willison

uv 0.12.0

文章介绍了 uv 0.12.0 中 uv init 命令的破坏性变化:默认由在根目录生成 main.py 改为使用 src/ 布局,并集成 uv_build 构建后端以支持构建 wheel 和 tar.gz 分发包。作者通过对比 0.11.x 和 0.12.0 的 uv init 输出目录结构,展示了具体差异,并提及已建立自动化快照仓库跟踪变更。作者坦言因惯性尚未在个人项目中采用 src 布局,但认为现在正是切换时机。文章简洁明了,主要面向 Python 开发者,说明工具新版本的默认打包最佳实践,适合新建项目或升级时参考。

推荐收录,因为它记录了 uv 这一重要 Python 工具链中打包默认行为的重大变更,直接提供了前后对比证据,帮助开发者理解社区布局标准化趋势。适合 Python 开发者升级工具或规划新项目结构时参考,可迁移用于改进项目打包配置,避免与新默认行为冲突。

技术文章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 系统。

技术文章Mitchell Hashimoto

Everyone Should Know SIMD

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

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

技术文章matklad

Memory Safety's Hardest Problem

文章聚焦于内存安全领域最棘手的问题:带标签联合体(tagged union)的类型混淆。通过Zig代码实例演示了初始化联合体为一种类型、获取内部指针,再覆盖为另一种类型,导致指针类型与实际数据不匹配,违反类型安全。指出类似问题也存在于Ada,构成典型反例。文章进一步区分理论难点与实际攻击面,强调实践中缓冲区溢出远比联合体混淆常见,但早期行业未采纳更安全的数组语法是重大失误。整体上,通过历史视角和代码实证,探讨了语言设计如何影响内存安全性,边界在于未深入讨论类型混淆在现代漏洞利用中的实际威胁。

推荐收录,因其以简明代码和参考文献直指内存安全的一个底层难题,纠正了常见认知。对从事系统编程、语言安全或编译器设计的读者,此文提供了可迁移的反例分析和历史教训,有助于理解类型系统与安全性的深层关联。其价值在于将复杂问题具像化,并引导读者反思语言设计决策。

工程实践Alex Chan

Fixing a bug with byte order marks

作者在整理本地媒体库字幕并统一为WebVTT格式时,遇到UTF-8字节顺序标记(BOM)导致SRT转换异常的bug。文章先解释BOM的原理及其在UTF-8编码中的具体字节序列,然后展示BOM与序列号混合导致解析失败的现象。修复方案从最初手动检测和移除,优化为利用Python的encoding="utf-8-sig"自动跳过BOM,使转换代码回归纯净。对于已经生成的错误文件,作者使用ripgrep结合字节模式(?-u:\xEF\xBB\xBF)搜索文件中的BOM,并通过脚本批量清理,最后用ripgrep和Git仓库双重验证修复结果。整个过程串联了字符编码知识、工具选择和验证手段,是典型的文本处理工程调试案例。

推荐收录,因为该案例通过一个真实的文本编码陷阱,展示了从原理理解到优雅修复的完整路径。文中提供的utf-8-sig编码技巧和ripgrep字节搜索模式可直接迁移到其他处理多编码文件的场景,尤其适合需要处理外部数据来源的开发者。同时,它强调了理解底层细节对快速定位问题的重要性,对提升工程调试能力有实际参考价值。

工程实践知乎 - NGINX洪志道

09 | AI太擅长写业务了

文章以 Nginx 上 Lua Web API 的开发为例,介绍了如何利用 AI 辅助编程实现 Request、Response 和 Headers 对象。核心方法是统一对象模型的设计模式:通过 create(创建骨架)、get(取出 C 结构体)和 fill(填充数据)三个独立职责,解耦对象定义、数据来源和跨语言访问,确保 Lua 与 C 两侧的一致性。作者强调 AI 更适合在清晰的设计约束下快速复制正确模式,而人负责确定模型和边界。文章还讨论了 AI 在加速理解系统和生成代码方面的价值,以及如何在迭代中提升代码质量。结论是“人设计,AI 实现”能平衡效率与质量,但需要较强的设计能力来引导,且 AI 初始输出需人工审校。适用场景包括跨语言系统开发、嵌入式脚本扩展等,不足在于对设计者能力要求较高。

推荐收录,因为文章不仅展示了 Nginx/Lua 跨语言对象管理的具体工程实现,还提炼出可复用的 create/get/fill 设计模式,并提供了人机协作的实践边界。对于需要开发嵌入式脚本接口、处理跨语言对象生命周期,或希望利用 AI 提升编码效率的工程师,文中模式可以直接迁移,协作理念也具有长期参考价值。

技术文章Trail of Bits Blog

Rust-proof your code with our new Testing Handbook chapter

文章宣布Trail of Bits在Testing Handbook中新增Rust安全测试章节,系统介绍了用于验证Rust程序安全性的工具和技术。内容首先概述Rust安全保证的边界与未尽问题,然后深入动态分析领域,包括使用Miri检测未定义行为、proptest属性测试、覆盖率测量和变异测试等。接着阐述静态分析工具Clippy的深度用法及推荐lint。此外,还总结了从审计实践中积累的陷阱清单,如操作符优先级差异,并提供了内存清零的三种方案。最后,介绍了专用工具如模型检查器Kani和供应链依赖审查方法。文章旨在为开发者提供一个全面的Rust安全测试流程,但内容为概述,具体细节需参考完整手册章节。

此文系统梳理了Rust安全测试的工具链和最佳实践,从动态分析到静态分析再到供应链安全,覆盖全面,且融入了审计实战经验。适合Rust开发者、安全工程师和注重代码质量的团队参考,可帮助识别常见安全陷阱并集成多种测试方法。虽然文章为概述,但提供了清晰的指引和资源链接,可迁移性强。

工程实践Simon Willison

Rewriting Bun in Rust

本文详述了Bun从Zig全面重写为Rust的过程,核心驱动是内存管理难题(如use-after-free、double-free)和崩溃导致的维护负担。作者借助Claude驱动的AI代理,利用TypeScript测试套件作为一致性验证,通过动态工作流、对抗性代码审查和流程修复机制,在11天内自动化完成了百万行代码的移植,并已平稳运行一个月。文章展示了代理工程在超大规模代码迁移中的完整工作流程,包括成本($165K API消耗)、质量保障和实际效果,也讨论了语言选择从单向决策变为可逆决策的范式转变,但强调该方法高度依赖高质量测试套件和大量模型输入。

推荐收录,因为该案例系统展示了利用前沿AI模型进行超大规模代码重写的完整实践,从动机、方案设计、自动化执行到质量控制和上线验证,证据链完整。尤其适合关注AI工程化、编程语言迁移、测试驱动开发或开源项目维护的读者,文中关于一致性套件驱动、流程修复而非手工修代码的理念具有很强的可迁移性,但需注意其成功依赖高质量测试资产和充足的模型交互预算。

技术文章Random Oracle

Constructing quine loops with QCC

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

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

技术文章LWN.net

[$] Flexible metaprogramming with Rhombus

文章介绍了 Rhombus 这门新的编程语言,核心目标是把 Racket 级别的宏/元编程能力,与更接近 Python 的简洁语法和更实用的标准库默认值结合起来。作者先回顾 Lisp 系语言在元编程上的优势,以及传统括号语法在日常开发中的可读性门槛,再说明 Rhombus 试图通过新语法降低使用宏的心理成本。文中重点讨论了它如何让宏更自然地融入普通代码,而不是只服务于语言黑客或研究场景。文章也指出,这类设计的价值在于提升语言可扩展性,但其长期成功仍取决于生态、工具链和社区接受度,而不只是语法是否“更像 Python”。

推荐收录,因为文章直接围绕“元编程能力如何在普通语言中可用”这一长期主题展开,并给出了 Rhombus 结合语法与宏系统的具体思路。适合关注语言设计、宏系统、DSL 或可扩展语法的读者参考,其可迁移价值在于理解“表达力、可读性与可扩展性”之间的取舍。

工程实践知乎 - NGINX洪志道

05|NGINX 脚本化历史,以及为什么选择官方 Lua

文章梳理了 NGINX 脚本化能力的演进脉络:从早期 Perl、SSI,到作者参与的 njs、QuickJS,再到自己尝试的 nginx-lua-web,说明 NGINX 一直在扩展可嵌入脚本运行时。核心论点是,这个新项目不想让用户直接面对 NGINX 的 body filter 等内部概念,而是提供更接近纯 Web 运行时的编程体验。作者进一步比较了 OpenResty 常用的 LuaJIT 与官方 Lua,认为后者在当前版本中性能、GC、稳定性和工程可用性已经足够,且更适合做 C 程序的嵌入式胶水语言。为提升易用性,文章还借鉴了 JS Web APIs,强调用 fetch 等标准接口降低脚本门槛。整体更像一次结合 AI 编程实践的工程选型记录,但其中部分关于版本演进和生态判断带有作者经验视角,适合与实际需求一起审视。

文章直接给出了 NGINX 脚本化路线、官方 Lua 选型和 Web API 设计的工程理由,不是泛泛而谈。适合做嵌入式脚本运行时、Nginx/OpenResty 生态或 AI 辅助开发实践的读者参考;但其中对 LuaJIT/官方 Lua 的结论带有作者立场,具体迁移前仍需结合基准测试验证。

科研议题美团技术团队

LongCat-Flash-Prover:AI 攻克数学定理证明,不仅要“算得对”,更要“证得严”

文章介绍了美团开源的定理证明模型 LongCat-Flash-Prover,核心目标是让模型从“能给出答案”走向“能生成可由 Lean4 严格验证的证明”。作者将形式化推理拆成自动形式化、草稿生成和证明生成三类原子能力,并结合工具集成推理、混合专家迭代、课程学习式轨迹合成与 RL 训练,构建出一套面向形式化数学的训练与验证框架。文章同时给出 MiniF2F-Test、ProofNet、MathOlympiad-Bench、PutnamBench 等基准结果,并讨论了模型在证明中可能出现的“作弊”行为及其规避方法。

推荐收录,因为它不只是发布一个模型,而是系统讲清了形式化定理证明的任务拆解、数据合成、工具反馈、训练稳定性和评测边界,具有很强的方法论价值。对做大模型推理、自动证明、形式化验证或工具增强学习的读者,都能直接借鉴其中的框架设计与风险控制思路。

技术文章LWN.net

[$] Free-threaded Python: past, present, and future

这篇文章围绕 Python 的 free-threaded 版本展开,系统回顾了移除 GIL 的动机、相关历史、当前实现状态以及它对 Python 运行时和生态的影响。文章不仅解释了为什么要推进无 GIL,还讨论了这一变化在并行执行、兼容性、扩展模块支持和后续演进上的现实边界,因此适合作为理解 CPython 运行时演化的重要参考。

推荐收录,因为它提供了对 Python 核心运行时演进的结构化梳理,而不是停留在“去掉 GIL”这一结论层面。对于关注解释器实现、并发模型、C 扩展兼容性和语言未来方向的读者,这篇内容有较强的长期参考价值。

技术文章Racket Blog

Rhombus v1.0

这篇文章围绕 Rhombus 1.0 正式发布,系统解释了这门新语言为什么存在、它要解决什么问题,以及它与 Racket 的关系。核心论点是:Rhombus 试图在“对日常开发友好的常规语法”与“像 Racket 一样强的可扩展性/宏系统”之间取得平衡,并进一步补充了类、模式匹配、静态信息、命名空间组织等语言层面的改进。文章还通过 FAQ 和示例程序说明了它的适用场景、性能定位和生态现状,边界是它仍处于较年轻阶段,库生态和成熟度不如主流语言。

推荐收录,因为它不是单纯的版本发布,而是把一门语言的设计目标、语法哲学和可扩展性机制讲得很清楚,对理解编程语言设计、宏系统与语言生态构建都有长期参考价值。对于关注语言实现、DSL、元编程或 Racket 生态的读者,这篇文章能提供可迁移的设计视角和判断框架。

技术文章知乎 - 严格鸽

C++中充满心智负担的内存别名

文章围绕 C++ 中的内存别名与严格别名规则展开,用多个汇编对比例子说明编译器为何会基于类型系统做激进优化,以及这种优化为什么会让看似“合理”的强转代码在 UB 场景下产生反直觉结果。作者进一步比较了 Fortran、Java、Rust 在别名约束上的差异,并结合 `__restrict`、`char`/`uint8_t`、`vector` 内部布局等例子,说明别名问题如何直接影响性能优化、接口设计和工程实践。文章的结论是:别名分析能带来显著性能收益,但在 C++ 中必须严格遵守语言规则,否则优化会把“直觉正确”变成“语义错误”,因此高性能代码需要更谨慎的类型设计和显式约束。

推荐收录,因为它不是泛泛讲“别名会影响优化”,而是通过具体汇编和跨语言对比把编译器推理、UB 边界和性能收益讲清楚了。对写 C++、做底层性能优化或设计高性能数据结构的读者,这篇文章有很强的可迁移价值。

工程实践Jane Street Tech Blog

Using OxCaml to implement type-safe reference counting between OCaml and Python

这篇文章讨论了 Jane Street 如何利用 OxCaml,在 OCaml 与 Python 之间实现类型安全的引用计数与对象共享机制。文章聚焦跨语言互操作中的内存管理、所有权和生命周期约束,核心价值在于把“容易出错的运行时协议”提升为可由类型系统约束的工程方案。它特别适合关注多语言系统、FFI 设计、运行时安全和高可靠工程实践的读者。

推荐收录,因为它不是泛泛介绍 OCaml 或 Python,而是围绕跨语言内存管理这一高风险工程问题给出可复用的方法。文章的价值在于展示如何借助类型系统降低引用计数和对象互操作中的错误概率,对做 FFI、运行时或系统语言工程的人都有参考意义。

技术文章Eli Bendersky

Plugins case study: Pluggy

这篇文章以 Pluggy 为案例,系统拆解了 Python 插件系统的关键机制:hook 的定义与实现、基于 setuptools entry points 的自动发现与注册、hook 调用的结果聚合与顺序控制,以及插件与宿主之间的 API 边界。作者还将 Pluggy 映射到“插件基础设施”的通用概念框架中,讨论它适合解决什么问题、提供了哪些额外能力,以及在何种场景下未必值得引入依赖。

推荐收录,因为文章不仅介绍了一个具体库的用法,还把它放进更通用的插件系统设计问题里分析,具有跨项目迁移价值。对于需要设计可扩展架构、理解 Python 插件生态或评估是否自研插件框架的读者,都很有参考意义。

科研议题Amazon Science

EC2&#8217;s formally verified &#8220;isolation engine&#8221; provides mathematical assurance of virtual-machine isolation

这篇文章介绍了 AWS 将 EC2 的隔离核心拆分为独立的 Nitro Isolation Engine,并用 Isabelle/HOL 对其进行形式化验证,从而为虚拟机隔离提供数学级别的正确性保证。文中重点解释了验证对象的边界、规格与证明的关系,以及如何分别处理功能正确性、内存安全、运行时错误和机密性/完整性等性质;还介绍了 μRust、分离逻辑、最弱前置条件和非干扰等关键方法。文章的价值在于,它不仅展示了一个可落地的商用云形式化验证案例,也清楚说明了这类证明适用的前提、复杂度和局限。

推荐收录,因为它把“形式化验证如何进入商用云基础设施”这件事讲得很完整,既有系统边界设计,也有证明方法和安全性质定义,具有很强的长期参考价值。对做操作系统、云基础设施、安全隔离和程序验证的读者来说,这篇文章能直接提供可迁移的建模与证明思路。

技术文章知乎 - 严格鸽

C++从内存别名到vector为什么都是维护三个指针

文章围绕“为什么主流 C++ std::vector 通常维护三个指针”展开,从严格别名、TBAA、自动向量化失败案例一路分析到 vector 的三指针布局、ABI 约束和 libc++ 的 size-based vector 提案。作者先用一个 `data + size` 结构展示当元素类型与长度字段同型时,编译器可能因别名疑虑而保守重读循环上界,再对比三指针布局为何更利于把 `size()`、`capacity()` 和循环次数提前固化,从而获得更稳定的优化结果。文章还进一步补充了 libc++ hardening、ABI break、非法 reinterpret_cast 暴露问题以及与 LLVM RFC 的关系,说明三指针并非唯一原因,但确实兼顾了优化、接口语义和历史实现路径。

推荐收录,因为文章把一个看似“vector 实现细节”的问题,拆解成了别名分析、对象布局、自动向量化、ABI 和库演进等多个层面,能长期帮助读者理解 C++ 容器实现背后的工程逻辑。它不仅给出结论,还展示了何时 `data + size` 会让编译器保守、为何三指针更稳,以及现代库为何会在性能收益和 ABI 兼容之间做取舍。

学习路线知乎 - NGINX洪志道

04-聊聊各主流编程语言还有软件工程

文章围绕“主流编程语言该怎么选”展开,但核心并不是语言排行榜,而是帮助读者建立对语言、运行时和软件工程之间关系的整体认知。作者用 C、JavaScript、PHP、Python、Go、Java、Rust 等语言为例,解释了编译与解释的直观差异、脚本引擎与宿主程序的关系,以及不同语言分别解决的工程问题和代价。文章最后强调:语言只是入门工具,真正决定长期成长的是对系统运行、架构边界、复杂度控制和性能问题的软件工程能力。

推荐收录,因为它不是单纯的语言推荐帖,而是把语言选择、工作场景、长期成长和软件工程素养放在同一框架里讨论,适合刚入行和正在转方向的读者参考。文章对“工作语言”和“个人成长语言”的区分、以及从语法走向运行时和系统理解的路径,具有较强的迁移价值。

技术文章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 证明等价性”的方法具有很强的迁移价值。

技术文章知乎 - 严格鸽

C++学习——std::function 丢弃返回值

文章围绕 C++ 中 `std::function<void(int,int)>` 为什么能够接收一个返回 `bool` 的可调用对象展开,先从标准条文解释“返回类型可调用”的含义,再结合 MSVC 的实现说明 `void` 与非 `void` 的调用路径确实不同。作者进一步分析了为什么 `[[nodiscard]]` 无法阻止这种行为,并给出了基于模板约束和 `std::invoke_result_t` 的写法,用于在转换成 `std::function` 之前就限制目标可调用对象的返回类型必须为 `void`。

推荐收录,因为文章不是简单复述语法,而是把标准语义、库实现和可编译约束串起来,清楚解释了一个常见却容易误解的 C++ 行为。对于需要写接口约束、回调封装或阅读标准库实现的读者,这种分析具有很强的迁移价值。

学习路线知乎 - NGINX洪志道

零基础编程入门

这篇文章是一套面向零基础读者的编程入门课程设计,主张先用 Chrome Console 和 JavaScript 建立“代码会执行”的直觉,再围绕一个手机电量模拟案例,按顺序讲解语句、条件、循环、变量、表达式和函数六个最基础概念。作者特别强调以实践驱动学习:先跑代码、再改参数、再回看结果,并把“能自己写出类似小程序”作为真正学会的标准,而不是停留在概念背诵。

推荐收录,因为它不是泛泛谈“如何学编程”,而是给出了清晰的入门顺序、最小工具链和可执行的练习方法,适合真正从零开始的人建立第一层编程感知。它的可迁移价值在于把“先跑起来、再理解”的方法论抽象得很清楚,对其他语言和初学课程设计也有参考意义。

技术文章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/动态语言场景中的实现权衡,对编译器和运行时开发者都有长期参考价值。

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

std::networking最新动向:依然是源自asio的协程原生I/O

这篇文章系统梳理了 C++ 标准网络库 std::networking 的最新提案方向,核心观点是:网络 I/O 更适合直接建立在 C++20 协程之上,而不是继续沿用 sender/receiver 的 std::execution 抽象。作者从性能开销、复合结果处理、编译时间、ABI 稳定性、学习曲线和生产部署等多个维度对比了两类方案,并详细解释了 IoAwaitable、io_env、Executor、any_stream 等设计如何继承并简化 Asio 的成熟思路。

推荐收录,因为文章不只是转述标准化动态,而是把 C++ 网络编程的关键设计分歧、工程权衡和迁移路径讲得非常完整,适合作为理解标准库网络化方向的长期参考。它对正在使用 Asio、关注 C++ 协程或评估异步 I/O 架构的读者都有直接迁移价值。

工具笔记matklad

Steering Zig Fmt

文章围绕 Zig 的代码格式化工具 zig fmt,分享了两条实用经验:一是可以通过尾随逗号等语法细节“引导”格式化结果,而不是完全依赖格式化器猜测作者意图;二是数组字面量的首个换行位置会影响列式排版,从而可以控制每行容纳多少元素。作者进一步说明,这种可控的格式化方式适合在保持统一风格的同时保留少量人为布局选择,尤其适用于参数列表、命令行 argv 构造等场景。文章也隐含了一个更广泛的观点:优秀的格式化器设计不应只追求唯一答案,而应允许语法信号参与布局决策。

推荐收录,因为它不是单纯的工具使用小技巧,而是揭示了格式化器如何与代码结构协同工作的设计思路。对 Zig 使用者、编程语言工具链开发者以及代码格式化器实现者都有可迁移价值。

技术文章matklad

Minimal Viable Zig Error Contexts

文章围绕 Zig 的错误处理机制,讨论如何在保留强类型错误码和简洁控制流的前提下,为失败路径添加足够的上下文信息。作者对比了显式 diagnostics sink、逐处 catch 打日志和基于 errdefer 的“最小可行错误上下文”三种方式,指出后者在脚本式代码中摩擦更低,但也会带来“错误被处理却先被记录”的副作用。文章进一步抽象出一个更一般的原则:正常路径负责累积上下文,错误发生时再把当前上下文物化出来,并追问这种风格需要怎样的语言特性支持。文章适合关注编程语言设计、错误处理模式和 API 可用性权衡的读者参考。

推荐收录,因为它不是单纯介绍 Zig 语法,而是在分析一种可迁移的错误上下文设计思路,并明确讨论了可用性、可读性和误报风险之间的权衡。对语言设计、库 API 设计以及需要处理失败路径的工程代码都具有参考价值。

技术文章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 不会带来性能损失”。适合关注编程语言实现、虚拟机设计和编译优化的读者,具有较强的可迁移分析价值。

技术文章matklad

256 Lines or Less: Test Case Minimization

这篇文章用 Zig 实现了一个仅约 256 行的极简属性测试与模糊测试库,核心抽象不是常规 PRNG,而是“有限随机数生成器”FRNG:它预先接收一段固定熵字节流,并在熵耗尽时返回 OutOfEntropy。作者先在此基础上封装了 bytes、array、int、boolean、int_inclusive、range_inclusive、index 等生成器,再用 weighted 和 swarm_weights 组合出随机动作调度器,用于驱动一个模拟世界持续随机执行请求、消息和崩溃等操作。文章的关键观点是:测试复杂度可以由“消耗了多少随机熵”来度量,因此可以对已知失败样本按熵长度做二分搜索式缩小,找到更短、仍能触发失败的最小输入。为了处理断言崩溃无法在进程内捕获的问题,作者把被测程序作为独立进程,从 stdin 读取熵并以退出码判定成败,再用外部 driver 通过 seed+size 复现实验并搜索最小失败样本。文章强调这种方法不依赖对被测系统注入额外搜索知识,迁移性强,但也依赖测试能够稳定地以“随机输入 + 失败/成功”二值反馈来定义问题边界。

文章直接给出了可运行的 Zig 实现,展示了如何把属性测试、模糊测试和最小化失败样本统一到“有限熵”模型中,而不是停留在概念介绍。适合需要做 fuzzing、回归最小化、可复现实验或语言运行时/测试工具设计的读者参考,迁移价值在于方法本身与具体系统弱耦合。

技术文章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 依赖当前优化模型,不能直接套到会改变分配语义的场景。

工具笔记Go Blog

Using go fix to modernize Go code

本文介绍 Go 1.26 中重写后的 go fix:它可按包模式批量应用现代化修复,支持 -diff 预览、按分析器选择性启用,并会跳过生成文件与不匹配的构建配置。作者用 minmax、rangeint、stringscut 和 newexpr 等例子说明,go fix 不只是修 bug,更是在把旧写法迁移到更新的语言/标准库习惯上,甚至能跨包替换“new-like”辅助函数。文章进一步解释了 go vet 与 go fix 统一到 Go analysis framework 后的架构:分析器、驱动、事实传递、gopls/staticcheck 等复用同一套基础设施。它也强调多次运行可产生协同修复,但仍可能出现语义冲突、未使用变量或需要手工处理的边界。最后提出“self-service”静态分析设想,希望未来能让第三方 API 和组织规则也像标准库现代化一样自动推广。

推荐收录,因为文章直接给出了 go fix 的使用方式、分析器机制和典型修复案例,证据充分且不是产品宣传。适合 Go 开发者、工具链维护者和静态分析作者阅读,其中关于批量重构、安全修复与分析框架复用的经验具有较强迁移价值。

技术文章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 和语言运行时优化的参考,尤其对需要在精度与分析成本之间取舍的读者很有迁移价值。

技术文章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 调试基础设施的实用材料。适合做运行时、调试器或语言实现相关工作的读者参考,尤其能迁移到符号注册、代码生命周期管理和可观测性设计中。

工具笔记Go Blog

Flight Recorder in Go 1.25

文章介绍了 Go 1.25 新增的 flight recorder:它基于执行 trace,但不再把全量数据写到文件或 socket,而是将最近几秒的 trace 缓存在内存中,等程序检测到故障时再一次性导出。作者给出 `MinAge`、`MaxBytes`、`Start/Stop` 与 `WriteTo` 的使用方式,并说明该机制特别适合长时间运行的 Web 服务。文中以一个 HTTP “猜数字”服务为例,展示如何在请求耗时超过 100ms 时触发快照,再用 `go tool trace` 查看时间线和 flow event。最终定位到 `sendReport` 中 `defer Unlock` 让锁持有时间被意外拉长,导致偶发长尾延迟。文章也明确了适用边界:它不是全量追踪方案,仍需合理控制内存预算和触发条件。

文中直接给出 flight recorder 的 API、配置参数、快照导出和 trace 分析流程,并用真实并发性能问题证明其定位价值。适合维护 Go 长运行服务、排查线上延迟和锁竞争的工程师,迁移价值在于“先留最近窗口、再按异常触发取证”的诊断思路。

技术文章fasterthanli.me

Catching up with async Rust

文章围绕 Rust 中 async fn in traits 的稳定化,回顾了 free function 和 impl 方法里的 async 早已成熟,但 trait 里长期缺位所造成的生态断层。作者解释了这一特性背后的关键难点,包括异步函数返回值难以直接命名、trait object 的对象安全限制,以及编译器如何把 async 代码降解为状态机。文章还对比了过去常见的 async_trait 宏方案与原生语法的差异,指出原生支持能减少样板代码、提升可读性,但并没有彻底消除 dyn 兼容、泛型边界和性能理解上的复杂性。整体上,它更像是一篇帮助读者跟上 async Rust 现状与迁移边界的技术梳理,而不是入门教程。

收录,因为文章直接围绕 async fn in traits 的稳定化展开,并明确讨论了状态机降解、对象安全和宏替代方案等关键技术证据,而非单纯功能播报。适合已在使用 Rust async 的读者,以及需要判断新特性迁移边界、理解原生语法与 async_trait 差异的工程场景。

工程实践Datadog Engineering

How we migrated our static analyzer from Java to Rust

文章介绍 Datadog 团队将静态分析器从 Java 迁移到 Rust 的工程过程,核心目标是提升吞吐并降低内存占用。作者围绕旧实现的性能瓶颈、迁移后的实现方式,以及如何保持分析语义一致展开说明,属于一次以性能和资源效率为导向的重写。文中给出的结果很明确:迁移后性能提升约 3 倍,内存使用下降约 10 倍。它展示了在计算密集型开发工具场景中,语言迁移如何换取更好的成本曲线,但也意味着需要承担重写、验证和生态适配的代价。

收录依据很直接:标题和摘要都给出了从 Java 迁到 Rust 的具体改造目标,以及 3 倍性能、10 倍内存下降的量化结果。适合做静态分析器、代码扫描或其他性能敏感开发工具的架构参考,但读者也要注意迁移成本、语义一致性验证和语言生态差异。

技术文章Josh W Comeau

The “const” Deception

文章围绕 JavaScript 中 `const` 的常见误解展开,指出它并不等于“值不可变”,真正限制的是变量绑定不能被重新赋值。作者重点区分了“assignment(重新赋值)”和“mutation(修改对象内容)”,解释为什么用 `const` 声明的对象和数组仍然可以被修改。文中通过具体示例说明,原始值与引用类型在行为上的差异,以及开发者为何会误把“不可重新指向”理解成“完全冻结”。文章的核心结论是:`const` 适合表达不变的绑定意图,但并不能替代不可变数据结构或深冻结机制。适合已经写 JavaScript、需要减少状态管理和数据共享误解的前端/全栈开发者参考。

推荐收录,因为它直接针对 JavaScript 中最容易被误用的基础概念,且用“赋值 vs 修改”这一可迁移框架解释了 `const` 的真实语义。对前端、全栈和状态管理场景尤其有用,能帮助读者避免把语法约束误当成数据不可变,降低代码理解和维护风险。