Skip to content

3.1 引言 ​

INFO

来源:3.1 Introduction

对应:Disc 10、Lab 10

第一章和第二章讲了编程的两大基本要素——函数和数据——之间的密切联系。我们看到了如何用高阶函数把函数当作数据来操作,也看到了如何借助消息传递和对象系统,让数据具备行为。我们还学了组织大型程序的一些技术,比如函数抽象、数据抽象、类继承和泛型函数。这些核心概念,为编写模块化、可维护、可扩展的程序打下了坚实基础。

本章聚焦编程的第三个基本要素:程序本身。Python 程序不过是一堆文本,只有经过解释,我们才能基于这些文本做出有意义的计算。像 Python 这样的编程语言之所以实用,是因为我们可以定义解释器:一个负责 Python 求值和执行过程的程序。毫不夸张地说,这是编程中最基本的思想——解释器决定了编程语言中表达式的含义,而它本身不过是另一个程序。

要领会这一点,就得改变我们对自己的看法。我们要把自己看成语言的设计者,而不只是别人所设计语言的使用者。

3.1.1 编程语言 ​

各种编程语言在语法结构、特性和应用领域上差别很大。在通用编程语言里,函数定义和函数应用这两种构造随处可见。但也有一些强大的语言,不含对象系统、高阶函数、赋值,甚至不含 while 和 for 这样的控制结构。作为「功能极简却依然强大」的例子,我们来介绍 Scheme 编程语言。本书介绍的 Scheme 子集完全不允许可变值。

本章研究解释器的设计,以及它们执行程序时产生的计算过程。为通用编程语言设计一个解释器,听起来可能令人望而生畏。毕竟,解释器是能根据输入执行任何可能计算的程序。但许多解释器都有一个共通而优雅的结构:两个互递归的函数。第一个在环境中求值表达式,第二个把函数施加到参数上。

这两个函数之所以递归,是因为它们相互定义:应用一个函数,需要求值它函数体里的表达式;而求值一个表达式,又可能涉及应用一个或多个函数。

基于 MIT 许可发布