您的位置:首页 > 编程语言 > C语言/C++

<<C++的设计与演化>>读书笔记(一)

2012-10-23 16:31 447 查看

初读此书感触

以前看些大家所谓的关于编程语言的经典著作时,觉得相较一般书籍来讲确实好很多,不仅讲怎么使用某个语言特性而且解释了为什么那样用,那样设计.我们不仅要知道how to do that,要想理解的更透彻还比较知道why to do that .而且在了解出于什么原因设计一个语言特性时,我们会想到为达到一个目的会有多种选择和取舍,而语言的设计者为什么会选择其中某一种呢? 关于why to do的描述很多所谓的经典也只是简单的做下描述,不会深入讲解.这也不能苛求他们,因为那类书的主要目的还是要教你怎么熟悉编程语言的使用,能讲到一些why已经是很不错了.

而C++之父Bjarne Stroustrup写的<<The Design and Evolution of C++>> (一般翻译为C++语言的设计与演化)
这本书顾名思义更多讲的就是why to do.为什么那样去设计一些语言特性.我觉得这本书可算是经典中的经典了.在我看过的所有关于某门特定的编程语言的书中,我觉得这一本是最好的.最让我叹为观止的书.所以忍不住想写点读书笔记了啊.

下面我会断章取义的摘抄一些stroustrup的话,然后加上些自己的感悟.当然这样的书肯定是属于要精读,多读的书.或许过段时间我再看此书时感悟又会不一样啊.这只是我第一次看时的感悟.为了更原汁原味点,我是看的英文版.我摘录的时候也会简单的翻译下(绝对是自己翻译的,可不是抄的喔.)

题外话,对中英文翻译书籍的看法

我们看什么书时如果能看原版是最好,而看翻译版的话得挑个翻译的好点的.我觉得翻译版与原版相比最明显的区别是如下两个

1.词和短语方面

我们知道不同的语言,像汉语,英语,日语,法语之类的.表达人的思想和描述事物的能力是基本差不多的.不然世界上也就不存在翻译这说法了.但是每个语言在实现细节上会有区别.一种语言中使用到的词不一定在另一种语言中有一一对应的词存在.只能通过意译,找相近的意思.所以翻译也是个比较有技术难度的活,你必须得对两种语言背后的文化有较多了解,对书籍所涉及的专业知识有较多了解才能翻译出高质量的书籍.

像电脑,物理,化学这些词都是翻译的非常完美的词.很好的传达了原来的意思,并且能顾名思义.电脑:看到电就想到是个电器,需要用电才能工作的机器,脑的话说明比较聪明的机器.

物理:研究万物之理的学说.揽括世界一切物质的东西. 化学:研究物质变化的学说.其实化学从广义上来讲可以隶属于物理的.

而翻译的不好的词有intellectual.这个词翻译过来叫知识分子.而知识分子的概念对我们的生活和教育可是产生了非常大的影响.我们认为记住的东西越多就有越多的知识,也就越聪明.我们的教育也倾向于让学生记住非常多的东西.实际上intellectual的原意应该是有较强的思维能力,理解能力,领悟力.所以有种说法叫教育的本质是当你忘掉了所有学过的东西后留下的东西.实际上留下的是思维能力.从这个角度讲外国人眼中的知识分子在中国其实没多少啊.

2.语句方面

我们知道很多英语语句和汉语貌似是刚好颠倒了.汉语是把重点放在后面,那些修饰词都放前面.而英语往往喜欢把重点放前面,很多不重要的修饰都放后面,一都是用定义来表示.这样很容易让我们抓住重点.

另外英语中有很多的介词,连词,很多长句就通过一些介词连词组织起来.结构严谨表达一些复杂但又互相联系在一起的观点.而汉语翻译过来往往就变成很多短句,句子间的联系变得松散了.

有趣的是心理学中有一个分支叫语言心理学,专门研究语言中不同点对人的思想产生的影响.举个例子,比如汉语中名词和形容词就比较多,于是经常使用汉语的人就 倾向于感性思维,凭经验和感觉去理解这个世界.而英语中介词,连词用的特别多,经常使用英语的人逻辑能力就强点,因为介词,连词往往体现事物之间的逻辑联系.

<<C++的设计与演化>>原文摘录与自己的注解

原文:

1.C++ was deisgned to provide Simula's facilities for program organization together with C's efficiency and flexibility for systems programming.

C++的设计是为了在拥有C的高效率与灵活性的同时又提供Simula的程序组织功能.

注解:simula中出现了类的概念.类很大的一个功能就是可以划分成很多模块,可以很好的组织代码.你像C中可以把一些操作弄到一个函数中组成一个模块.而类更进一步可以把很多函数,变量(也包括其他的类)组织到一起.撇开类其他的优点不说,关能很好的组织代码这一块就足够强大了啊.而且C++也不想丢掉C的高效与灵活性的优点

原文

2.However,the details of a language definition are incomprehensible without an understanding of the purpose of the language.The language,details and all,exist to help build programs.

然而,如果对语言的用途不理解就很难透彻理解语言的所有细节定义.语言的所有细节及其他所有功能,它们存在的目的是为了编写一个程序.

注解:学习一门程序语言时如果我们不知道它一些语法为什么那样设计(why to do),我们也很难灵活的运用这个语言(how to do).一个编程语言的出现往往是基于一些实际需求,满足程序设计中的一些具体问题.不是为了好玩,为了学术上,概念上的完美.打个比方我们使用一自然语言如英语,汉语.他们有很多标准,完整的语法.从学术的角度讲非常完美.但现实生活中我们很多时候不完全按照语法来,会使用省略或者病句.比如中国人最爱说的最大的之一,最好的之一.其实这明显是病句.但语言的使用是出于实用的目的,只要能达到我们想要的目的,为啥要严格按语法来呢?

