http:outmyth.blogdriver.comoutmyth1122212.html【原书名】ProgrammingLanguagePragmatics【原出版
http://outmyth.blogdriver.com/outmyth/1122212.html
【原书名】 Programming Language Pragmatics
【原出版社】 Morgan Kaufmann
【作者】 Michael L.Scott
【译者】 裘宗燕
【出版社】 电子工业出版社
http://www.china-pub.com/computers/common/info.asp?id=22979
【参考资料】
作者主页:
http://www.cs.rochester.edu/u/scott/
http://www.cs.rochester.edu/u/scott/pragmatics/adopters.html
On-line Resources:
http://www.cs.rochester.edu/u/scott/pragmatics/
原书图片资源下载:
http://www.cs.rochester.edu/u/scott/pragmatics/figures/
勘误表:
http://www.is.pku.edu.cn/~qzy/books/pragmatics/errata.htm
【评论】
创新性地将程序设计语言的设计与实现和编译器设计有机结合的实用教本。国外大受好评的程序设计语言教本,被全球上百所大学、学院列为标准教材和首席参考
书目 !这是一本很有特色的计算机程序设计方面的教材,它的核心是讨论程序设计语言如何工作的问题,它是程序设计语言和编译的传统教科书的混合,再加上一
些有关汇编层体系结构的材料,或以满足那些没有学过计算机组织的学生和需要。它不是综述性语言的教科书,没有列举不同语言的细节,而集中通过各种语言的
例子阐释其基础概念。本书也没有解释如何构造一个编译器,只是解释编译器如何工作,它对源程序做了什么,以及为什么要那样做。 本书在美国使用已有十余年
,用于讲授一门名为“软件系统”的课程,适合高年级的本科生和一年级的研究生使用,书的内容对专业程序员也很有价值。
------------------------
王咏刚《接受程序设计语言的再教育》
http://www.china-pub.com/computers/ebook20001-25000/22979/wz1.doc
再教育?没错。依个人愚见,大多数中国程序员都需要接受一次有关程序设计语言的再教育,而Michael L.Scott所著的《程序设计语言??实践之路》则可以成
为这次再教育中的最好读本之一。
对于那些没时间重温大学课程的上班族来说,这种补习最好从《程序设计语言??实践之路》开始。即便不能把这本八九百页的“大部头”全部读完,你也至少能
在阅读过程中明白三个看似浅显、实则微妙的“大道理”:
其一,语言必须与环境相结合,才能发挥出最大的功用。这里所说的“环境”通常包括编译环境、运行环境和应用环境三个方面。举例来说,如果你打算仿照着
某些开源框架的做法,使用控制反转和依赖注入技术消除代码中某些让人生厌的依赖关系,你一定会认真研习实现类似技术的语法特征,但你未必会主动思考以下
几个问题:在编译层面,使用了这些语法特征的代码是否会影响到最终生成的目标代码质量?在运行层面,该如何组织这些语法特征,才能让使用了相关技术的可
执行程序在支持废料收集的并发环境下有不俗的表现?在应用层面,这些旨在消除依赖关系的技术会不会破坏新、旧模块间的平衡关系,以至于我们必须花上大量
时间改写原有的代码或接口才能保证系统的平滑升级?全面思考这些与环境相关的问题并不一定会改变你的抉择,但它却可以帮助你找到效率、可靠性和可用性之
间的最佳平衡点。在此方面,《程序设计语言??实践之路》一书所使用的,将程序设计语言与编译原理、面向对象等知识综合起来、融会贯通的做法不但可以节省
我们分类学习的大量时间,还可以训练我们从整体出发、多角度思维的方式与方法,其价值不言而喻。
其二,程序设计语言本身所具有的多样性可以成为我们提高软件开发水平的最佳指南。说到这里,我又想起了那些充斥在各大技术网站的,题为“某某语言比某
某语言更强大”或“某某语言已死,某某语言必胜”的帖子。发表这些帖子的帖主也许并不懂得,程序设计语言的世界本来就是一个多样化的、五彩缤纷的世界,每
一种成功进入应用、教学或科研领域的程序设计语言都有它值得学习和借鉴的地方。如果仅仅根据个人的喜好或是响应时尚的号召,就盲目地吹捧某一种语言并贬
低其他所有语言,这样的帖子和那些频繁出现在Fans网站上的“爱死某某某,恨死某某某”的帖子有什么本质的不同?更为重要的是,如果我们能够在《程序设计语
言??实践之路》的指下,真正懂得了函数式语言、数据流语言、逻辑式语言、冯?诺伊曼语言、面向对象语言等不同的语言类型在语法设计、编译器设计和运行环
境设计方面的异同,我们就会惊讶地发现:Scheme语言的lambda表达式可以在C 语言中优雅、高效地解决诸如面向契约设计之类的复杂问题;Ada95语言中提供
的同步和保护机制可以为那些使用Java编写的多线程应用提供重要的参考;Smalltalk语言与编译和运行环境的紧密结合则可以为我们设计可扩展的Javascript
宿主提供最好的借鉴……从这个意义上说,学习一种语言的意义绝不在于为自己增添一种求职和谋生的手段??真正善于学习的人总能从每种语言的设计和实现中找到
许多可用于提高编程水平的关键特征。
其三,使用特定语言编写出来的代码是否优雅、可靠,这主要取决于程序员对各种基本理念和基本原则的认知程度,而不取决于程序员记住了多少复杂的语法
特征或学会了多少流行类库的用法。正如《程序设计语言??实践之路》所说的那样,“典型的C 程序员都极少使用联合、多重继承、变动个数的参数,或者. 运算
符”,但是,如果你了解了隐藏在这些复杂语法特征背后的东西??如内存空间的分配和寻址方式,复本式继承和共享式继承之间的关系,参数传递和求值顺序,动
态方法约束和成员查找,等等??你就可以在需要使用这些语法特征的时候满怀信心地告诉自己:“嘿,这不过是某某原则或某某技术在C 语言中的表现形式罢了,
我能搞定它!”反之,如果你不晓得与数据结构和算法相关的代码在编译、运行时必然存在的各种均衡与折中问题,即便你把C 语言的标准文档背得滚瓜烂熟,即
便你可以默写出System.Collections命名空间中的所有属性和方法,你也会在体验过自己开发的软件与成熟软件之间的差别后大发感慨:“同样是使用C 语言,
为什么我写的程序总会从头到脚散发着‘业余’的气味儿呢?”
关于程序设计语言的本质,Michael L.Scott是这样说的:“就像自然语言限制着人们解释和论述的方式一样,程序设计语言也限定了什么可以表达,什么不
能表达,并对程序员能够怎样思考问题有着深刻而微妙的影响。”既然如此,我们还犹豫什么呢?与其后悔在学校中虚度了光阴,还不如马上捧起《程序设计语言?
?实践之路》这本书,接受一次有关程序设计语言的再教育呢!
Yupo:
这本书的作用有限,并不是所有编程的人都必须看的书。对于非计算机专业的人而言,完全可以不看此书。对于一般的计算机应用程序(指比较高层的应用)的开
发者而言,只需要知道如何使用程序设计语言编程就足够了。此书评的作者用不作为了抬高此书而这样来贬低他们。这样贬低他们只能说明自己的无知。程序设计
语言只不过是一种工具,就像自然语言是用来交流的工具一样。应用程序的编写者有自己的专业,他需要的只是如何使用编程语言来实现自己的设计,而不需要去
深究语言的实现机制。比如说,用Fortran语言编写科学计算程序的人,并不需要知道语法分析、代码生成等编译过程,一样能很好地实现自己的设计。这些东西
对他们而言是额外的知识,而不是必须的知识。
本书评作者通过贬低不懂编译实现机制或底层实现机制的人来抬高此书实在没有必要。如果真有谁曾“试用了28种开源框架和69种eclipse插件”,我想他一定不是
等闲之辈,也一定不会“仍不清楚自己眼前的垃圾代码该如何“重构””。在工作中或研究中能做到这样的人,一定是一个认真的人,他肯定不会需要进行这么多尝试
便早以解决好了自己的问题。反过来,我也没有看到“28种开源框架和69种eclipse插件”与学习本书之间有什么必然的联系。也不懂“自己眼前的垃圾代码该如何“
重构””这句话的含义。既然是“垃圾代码”还要“重构”干什么,这里的“重构”又是什么?莫名其妙。
编写应用程序的人在写程序时是无法自己决定如何使“语言与环境相结合”的,这不是程序设计者的任务,而是编译器的实现者的任务。书评者对着假想的一群应用
程序设计者,给他们规定毫不相干的任务,然后极力推荐他们看此书,搞错了对象。真有点好笑。
要写书评也要写在点子上。不要在自己还未懂得书中的内容时(我相信他根本就没有好好看过此书),就盲目地炒作。
《程序设计语言??实践之路》一书讲述的核心内容是程序设计语言的“语用学”,它的重点既不是语言,也不是编译。这里所谓的“语用”是指编程语言变成可以在计
算机上真正运行的程序所需要的环境、它的实现机制以及原理。与自然语言中的语用学讨论的问题是类似的,只不过涉及的“世界”不同。但是,由于将源程序变成
可执行程序需要由编译器来实现,因此其中的很多问题都与编译器有关。但是,它关心的不是特定的编译算法和编译器的实现方法,而是程序设计语言与底层计算
机体系结构的对应关系。例如,程序设计语言中的作用域和存储绑定、数据类型、过程调用、控制流等概念在计算机中是用什么方法来表示的?如用栈表示局部作
用域,用堆来实现动态申请的空间。为此,编译器要适当组织符号表正确地实现这种从概念到实例之间的映射。又如与函数调用相关的概念是如果实现的?例如,
形式参数如何与实在参数相结合?如何实现从一个函数的内部访问在该函数之外声明的变量?如何实现导入、导出的访问?等等。为了在计算机上正确实现这些概
念,编译器必须遵循特定机器的有关调用约定,如寄存器使用约定、参数传递约定,栈帧的布局约定,等等。这些问题都可以抛开编译器而单纯从实现机制上来讨
论。事实上,它们都是编译器的设计者在实现一个编译器之前,必须在头脑中事先便明白的知识。学习这本书,对于深刻理解程序设计语言的行为实质是很有帮助
的。不论你专注于计算机的哪个方面,网络、应用还是底层的系统软件,这本书都会对你有好处。对于有兴趣研究编译器的人而言,则更是必备的知识。
本书并不深奥,讲的都是基本的东西,学起来应当不难。
另外要补充一点的是,我认为书名译得不是太好,这个名字没有突出“语用学”,而事实上“语用学”是本书的重点。其实就翻译成《程序设计语言语用学》就可以
,不要搞华而不实的标题,而且还没有点中要点。更为不当的是封面设计,将“程序设计语言”用了那么大的字体,搞不清楚的还以为是专门讲程序设计语言的书。
-----------------------
其实本书很大程度上就是 编译原理 的教材;而我学过编译原理,用的是 龙书 ,并且实现了一个小型的编译器;书不错,但对编译原理学的很好的读者并不适合,重
复了,深度上不如 龙书.
书的价值之所在:创新性地将语言设计与编译原理两门课程的内容融合在一起,将两门在传统上分割开来的学科融会贯通,彻底打破我们在学习中产生的不连贯性
。
国外教改,国内现状:美国ACM和IEEE/CS最新制定的《Computing Curricula 2001》课程体系,反映当代计算机科学与技术学科发展水平和计算机科学技术的
新进展、新技术。编译器的编写曾是计算机学科中的核心课程, 但现在越来越多的人认为并非每一个计算机专业的学生都需要具备设计编译器的能力, 这项工作应
属于编译器的设计专家. 去除了这项课程后, 可以在课程表中填充如下内容, 如软件工程、 数据库工程或其他一些关于计算机科学技术实际应用的课程。但,
cc2001中也明确指出,学校有必要开设一门关于程序设计语言原理的课,主要讲授各种常见语言的设计。本书就是这样一本讲编译原理嵌入到程序设计语言的各种
设计方案的佳作。她的每一章讲授一种设计方案,同时结合一种典型语言。另外她加入了计算机底层的东东,确实不错。国内很多院校都取消了编译原理课,取而
代之的是程序设计语言概论。
经常看书买书的,都知道裘老师的翻译质量是没的挑,博文的出版编辑也是十分负责。本书保留了索引,这对于书迷的重要性我就不多说了。
真心希望以本书为契机,多多引进国外的优秀教材,把先进的设计理念带入国内。同时也希望我们能有自己的精品图书品牌,多出版优秀国内原创,提高国内教学
和技术水平。
这本书中的内容可以说覆盖面很广,但是却很浮浅,有些甚至是聊聊数语带过。对于语言机制、哲学、分类、数学基础的介绍也不深刻。充其量也就是一本语言分
类学的概观和浅显介绍。所谓馆藏精品以及接受再教育实在是言过其实了。
这本书就是一本典型的程序设计语言概论性的书,其中虽然涉及了一些编译方面的知识,但只是从程序设计语言的角度来较为深入地探讨其实现,与编译原理不是
一个概念。
这是一本知识浓缩度相当高的教材,它所覆盖的知识面相当的广泛,它可以作为自动机原理、汇编语言、编译原理、数据结构、计算机组成原理等计算机专业课程
程的参考书,也可以为电子信息工程、通信工程和信息技术等专业的学生提供帮助。本书并没有具体的讲解某种程序设计语言,但其讲述的一般原理,是任何一种
程序设计语言都必不可少的。本书从计算机的硬件、设计、原理和实现上都做了详细的阐述,是一本难得的综合教材。由于本书综合的内容比较多,在具体的某些
方面讲得不是很细,但是对于作为教材来讲,确实是一本经典之作。特别适合研一的学生来阅读。
程序涉及语言的书,这几年各出版社出了一批:
Ravi Sethi 的《程序设计语言:概念和结构》;
Robert W. Sebesta的《程序设计语言原理》;
Kenneth C. Louden的《程序设计语言??原理与实践》;
Terrence W.Pratt和Marvin V.Zelkowitz的《程序设计语言:设计与实现》。
这些书的作者从各个角度介绍程序设计语言,相信大家看了后定会大有收获。这些书中的有些已有二、三十年的历史,出了五、六版,及时反映程序设计语言。这
些书没有哪本标榜“图书馆必藏经典,程序员必修秘笈,全球上百所大学列为标准教材和首选参考书”。特别是提到“程序员必修秘笈”,好像让人得到武功秘籍一样
,使人反感。这世界没有万灵药,没有哪本书标榜自己怎样怎样的,只不过是一本书而已。不同的作者有不同的观点,不同的书有不同的写法,各取所需。
遗憾的是,大家查不到高教去年出的John C.Mitchell的《程序设计语言概念(影印版)》,大家如果看了该书后自会有另外一种感受。作者的网站为
http://theory.stanford.edu/people/jcm/。
这本书创新性地将语言设计与编译器原理融合在一起,让学习者可以更清楚地明白两者之间的关联,是难得的优秀教本。推荐有兴趣深入学习程序设计语言的人士
研究一下。
本书号称创新性的将程序语言设计与编译器的设计有机结合.
但是,我觉得此书中关于[编译器的设计]仅仅是些编译原理的基础知识,而且还不够详细,[程序语言的设计]更是泛泛而谈.诸如[深入理解计算机系统]对这种大而
空洞的主题都有所阐述;[C++的设计与演化]才是探讨某专门语言设计的典范.
译者和著者都不错,书的内容也很规矩;但说是经典就有些勉强
其中牛校少了点,像MIT、Stanford、UCBerkeley、CMU、UIUC等一等一的都没有。不过这个作者的确是本领域的大拿。
这本书结合编译系统,很好的探讨了设计程序设计语言中需要考虑到的很多问题。是一本不错的书。
这本主要还是集中在语言方面。你说的《深入计算机系统》其实与博文视点要出版的另外一本 Write Great Code Vol.1(The Art Of Assembly Language
作者最新系列杰作) 有一定的相似性。:-)
每章最后都有一些复习题和一些更具挑战性的练习。这些练习的特别价值在于引导学生理解各种语言或者技术,其中许多都是他们不大会在其他地方遇到的,或者
不会很快遇到的。我建议程序设计作业用C++或者Java;Scheme、ML或者Haskell;以及Prolog。布置一个有关异常处理的题目也是非常好的想法,它可以用
Ada、C++、Java、ML或者Modula-3写。如果课程里包含了并行性,作业应该在SR、Java、Ada或者Modula-3里给,可以根据本地的条件选择。在附录A里给出
了各种语言实现的资源信息。
除了这种小型课题之外(或者在那些希望的地方),教师还可能希望学生做一些语言实现方面的工作。由于从空白开始做一个小编译器也是一个学期的工作,
Rochester采用的方式是给学生提供能工作的编译器的代码,要求他们做些修改。对于其中的许多人,这是他们第一次阅读、理解和修改一个大的实在的程序??就
其本身而言也是非常有价值的练习。Rochester的PL/0编译器把一个归功于Wirth[Wir76,307-347页] 的小语言翻译到MIPS I汇编语言,这一汇编语言被广泛
认为是商品的RISC指令集中“最友好的”。威斯康星大学计算机系提供了一个非常好的MIPS解释器(“SPIM”,www.cs.wisc.edu/~larus.spim.html)。编译器
本身可以从Rochester得到(ftp://ftp.cs.rochester.edu/pub/packages/plzero/)。它是用C++写的,仔细划分了各个编译阶段,并有很详尽的文档。
=============================================