关于 Partial Evaluation 的第一章 Introduction 的笔记.

从抽象上来看, 程序都可以看作是一个输入到输出的函数. 比如说某个程序输入可以拆分为 in1in2, 如果该程序的输入 in1 是可以在运行之前确定的, 那么我们就可以生成一个针对 in1 优化的程序, 这个过程就叫做 specialization(特化). 针对 in1 优化的"优化器"可以叫做 specializer. 所以 Partial Evaluation 可以看作做了两件事情:

  1. 计算可以预先知道的输入
  2. 为提前知道的输入进行特化, 生成一个针对预先输入优化的程序

二村映射

我们通过一个解释器程序来举例子, 一个解释器可以通过下图描述:

           +--------+
P      --> | interp | --> out
input  --> |        |
           +--------+

对于这个 interpreter, 如果有一个可以针对解释器的源程序输入 P 的 specializer, 那么我们可以通过在解释器上 specialize 得到一个可执行程序. 用图画出来就是这样, 下图中的 PE 就是我们的 specializer, interpP 就是一个可执行程序.

图 1:

           +----+
interp --> | PE | --> interpP
     P --> |    |
           +----+

这个时候我们可以看到, 这个 specialzer 本身也是多参数的函数, 如果我们已经有了一个 specialzer, 如果再把这个 specializer 对 interp 参数进行 specialization, 我们就可以得到一个编译器(下图中的 PEinterp).

图 2:

           +----+
PE     --> | PE | --> PEinterp
interp --> |    |
           +----+

这里的 PE 又是一个多参数的函数, 我们又可以对其进行 Specialization. 如果有一个 specialzer, 可以让 PE 对 PE 进行进行 Specialization, 那么就可以得到一个编译器的生成器(图中的 PE_PE).

        +----+
PE  --> | PE | --> PE_PE
PE  --> |    |
        +----+

这里的每个 PE 的输入都是两个程序, 其中一个程序 in1 是另外一个程序 in2 的输入; PE 的功能都是为 in2 生成一个特化在 in1 的版本, 这个特化的版本往往会比 in1 |> in2 更加高效.

二村映射就是指的以上的几个程序特化的过程,

上面的 specialize 的过程有时候也叫 stage: 通过 specialize 把原来的程序分成了好几步.

Partial Evaluation 和 Partial Application(柯里化)

Partial Evaluation 和编程语言中的 Partial Application(柯里化)还是很不一样的 在 Partial Application 中, 得到的是相同语言中的函数; 而 partial evaluation 中, 得到的是一个 新的程序. 这里就体现了一个 program text 和 running program 的区别: program text 是一个 syntactic world 里的东西, 比如说符号, 表达式, 只是程序的 表示; function 是数学意义(语义)上的东西, 需要把 program text 传给语义函数后(通俗的说就是要把程序运行起来)才能把 program text 和 function 关联起来. 所以 partial evaluation 和 柯里化 时的 partial application 并不是一回事.

感谢 kokic 为本文找到的 typo!