3.1 引言(Introduction)
在第一章和第二章我们分别给大家介绍了编程的两大主角:函数与数据。我们了解了在高阶函数里,函数是如何作为数据被传递。通过面向对象编程,我们知道了数据除了本身代表的信息之外是如何携带一些操作行为信息的。我们学到了很多编写大型程序的技巧,例如:函数抽象、数据抽象、类继承、泛型函数等。诸如这些核心概念让程序变得模块化,带来了更强稳定性以及可拓展性。
在这一章节,我们会仔细介绍编程主角团的第三个人物:程序本身。一个python程序就是一连串的英文代码。只有在编译器的帮助下,这写代码才能发挥作用,他决定了如何表达式求值的结果以及语句该执行什么操作。但是:编译器本身也是一个程序,这是变成的基本思想之一。所以,用python写一个编译器不是不可能的事。
想要意识到这一点,我们必须把思考角度从编程语言的使用者转变到编程语言的创造者当中。
3.1.1 编程语言(Programming Languages)
因为语法结构,特点以及应用领域的不同,编程语言各有千秋。但是函数的定义和使用遍布几乎所有编程语言。当然,也存在着一些没有面对对象系统,没有高阶函数,没有控制语句甚至没有赋值语句,但也十分强大的编程语言。比如 Scheme。
在这一章节我们会了解编译器是如何让一串串英文代码发挥作用,以及学习如何设计一个编译器。编译器,我们要设计一个决定了所有表达式和语句的程序, 听起来是一个十分困难的任务哈?不用担心,大部分编译器结构其实很简单,由两个递归函数组成。一、用来计算表达式的值。二、用来调用函数。
这两个表达式是相互递归的,因为有时候我们计算表达式时需要调用函数,而调用函数时需要计算表达式。