MLIR 与多层次 IR
MLIR 用方言把「一种 IR 走到底」拆成多层次的渐进降级。本文讲解方言与操作的组织方式、渐进式降级的时机与收益、pass pipeline 的调度,以及最终如何衔接 LLVM 后端。
tag
MLIR 用方言把「一种 IR 走到底」拆成多层次的渐进降级。本文讲解方言与操作的组织方式、渐进式降级的时机与收益、pass pipeline 的调度,以及最终如何衔接 LLVM 后端。
同样的源码为什么两次构建出的二进制不同?答案藏在时间戳、绝对路径、哈希表遍历顺序与并行调度里。本文讲解可复现构建的判定标准、不确定性来源、路径与时间消除、构建缓存与增量正确性。
类型推断的本质是解一组约束方程,而类型类与 trait 把这组方程从等式扩展成带实例解析的谓词集合。本文讲解 Hindley-Milner 的扩展、约束生成与合一、trait 解析与关联类型,以及约束错误如何被翻译成人能看懂的信息。
零成本异常把开销从执行路径转移到元数据:正常路径不付代价,抛出时才查表展开。本文讲解表驱动栈展开、两阶段展开、landing pad 与清理代码的生成,以及异常与析构、GC 的交互。
Zig 的标签联合、编译期反射与无 GC 特性,使它成为手写编译器前端的理想语言。本文从零实现一个表达式语言的词法分析器、AST 定义、递归下降解析器与 Pratt 表达式解析,覆盖符号表、语义检查、错误恢复与错误报告,最后接一个树遍历解释器跑通端到端流程。
程序里绝大部分时间花在循环上,因此循环是优化器的主战场。本文讲解循环变换的分类与合法性、依赖距离向量与方向向量、依赖测试与多面体模型,以及向量化真正需要的前置条件。
编译器是把算法变成机器码的最后一道关口。本文系统讲解 HPC 编译器优化:GCC、LLVM/Clang 与 Intel oneAPI 的优化级别与关键选项语义、自动向量化报告与阻塞原因、内联与快速数学的取舍、LTO 跨模块优化、PGO 两阶段闭环、搜索式自动调优,以及一套可复现的调优流程与实测数据。
当目标机器从单个 CPU 核变成 CPU 加加速器的组合,编译器要同时处理两套执行模型与两层内存。本文讲解 offload 指令与编程模型、并行循环到线程层级的映射、显式与统一内存的数据搬运、主机设备异步协同,以及卸载编译器的实现要点。
从 AST 解释器到字节码虚拟机再到 JIT 编译,讲解树遍历解释、内联缓存、热点探测、分层编译与代码缓存的实现原理,对比各执行模型取舍并给出伪代码示例。
深入目标代码生成的关键环节,覆盖指令选择、寄存器分配、栈帧布局与调用约定、指令调度及窥孔优化,讲解图着色分配、活跃变量分析与复杂指令选择,附带伪代码与汇编示例。
系统讲解中间表示上的经典优化技术,覆盖常量折叠与传播、死代码消除、公共子表达式消除、循环不变量外提与强度削减、数据流分析框架以及 SSA 形式下的优化实现,附带伪代码与变换示例。
讲解语义分析如何用符号表与类型系统赋予语法树意义,并介绍中间表示的设计取舍,涵盖作用域链、类型检查与推断、三地址码、控制流图与 SSA 形式,附带 Python 与 C 伪代码示例。
深入语法分析的两大路线:递归下降与 LR 自动机,讲解上下文无关文法、FIRST/FOLLOW 集合、LL 与 LR 冲突消解、Pratt 运算符优先级解析以及抽象语法树的构建与错误恢复,附带可运行的 Python 示例。
编译原理是计算机科学的基石,从正则与 DFA 到语法分析、SSA 中间表示与寄存器分配,构成了理解语言实现与现代运行时(JVM、V8、Rustc)的核心。本专题系统覆盖词法分析器、语法分析与 AST 构建、语义分析与中间表示、中间代码优化、目标代码生成,以及解释器与 JIT 编译,帮助开发者深入理解语言如何被翻译与执行。
从正则表达式到有限自动机,系统讲解词法分析器的手写与自动生成,覆盖 Thompson 构造、子集构造、DFA 状态表、最长匹配规则、跳过分隔符与错误恢复,并给出可运行的 Python 实现与避坑经验。
用 -gcflags='-m=2' 读出每个函数的内联代价与预算(main 的 cost 137 超过预算 80),用 -d=ssa/check_bce/debug=1 定位未消除的边界检查,并用 -S 对比 guarded 与 unguarded 的汇编(32 字节 vs 96 字节),把内联预算定位到 src/cmd/compile/internal/inline/inl.go。
用 GOSSAFUNC 逐列追踪 OpIsInBounds 节点,实测它在 prove pass 之后消失(边界检查被消除),并用 -S 证明 i*2 被强度削减折叠成 ADD R1<<1;把 prove、checkbce、opt 三个 pass 定位到 src/cmd/compile/internal/ssa/ 下的具体函数。
用 GOSSAFUNC=sum 生成 ssa.html,实测一个简单函数要经过 58 个 SSA pass(regalloc 21.0 微秒、prove 12.6 微秒),再把编译阶段定位到 src/cmd/compile/internal/gc/main.go:Main 与 src/cmd/compile/internal/ssa/compile.go:passes,并给出 dump 时机。
系统对比主流量子编程语言与框架:Qiskit(Python/IBM)、Q#(微软/类型安全)、Cirq(Google/NISQ 电路)、PennyLane(可微混合编程)、QASM 中间表示、Quil/QuEST、编译器流水线(AST→IR→电路→硬件)、调试与模拟器、代码可移植性与互操作,帮助选择适合项目的量子开发栈。
把 -gcflags=-m 的每一行拆开读:从 go1.27.0 的 escape 包(escape.go、graph.go、solve.go、leaks.go)看数据流图怎么建、leaks 位图怎么编码、不动点怎么解,并用同一段代码在开/关内联下的不同输出,解释「moved to heap」「escapes to heap」「flow:」三行分别在说什么。