编程语言概要(EOPL)-引言

2 篇文章 0 订阅

编程语言概要(EOPL)-引言

目标

这本书是对编程语言的分析研究。我们的目标是对编程语言的基本概念提供一个深刻的理解。这些基本概念已被证明具有经久不衰的重要性;它们构成了理解编程语言未来发展的基础。

这些基本概念大部分和程序元素的语义或含义相关。这些含义反映了在程序执行时如何解释程序元素。被称为解释器的程序提供了程序语义的最直接、可执行的表达式。它们通过直接分析程序文本的抽象表示来处理程序。因此,我们选择解释器作为主要工具来表达编程语言元素的语义。

关于程序作为对象最有趣的问题是,“它做什么?”对解释器的学习告诉我们这一点。解释器很关键,因为它们揭示了含义的细微差别,并且相对于更高效的编译和其他类型的程序分析而言是比较直接的途径。

解释器也是一类基于语法结构将信息从一种形式转换为另一种形式的系统的例证。例如,编译器将程序转换成适合于硬件或虚拟机解释的形式。虽然一般的编译技术超出了本书的范围,但我们确实开发了几个基本的程序翻译系统。这些反映了典型的编译程序分析形式,如控制转换、变量绑定解析和类型检查。

下面是一些使我们的方法与众不同的策略:

  1. 每一个新概念都是通过一个小的语言来解释的。这些语言通常是累积的:后来的语言可能依赖于早期语言的特性。

  2. 解释器和类型检查器等语言处理器被用来解释给定语言中程序的行为。它们以正式的(明确的和完整的)和可执行的方式表达语言设计决策。

  3. 在适当的时候,我们使用接口和规范来创建数据抽象。这样,我们可以在不改变程序的情况下改变数据表示。我们用它来研究可替代的实现策略。

  4. 我们的语言处理器是在生成简明易懂的语义视图所需的非常高的层次上编写的,同时也是在理解实现策略所需的低得多的层次上编写的。

  5. 我们将展示如何使用简单的代数操作来预测程序的行为并推导它们的属性。然而,一般来说,我们很少使用数学符号,而是更愿意研究构成语言实现的程序的行为。

  6. 文本内容解释了关键概念,而书中的练习探索替代的设计和其他问题。例如,文本内容处理静态绑定,但在练习中讨论动态绑定。练习的一条主线把词法寻址的概念应用在这本书中开发的各种语言上。(原文:One thread of exercises applies the concept of lexical addressing to the various
    languages developed in the book.

我们提供了几种使用不同抽象层次的编程语言视图。我们的解释器经常提供一种非常高级的视角,以一种非常简明的方式表达语言语义,与正式的数学语义相差不远。在另一个极端,我们演示了如何将程序转换为汇编语言的一个非常低级的形式。通过在小范围完成这种转换,我们保持了高层和低层视角之间的清晰联系。

我们对这一版做了显著改动。我们已经囊括了具有所有重要定义的非正式合同(非正式合同)。这具有明确所选抽象的效果。另外,关于模块的章节是全新的。为了使实现更简单,用于第3、4、5、7、8章的源语言假定只能传递一个参数给函数;我们也包含了支持多参数过程的练习。第6章是全新的,因为我们选择了一阶复合连续传递风格(continuation-passing-style)转换而不是关系转换。同样,由于尾形式表达式的性质,我们在这里使用了多参数过程,在对象和类一章中也使用了多参数过程,尽管在这里没有必要这样做。每一章都进行了修改,增加了许多新的练习。

组织结构

前两章为仔细研究编程语言提供了基础。第1章强调归纳数据规范和递归编程之间的联系,并介绍了几个与变量作用域相关的概念。第2章介绍了一个数据类型工具。这导致了对数据抽象的讨论,以及在后续章节中使用的那种表征转换(representational transformation)的示例。

第3章使用这些基础来描述编程语言的行为。它引入解释器作为解释语言运行时行为的机制,并为具有一级过程(first-class procedure)、递归和变量赋值的简单的、词法作用域的语言开发一个解释器。这本书其余部分的大部分材料都是基于这个解释器编写的。这一章最后对一种使用索引代替变量的语言进行了全面的处理,结果就是变量查找可以通过列表引用进行

第4章引入了一个新组件state,它将位置映射到值。它被加入后,我们就可以着眼于关于表征的各种问题。另外,它允许我们去探索按引用调用(call-by-reference),按名称调用(call-by-name)以及按需要调用(call-by-need)参数传递机制。

第5章以连续传递风格(continuation-passing-style)重写我们的基础解释器。因此,运行解释器所需的控制结构从递归转换为迭代。这展示了被解释语言的控制机制,并加强了人们对控制问题的直觉。它也允许我们用trampolining、异常处理以及多线程机制去扩展这个语言。

第6章是前一章的补充。这里我们展示如何把我们熟悉的解释器转换到连续传递风格;在这里,我们将展示如何为更大类别的程序实现这一功能。连续传递风格是强大的编程工具,它允许在几乎任何语言中实现任何顺序控制机制。该算法也是一个抽象指定源到源程序转换的例子。(The algorithm is also an example of an abstractly specified source-to-source program transformation)

第7章把第3章的语言转换为一个类型化语言。首先我们实现一个类型检查器。然后我们展示如何通过基于统一的类型推理算法来推导程序中的类型。

第8章在构建类型化模块时很大程度上依赖于对前一章的理解。模块允许我们去构建和强制约束抽象边界,并且它提供一种新的作用域。

第9章以类为中心介绍了面向对象语言的基本概念。我们首先开发一个高效的运行时架构,它被用作本章第二部分材料的基础,第二部分把第7章类型检查器的想法和第一部分的面向对象语言组合起来,产生一种方便的类型化面向对象的语言。这需要引入新的概念,包括接口、抽象方法和类型转换。

进一步的参考资料(For Further Reading)说明了这本书的每一个想法的来源。这是一个个人概述,让读者有机会访问原始论文中的每个主题,尽管在某些情况下,我们只是选择了一个可访问的来源。

最后,附录B描述了我们我们的SLLGEN解析系统。

各个章节的依赖关系如下图所示。

在这里插入图片描述

使用

本科和研究生课程都使用了这个材料。此外,它还被用于专业程序员的进修教育课程。我们假设有数据结构方面的背景,并具有过程语言(如C、C++或Java)和Scheme、ML、Python或Haskell方面的经验。

练习是文章的重要部分,分散在各处。它们的难度范围很广,从相关材料被理解[*],到需要许多小时的思考和编程工作[***]。其中包含了大量的应用、历史和理论方面的材料。我们建议阅读每一个练习,并给出一些如何解决它的想法。虽然我们用Scheme来编写程序解释和转换系统,但任何同时支持一级过程和赋值(ML、Common Lisp等)的语言都足以完成这些练习。

练习 0.1 [*]
我们经常使用这样的短语:“有些语言具有X属性”。对于每一个这样的短语,找到具有这个属性的一个或多个语言以及没有这个属性的一个或多个语言。你可以从任何关于编程语言的描述性书籍中找到这些信息。

这是一本实践的书:书中讨论的所有内容都可以在典型的大学课程范围内实现。由于函数式编程语言的抽象功能特别适合这类编程,我们可以编写大量的语言处理系统,但它们足够简洁,人们可以通过合理的努力来理解和操作它们。

网站可通过出版商获得,其中包括本书中所有解释器和分析器的完整Scheme代码。代码用PLT Scheme编写。我们选择这个Scheme实现是因为它的模块系统和编程环境为学生提供了实质性的优势。代码在很大程度上是R5RS兼容的,并且应该可以很容易地移植到任何全功能的Scheme实现。

注:正文内容正在翻译,考虑到版权原因,暂不发布到博客中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值