在这个层次结构的最底层是对象语言。对象语言只涉及特定的域,而不涉及对象语言本身(比如它们的文法规则,或其中的其体句子)。如要涉及它们,则要有一种元语言。对于语言的两个层次这一经验,所有学习外国语的人都是很熟悉的。然后,就要有一种元元语言来讨论元语言,以此类推。绪论
——侯世达《哥德尔、埃舍尔、巴赫:集异璧之大成》
求值器决定了一个程序设计语言中各种表达式的意义,而它本身也不过就是另一个程序。事实上,我们几乎可以把任何程序看做是某个语言的求值器。比如在符号代数中,一个多项式系统包含着多项式的算数规则以及底层的实现,一个符号求导系统亦包含着函数求导的规则以及底层的实现(参见我之前的博客《SICP:符号求导、集合表示和Huffman树(Python实现)》)。从这样一种观点看,处理大规模计算机系统的技术,与构造新的程序设计语言的技术有紧密的联系,而计算机科学中一个重要的思想就是如何去构造适当的描述语言。
这里需要提一下,我们求值器的输入是以序对Pair组成的表,也即经过词法分析(lexical analysis)+语法分析(syntactic analysis)后所构建的抽象语法树(abstract syntax tree, AST)。比如对于 Scheme表达式下面是我们所要实现的Scheme语言的语法规范:其对应的表为:复制代码
- (+ (* 3 5) (- 10 6))
事实上由于Scheme程序本身就可视作一棵AST,因此为Scheme程序写用于语法分析的Parser异常简单。我们可以通过Pair对象的.first属性访问其的第一个元素,.rest属性访问其的后续元素。复制代码
- Pair('+', Pair(Pair('*', Pair(3, Pair(5, nil))),
- Pair(Pair('-', Pair(10, Pair(6, nil))), nil)))
事实上,任一求值器都能模拟其他的求值器。这样,有关“原则上说什么可以计算”(忽略掉有关所需时间和空间的实践性问题)的概念就与语言或计算机无关了,它反映的是一个有关可计算性(computability) 的基本概念。这一思想第一次是由图灵以清晰的方式阐述,他在1936年的论文《论可计算数及其在判定性问题上的应用》[2]为理论计算机科学奠定了基础。在这篇论文里,图灵给出了一种简单的计算模型——现在被称为图灵机——并声称,任何“有效过程”都可以描述为这种机器的一个程序(这一论断就是著名的邱奇—图灵论题)。图灵而后实现了一台通用机器,即一台图灵机,其行为就像是所有图灵机程序的求值器。求值器的另一惊人方面,在于它就像是在我们的程序设计语言所操作的数据对象和这个程序设计语言本身之间的一座桥梁。现在设想这个用Python实现的求值程序正在运行,一个用户正在输入表达式并观察所得到的结果。从用户的观点看,他所输入的形如(* x x)的表达式是程序设计语言里的一个表达式,是求值器将要执行的东西。而从求值器的观点看,这一表达式不过是一个表(这里就是三个符号*、x和x的表),它所要做的也就是按照一套定义良好的规则去操作这个表。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |