hoot 中的 cps — wingolog

主要观点:

  • 介绍 Hoot Scheme-to-Wasm 编译器使用延续传递风格(CPS)转换,讨论其在实现推送调用(push calls)方面的问题及不同策略。
  • 阐述了通用切片、仪器化切片和 CPS 转换三种实现策略的特点及优缺点。
  • 说明 Hoot 采用 CPS 转换并结合栈分配返回闭包的方法,以及在处理函数拆分、变量保存、调用约定等方面的细节。
  • 探讨了 CPS 转换在性能方面的影响,认为对于功能而言性能是可接受的。

关键信息:

  • Hoot 是 Guile 的一种实现,Scheme 是 Lisp 的一种,具有“适当的尾调用”。
  • WebAssembly 原生支持尾调用,但 Hoot 的问题是如何实现推送调用。
  • 通用切片方案依赖平台提供通用的栈捕获原语,JS Promise Integration 提案可接近此目标,但存在局限性。
  • 仪器化切片通过在目标机器(WebAssembly)上转换函数来实现推送调用,需解决恢复帧等问题。
  • CPS 转换将程序转换为通过尾调用其“延续”来“返回”的形式,Hoot 采用此方法并进行了一些改进。
  • 在 Hoot 的 CPS 转换中,存在函数拆分、变量保存、调用约定等细节问题,需进行流分析等处理。

重要细节:

  • 定义函数 f 展示推送调用和尾调用的区别。
  • 解释 Guile 管理自己的栈以实现推送调用递归和其他功能。
  • 说明大多数 WebAssembly 实现中函数调用的递归深度有限。
  • 介绍三种实现策略的具体内容和问题。
  • 详细说明 Hoot 的 CPS 转换方法及在处理函数拆分等方面的具体操作。
  • 提及性能方面的情况及对功能的考虑。
阅读 9
0 条评论