关于编译器的常见误解

主要观点:

  • 编译器相关存在诸多误解,本文旨在澄清,主要讨论大型、主流、通用编译器如 LLVM、GCC 和 ICX。
  • 优化不能得到最优程序,编译器旨在改进而非最优,运行时间优化无最优子结构等。
  • 现代编译器中条件分支可有权重,用于编译器内部预测,x86 架构下编译器不为 CPU 分支预测生成提示,Redwood Cove 架构除外。
  • -O3 与 -O2 在代码速度上不一定有很大差异,需经测试确定。
  • Javascript 解释器在运行时 JIT 是因为需知道运行时类型。
  • 有编译器不意味着不需要解释器,如 WebAssembly 生态中先有 JIT 编译器后有解释器。
  • 中间端并非目标/平台独立,LLVM 也不例外。
  • 编译器通常不为数据局部性优化,如 C++编译器不优化缓存局部性。
  • -O0 并非一定能快速编译,不同编译器和项目情况不同。
  • C++模板编译不一定慢,Dlang 标准库编译速度较快。
  • 单独编译不一定总是值得,对于许多项目,整体构建可能更好。
  • 链接时优化(LTO)在链接时进行是因为 C++构建系统的现实问题。
  • 内联主要作用是启用其他优化,而非仅消除调用指令。
  • inline 关键字与内联优化有关,但影响相对较小。
  • 学习编译器可从 Go 编译器等入手,LLVM 虽教育意义大但较复杂。
  • 未定义行为不仅能启用优化,也可能禁用优化。
  • 编译器不能简单定义未定义行为,虽有性能影响但情况复杂。
  • 代码生成的 99%正确率不可接受,LLM 目前用于代码生成速度较慢。

关键信息:

  • 介绍了各种编译器相关概念及常见误解,如优化目标、分支权重、不同优化级别代码速度等。
  • 以多个具体例子和实验结果说明各观点,如 LLVM IR 代码示例、不同编译器编译时间对比等。
  • 提及多个相关研究和工具,如 goSLP、Polly 等。

重要细节:

  • 不同架构下编译器行为差异,如 x86 与 Redwood Cove。
  • 各编译器在不同优化级别下的表现,如 GCC 和 Clang 的 -O2、-O3 差异。
  • 各种编译器相关特性的实现细节,如 inline 关键字在 LLVM 中的作用等。
阅读 14
0 条评论