编程语言也一样,比如说面向对象是个很美妙的思想.但有个时候我们实现一些问题可能用面向过程的思想反而更容易实现.这时面向对象的反而成了一个束缚.所以要具体情况具体对待.每个编程语言有自己擅长的地方.

原文

3.Thereby,I have reaffirmed a long-standing and strongly held view:Language comparison are rarely meaningful and even less often fair.A good comparison of major programming requires more effort than most people are willing to spend,experience in a wide
range of application areas ,a rigid maintenance of a detached and impartial point of view ,and a sense of fairness.I do not have the time ,and as the designer of C++,my impartiality would never be fully credible.

I also worry about a phenomenon i have repeateddy observed in honest attempts at language comparisons. The authors try hard to be impartial ,but are hopelessly biased by focusing on a single application ,a single style of programming ,or a single culture
among programmers. Worse,when one language is significantly better known than others, a subtle shift in perspective occurs: Flaws in the well-known language are deemed minor and simple workaounds are presented,whereas similar flaws in other languages.are deemed
fundamental.Often the workarounds commonly used in the less-well-know languages are simply unknown to the people doing the comparison or deemed unsatisfactory because they would be unworkable in the more familiar language.

Similarly,information about the well-known language tends to be completely up-to-date,whereas for the less-known language ,the authors rely on several-year-old information.For language that are worth comparing,a comparison of language X as defined three
years ago vs. language Y as it appears in the latest experimental implementation is neither fair nor informative.Thus ,i restrict my comments about languages other than C++ to generalities and to very specific comments.This is a book about C++ ,its design,and
the factors that shaped it's evolution.

在这里我重申下我一直坚持的一个观点:不同语言的比较是没有太多的意义,有时甚至是不公平的.如果真的想对不同语言的主要特性做一个比较好的比较的话需要付出的努力是巨大的,这样的付出远大于大部分人的想象.这需要在各个应用领域的丰富经验,需要保持一种绝对中立,公正的意识.我没有太多的时间去花在比较不同的语言上,而且做为C++的设计者我对其他语言的公正性是永远难以让大家绝对信服的.

另外我还担心这样一个现象,这也是我多次看到一些人想努力的公正的去比较不同的语言时出现的现象.这个现象是:那些比较者本来是努力的让自己保持公正,但最后却不知不觉的因只关注某一个应用,某一种风格,某一类程序员文化 而最终出现了偏见.当对一种常用的程序语言与一种不常用的程序语言做比较时还会出现一种更糟的情况.一种不 容易觉察的偏见会出现:常用语言中的一些缺陷会被低估,并且会想到用一些权宜之计来解决.然而不常用语言中的类似缺陷会被夸大.而且比较者未必知道不常用语言中的权宜的解决方案.就算知道了有解决之法,也可能会与常用语言中做类比而认为此方法不好.

与上面的偏见类似的还有,比较者拿不常用语言的几年前的信息来与常用语言的最新信息进行比较.举个例子,对于有可比性的语言,假如有语言X ,关于它的信息是三年前的,有语言Y,关于它的信息是从实验室刚出来的最新技术.那么这样的比较是既不公平也没有意义的.因此我在书中关于C++和其他语言的一些比较只是泛义上的或者严格限制在某个特定的看法上.

注解:哎一这段话翻译下来发现好多地方都拿捏不准,只能翻译出个大概意思啊.作者的大概意思就是说比较不同程序语言的优劣一来没有太多意义,二来很难做到公正,容易有偏见.

对Linux说C++很垃圾的一点看法

可能最为有趣的事是写了这篇文章很多年后,Stroustrup自己设计的C++被人拿去和C相比较时被批为垃圾语言.而且说这话的人不是一般的人,而是大名鼎鼎的Linux.实际上我们仍然可以用上面的论点来评论下这个问题.首先对于Linux来说他肯定是更熟悉C一点,用C写过很多程序出来.而对于C++可能仅是语法比较熟,而由于对它讨厌自然不可能用C++去在很多领域开发一些应用程序.而我们知道C++设计之初的目的是出于实际的一些需要.如果没在各个领域的各个应用中用到C++可能不容易体会到它的好处.而且Linux以开发操作系统而出名,他更多的时候是靠近计算机的硬件那一个角度看问题,怎么运用高效的算法和方式来充分利用硬件资源.而较少考虑做应用程序更关注怎么把业务流程做数据建模,抽象成一个数据模型,这样做设计时更容易,开发人员写代码和组织代码时也更方便.
所以做应用开发时有时为了方便人,而浪费一点硬件资源,让硬件多干点活是值得的.在效率和灵活性方面C++相较C自然会差一些,但也不会差太多.所以从学术角度讲,C++的有些设计可能(我只是说可能)不如C美妙,但C++在很多地方比较实用点.就像你Linux操作系统,就算从技术角度讲比windows牛逼很多.但实际上我们大部分人还是不去用linux而是用windows.这里虽然有一定的商业原因.但也有linux太多的为机器考虑,而没替人考虑的因素在内.人天性是比较懒惰的,都比较讲实用,方便易懂.

所以从Linux自己的角度来讲,他认为C++很垃圾可能是对的.但从其他的人角度来说可能C++更好,而C比较垃圾了.实际上还是stroustrup那句话比较两个语言整体上的好坏没意义.当然如果只是限定在某个方面,我觉得还是有用,可以他山这石可以攻玉,互相取长补短.程序语言也是在不断进步发展的.用C#举个例子吧.刚开始它没有泛型,那会就真的不好用,也没几个人用.后面有了泛型就方便多了.再后来又有了Lambda表达式,有点函数式编程的味道,然后又出现了啥动态类型...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: