文章
这里收录了我发布的全部文章。
-
Go 工具链:Buf 如何替代 protoc 工作流
Buf 用一个 CLI 统一了 protobuf 的构建、lint、breaking change 检测、代码生成、格式化和依赖管理。它替代的不是 protobuf 本身,而是 protoc + 手动管理插件 + Makefile/shell 脚本的传统工作流。核心价值:buf.yaml 定义模块和规则,buf.gen.yaml 定义代码生成,buf generate 一个命令完成所有事。
-
现代 C++(五):内存模型、atomic、thread 与 future
C++11 之前没有语言级内存模型,多线程代码在编译器 + CPU 双重乱序下不可能正确(Hans Boehm 2005 论文证明)。C++11 一次性引入内存模型、std::atomic、std::thread、std::future 四件套,给了 C++ 官方并发语义。六种 memory order 是理解的核心——在 x86 上 release/acquire 几乎免费、seq_cst 要 mfence,在 ARM 上差距更大,这正是暴露细粒度 order 的意义。
-
现代 C++(四):模板元编程从 SFINAE 到 Concepts
C++ 模板元编程(TMP)的本质是把编译器当成纯函数式解释器:类型是值、模板是函数、偏特化是模式匹配。SFINAE 是语言规则的副作用被滥用成约束机制的历史遗留,C++17 if constexpr + C++20 Concepts 把"编译期分支"和"约束表达"从巫术升级为一等公民,错误信息从 200 行模板栈变成一行说明。业务代码 95% 用不到深度 TMP,但读标准库和调试模板错误必须看得懂。
-
Go 基础:正则表达式、自动机与 regexp 的线性时间保证
正则表达式的核心分歧在引擎实现:backtracking 引擎(PCRE/Java/Python/JS)用递归回溯,最坏指数时间,存在 ReDoS 风险;automata-based 引擎(RE2/Go regexp)用 NFA/DFA 模拟,保证线性时间,但牺牲了 backreference 和 lookaround。Go 的 regexp 包基于 RE2,选择了安全和可预测性,代价是表达力略弱。理解引擎原理比记语法重要得多。