编程语言的本质前言,翻译

这本书带给你面对面的体验,关于计算机编程世界的基础思想:
“程序设计语言的解释器不过是另外一个程序”。
听起来好像是一件很显而易见的事情,是吗?但是它的含义却又是非常深远的。如果你是计算机领域的理论研究人员,解释器的思想实际上要往回追溯到哥德尔发现的关于形式化逻辑系统的局限性(哥德尔不完备定理),图灵通用机器(图灵机),冯诺依曼可存储机器的基本思想(冯诺依曼机)。如果你是一个程序员,掌握了解释器的思想,它会成为你强大力量的来源。它会颠覆你原有的观念,造成你在思考程序设计时的一些最根本的改变。
在我学习解释器之前,我曾编写过大量的程序,也做过一些很牢靠的程序。例如,其中一个是用PL/I编写的大型数据录入和信息检索系统。当我顺利完成这个系统时,我意识到PL/I是由一群有纷争的编程语言设计人员编写的一系列修修补补的语法规则。我感觉我的系统不是很适应这些规则,从而导致它理解起来十分困难,更别提那本(超级)巨大的参考手册了,最后只从里面选两三个能用的特性来编程。这样的经历让我的脑子出现了一个组织编程语言的基本结构,我本来可能会想到重新组织一下这个语言的设计,但是我从没这样去思考过。我不知道如何创建嵌入式的语言帮助我自己的开发,所以这个完整的程序看起来是一个又庞大,又复杂的镶嵌物,一片套着一片,而不是一系列的语言以便在这些系统的部分间可伸缩地组合起来。如果你不理解解释器,你也会这样写程序,你当然可以是一个称职的编码人员,可遗憾的是,你没办法成为一个大师。
程序员应该学习解释器的原因有三个。
首先,你需要一部分技术,它们属于解释器技术的一部分,可能并不是完整且通用的解释器或者语言,但是解释器的实现实际上是一样的思路。大多数人们使用的灵活又复杂的计算机软件系统,例如计算机绘图工具和信息检索系统,包含某些解释器用来构建交互。这些程序可能包含复杂却独特的操作--渲染屏幕的某些区域,执行数据库查询--但是解释器赋予了你组合这些独特的操作到方便的模式里面的能力。你可以使用一个操作的结果作为另一个操作的输入吗?你可以给一系列的操作命名吗?这些名称是局部的还是全局的呢?你可以参数化一系列的操作,然后把名字交给它的输出吗?等等。无论这些特殊操作如何复杂和突出,它通常都是这类系统的质量得到保证的内部决定因素。在程序中找出这些特定的行为是简单的事情,但是组合起来是很丑陋的;再往回看我那个PL/I数据库系统真的是非常糟糕的组合。
第二,即使程序本身不是作为解释器的一部分,它也拥有一些类似解释器的地方。观察计算机辅助设计系统,你会发现几何定义语言,几何交互解释器,基于规则的控制解释器,还有一个面向对象的语言解释器在工作。设计复杂程序最强大的方法就是一系列语言的组合,每一种语言提供了一种关注点,用到这些编程元素不同的工作方式。把合适的编程语言用于对应的目的,理解到使用每种语言的权衡利弊:这就是解释器需要研究的地方。
第三个原因则是为了了解解释器是一种直接关系到编程语言结构的编程技术,它正在变得越来越重要。现在的软件工程化,设计和组织里面,面向对象是这样一种趋势的例子。不可避免的,我们的软件会越来越复杂--直接从语言层面考虑问题也许会是一个比较好的处理复杂性的办法。再次考虑最基本的问题:解释器本身也只是一个程序。但是这个程序是用某些语言编写而成的,解释器的解释器又是另外一些语言编写而成...也许在程序和程序语言之间的距离是一种遐想,未来的程序可能并不是某种语言编写而成的应用程序,而是为了某一个新的应用程序创建一门新的编程语言。
Friedman和Wand已经做出了里程碑的工作,他们的书会改变编程语言课程的面貌。他们不只是告诉你解释器是什么样;他们将它展示给你看。本书的核心是一次编程语言界的旅行,从一个高度抽象的语言,逐渐深入到语言内部的特性直到状态机。你毫无疑问可以运行这些代码,研究它,修改它,然后改变某些解释器的句柄和作用域,控制流等等。
在使用解释器学习语言的执行机制之后,作者会展示如何将相同的想法用于分析程序而无需运行。在接下来的两章里,它们展示了如何实现类型检查和推导,以及这些功能如何与现代的面向对象语言交互。
这种方法之所以吸引人的部分原因在于,作者选择了一个很好的工具--scheme语言,它结合了lisp的词法作用域,垃圾回收和数据抽象功能,还有algol的块结构。但是强大的工具还得要在大师的手上。本书中的实例解释器是杰出的模型。当然,由于它们是可运行的模型,因此我确信考量这些解释器,研究的人会发现自己站在未来几年许多编程系统的核心层面。
这不是一本轻松的书,掌握解释器并不容易,这是有充分理由的。与普通的应用程序员相比,语言设计者是站在高于用户的层次看待问题。在设计应用程序的时候,你要考虑人们可能想要实现的各种功能以及实现方式,他们可能会使用它们。你的语言应该是静态的,还是动态的,还是混合?需要继承吗?它的参数是引用传递还是值传递?续延应该是明确的还是隐式的?这完全取决于你期望使用语言的方式,各个功能应该是易于编写的,并且还能够承载更复杂的任务。
另外,解释器的确是很微妙的程序。简单的更改内部的代码会使得你的解释器行为产生巨大的差异。不要以为你可以轻松看懂并且预测这些程序,世界上很少有人可以看一看新的解释器就能知道它将会发生什么,即使在很简单的程序上。所以学习这些程序最好的办法就是运行它们,这些代码是有效的,尝试解释一些简单的表达式,然后是更加复杂的表达式。添加错误消息,修改解释器,尝试设计自己的变体,试着真正掌握这些程序,不只是对它们的工作模棱两可。
如果这样做,您将改变对编程的看法以及对自己作为程序员的看法。 您会发现自己是语言的设计师,而不仅仅是语言的用户,是选择语言组合规则的人,而不仅仅是其他人选择的规则的追随者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354