首页/文档/编译器内部原理

编译器内部原理

进阶:MIR、经过验证的 KIR 与优化。

本页面向想了解 CK 编译器内部工作方式的读者。写第一个程序、学习变量和控制流程时不需要了解这些内容。

从 .ck 文件到运行结果#

编译器先读懂源代码、检查类型,再把程序整理为内部表示,最后生成所选目标需要的内容:

.ck 源码
  → 读取并检查代码
  → 整理为编译器内部表示
  → 验证并进行优化
  → 生成 Native、C 或 WebAssembly 输出

“内部表示”是编译器用来理解和改写程序的另一种形式。CK 主要有语义 MIR 和 KIR 两种表示;MIR 保留程序原有的运算顺序,KIR 会记录显式检查、内存效果和供后续优化使用的已验证信息。

ckc emit-mir kernel.ck
ckc emit-kir kernel.ck --print-facts --explain-optimization

这些命令会显示编译器的中间步骤,主要用于学习、调试和研究性能,不是日常写 CK 的必要步骤。

优化级别#

优化是编译器在不改变 CK 程序可观察结果的前提下,尝试让生成代码运行得更快或更小。O0 到 O3 表示逐步启用更多优化工作:

  • O0:构造并验证内部表示,不运行可选优化。
  • O1:简化控制流程,传播已知的简单数值。
  • O2:增加函数内联和内存相关优化。
  • O3:增加受约束的专门化、循环优化、展开及部分 Native 向量化。

变换若需要安全条件证明,编译器会在当前 KIR 上验证条件。只有完整通过验证的结果才会替代原状态;条件无法证明时,编译器会保留保守的代码。

程序运行数据和正确性#

PGO(profile-guided optimization,基于程序运行记录的优化)可以用实际工作负载来帮助编译器判断哪些优化更有收益。但运行记录不能证明内存访问或算术改写是安全的;正确性仍由程序规则及已验证的条件保证。有关如何采集和使用记录,见进阶:PGO 与 CPU 变体。

实现架构见编译器架构,全部优化规则见优化器参考。

链接到仓库的完整参考文档以 main 分支为准,可能包含尚未进入最新下载版本的功能。

↵ 打开 · esc 关闭