Plaza 新闻汇总

进入 CPS,永不返回

本文介绍了 Continuation-Passing Style (CPS) 以及如何将其应用于 Scheme 语言的编译。

CPS 是一种程序的中间表示形式,特别适用于函数式编程语言,例如 SML 和 Scheme。它遵循两个规则:第一,函数/操作符的参数必须是简单的;第二,函数调用不返回。

文章通过构建一个简单的 CPS 变换开始介绍 CPS,这个变换来自一个小型 Scheme 类语言。接下来,文章概述了 IR 的一些优化,然后探讨了编译 IR 以供执行的几种常见方法。

**Mini-Scheme**

文中定义了一个简单的 Scheme 类语言,包括整数、算术运算、变量绑定、函数定义、函数调用和条件分支等。

**CPS 变换**

文章逐步实现了 CPS 变换函数 `cps`,该函数接收两个参数:表达式 `exp` 和延续 `k`。延续是一个函数,用于接收表达式的返回值并继续执行。

文章详细讲解了如何将不同类型的表达式转换为 CPS,包括整数、变量、函数调用、操作符、Lambda 表达式和 If 表达式。其中,函数调用和操作符的转换需要递归地编译子表达式并生成新的延续。

**元延续**

元延续可以避免生成一些不必要的延续,从而减少生成的代码量。

**优化**

文章简要介绍了一些常见的 CPS 优化,例如常量折叠和 Beta 归约。

**代码生成**

文章讨论了将 CPS 转换为可执行代码的几种方法,包括生成 C 代码、使用弹跳板、One Big Switch 方法等。

**总结**

文章总结了 CPS 变换、优化和代码生成的过程,并提供了一些相关的参考文献。

**致谢**

文章最后感谢了 Vaibhav Sagar、Kartik Agaram 和 Olin Shivers 对本文的贡献。

**附录**

文章还附录了一些相关的参考文献,包含了 CPS 变换、优化和编译相关的论文和资料。

原文地址
2024-12-25 21:31:15