主要观点:
- 介绍 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 转换方法及在处理函数拆分等方面的具体操作。
- 提及性能方面的情况及对功能的考虑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。