本书侧重于从抽象机器介绍编程语言, 愚以为某些内容尚待打磨, 并非易读. 本书分为三个部分, 第一部分介绍了操作语义和抽象机器, 第二部分引入了表达操作语义的工具PLT Redex, 第三部分呈现了PLT Redex的一些实际应用.
描述编程语言自句法始. 正如每个程序员所知, 语言的句法总以BNF (Backus-Naur Form) 语法的某种变体形式出现, 其枚举了符合语法的词汇和句子. 困难之处实际上在于刻画程序的意义, 即程序是如何进行计算的.
在这本书的第一部分, 我们建立了一个基于句法的语义描述方法. 我们从这样的观察开始, 即计算 (computation) 是对于算术 (calculation) 的一般化, 一个孩子所接受的算术训练从加等于
这样的材料开始. 诀窍在于看出这种形式的算术也可应用到程序上来.
程序的算术意味着观察一个表达式或者语句的句法, 然后将其与另一个表达式或者语句联系起来, 通常假定是更简单的. 对于表达式而言, 前面的声明是容易理解的. 它等于, 即和关联起来. 即便是函数应用于参数值也可以这种方式表达 [注记: 实际上, 本身即是一个二元函数]:
用数学语言来说, 我们是在以句法上的关系描述编程语言的语义. 对于学习函数式编程语言的人而言, 这种声明并不令人意外. 我们知道函数式编程并不超出将七年级代数转换为编程语言太多, 而代数定律不过就是将代数表达式相互联系起来的等式. 但或许令人惊讶的是, 以这种方法我们可以描述(几乎)所有编程语言的语义, 即便是那些含有命令式副作用的语言.
现在我们将引入我们的想法, 即必要的数学元知识, 从将句法定义为集合开始.
BNF语法可有多种用途. 一种含义是字符串的集合. 另一种解释是树
的集合, 其常被称为抽象句法(树). 本书我们总是指后者.
对于本章和下一章而言, 我们使用下面的BNF语法作为一个实际例子:我们将其当作以下施加于抽象句法树集合上的约束的缩写:从技术上说, 是满足以上约束的最小集合. 为了构造这个集合, 我们先包括基本元素和, 然后归纳性地将其组合为复合元素.
记号: 我们有时用表示集合
, 但是有时又表示的任意一个元素
. 从上下文来看, 意义总是明确的. 有时我们将下标或者撇号附到集合的名字上以表示该集合的任意元素, 例如或者. 因此, 以上约束也可以写成在有限的空间之中枚举出的所有元素显然是不可能的:然而, 给定某个树, 我们可以通过表明其满足约束而论证其的确属于. 例如, 就在中:通常这样的论证也可以安排成所谓的证明树的形式:
演算的表达式的一般语法定义如下:以下是的示例成员:第一个例子, 即, 没有特定的直觉性意义, 因为还未被定义. 类似地, 的意义是应用于
, 但是我们没有更多可说的了. 与之形成对比的是, 例子与恒等函数相对应. 这个例子和前两个例子的不同之处在于在前两个表达式里都是自由出现的, 而在后面的例子里是绑定出现的.
1950年代末期和1960年代早期, 人们发现了编程语言和演算的诸多方面之间的联系. 其动机从想要刻画Algol 60的语义演变为藉由已经充分理解了的数学系统来理解编程语言的面貌. 也就是说, 人们想要学会如何系统地设计编程语言.