零成本“无标签终结”在 Rust 中使用 GADT 风格的枚举

主要观点:在函数式编程中,“Tagless Final”模式是创建嵌入式领域特定语言(DSL)的良好抽象,Rust 作为系统语言需能采用此类高级抽象且不牺牲零成本性能,本文探索在 Rust 中实现该模式的“tagless initial”变体。
关键信息

  • “Tagless Initial”编码用 GADT 表示表达式,如在 Haskell 中的示例。
  • Rust 中通过特定函数构建复杂表达式并编译后,其表达式树等被优化为一系列算术指令,实现“零成本”。
  • 评估逻辑在Eval trait 中,通过match语句递归调用eval,关键在于GadtEnum类型的定义。
  • 核心技术是使用never类型的enum,确保在给定类型签名下只有一个变体可构造,编译器可在编译时确定使用的变体,实现零成本优化。
  • CursorAttic特质作为类型级配置系统,协同工作控制Gadt的构造和模式匹配。
  • 实验证明never类型是实现无标签和编译器优化的关键组件,简单的#[inline(always)]并非可靠解决方案。
    重要细节
  • Rust 中Gadt的定义及各构造函数的实现,如int_constlambdaapplyadd等。
  • Eval trait 中eval函数的具体匹配逻辑。
  • Enum类型中各变体的定义及与never类型的结合方式。
  • AtticCursor特质中各种类型关联的默认设置及作用。
  • 实验中改变Attic特质导致编译器行为变化及生成的不同汇编代码。
阅读 12
0 条评论