C语言中的数组与指针 读谭师傅的书(2)
Mar 18

谭师傅的书流传之广,令人叹为观止。于是决定好好把谭师傅的书好好研读一下。能够完整下载的,只找到了一个扫描版的《C语言程序设计》第二版。Google Books倒是有第三版部分章节。以后若不加说明,都是指Google Books里能够看到的内容。

以下是我对第一章1.1节的读书心得。

心得1:谭师傅年份拎不清。例如:

1、B语言应该在1969年在PDP-7实现,1970年在PDP-11上实现,而不是谭师傅说的1970和1971年。
2、第一个ANSI C标准于1989才正式出版(即C89),而不是谭师傅所说的1983年(1983年刚刚成立X3J11委员会)。

心得2:谭师傅事实也拎不清。例如:

3、谭师傅说ISO接受“87 ANSI C”作为ISO C标准(即C90)。事实上,不存在什么“87 ANSI C”。C90和C89区别非常小。
4、Thompson从来没有在PDP-7上用B语言实现过Unix。事实上,PDP-7上B语言编译器不直接产生机器代码,而且Thompson也从来没有过这样的打算,因为PDP-7的硬件限制太多。

心得3:谭师傅喜欢想当然。例如:

5、谭师傅说B语言的B是取其前身BCPL的第一个字母,C语言的C是取其第二个字母。事实上这两种语言的命名历来都有两种说法,就连Dennis Ritchie都没有像谭师傅说得那样斩钉截铁。

心得4:谭师傅语言表达很成问题。例如:

6、谭师傅说C语言是一种“系统描述语言“。这玩艺儿到底是啥?
7、谭师傅说Brian Kernighan和Dennis Ritchie“合称K&R”。实际上他们合著的那本经典书才被称为K&R。

1.1节学习完毕,以后再接着读

“读谭师傅的书(1)”有14篇评论

  1. eric Says:

    1. 不同人依据的材料来源不同,因而叙述可能有些差别,应核对一下,最后有统一说法。

    2. 1983年是有ANSI标准的。K & R的序中有这样一段话:“1983年,美国国家标准协会(ANSI)成立了一个委员会,…结果产生了C语言的ANSI标准”。 “本书第二版介绍的是ANSI标准定义的C语言”。 K & R第二版是1988年修订出版的。据查,ANSI在1983年公布了第一个C语言标准草案(’83 ANSI C),K & R就是根据它对第一版进行修订的。1989年,ANSI又公布了一个完整的C语言标准,即ANSI X3.159-1989,通常称为ANSI C,简称C89。目前多数编译系统和教材都是以据ANSI C为依据的。可以讨论,但不要武断。

  2. eng Says:

    eric,不要混淆视听。你引的那段是K&R第二版(1988)的序:

    In 1983, the American National Standards Institute (ANSI) established a committee whose goal was to produce ‘‘an unambiguous and machine-independent definition of the language C’’, while still retaining its spirit. The result is the ANSI standard for C.

    这意思还不明确吗?1983年成立委员会,最后形成了ANSI标准,可没说1983年就有标准。草案就是草案,标准就是标准。如果说这就是武断,那么我看还是武断点的好。

  3. eric Says:

    你宣称“第一个ANSI C标准于1989才正式出版(即C89),而不是谭师傅所说的1983年(1983年刚刚成立X3J11委员会)。”那么K&R第二版的序中说已经有了ANSI C标准,而且第二版(1988年写的),是根据这个标准修订的,那么请问这个标准是什么?

    我觉得我们应该心平气和地讨论学术问题,不要讽刺挖苦,那样没什么意思。

  4. qiushi Says:

    要抱着互相学习的态度讨论问题,不要随意上纲,你们是精英,素质高的人,应该给老百姓作出榜样。

  5. eng Says:

    eric,这不是学术问题,是事实问题。可以讨论,不必心平气和。武断这个词是你自己用的,可不是我讽刺挖苦。你自己没搞历史事件反而说我武断,就是“心平气和”,很有意思?

    ANSI C89的技术层面上的东西到1988年就已经定下来了,接下来的一年时间只不过是把标准的程序走完。K&R第二版指的就是这个1988年已经定下来但还未正式发布的标准。你以为K&R第二版指的是ANSI 1983年的草案,但其实1983年的草案就是K&R第一版里的东西。莫非K&R第二版是根据第一版修订的?

  6. Tong Says:

    1.历来很多书的介绍的确说:取名C是取BCPL的第二个字毋,或说C在B基础上设计的语言。即使有别的说法,谭教授在书上讲的并没有错。不必吹毛求疵。
    2.把Brian Kemighan和Dennis Ritchie合称为K&R有什么错!刘伯承和邓小平不是合称“刘邓”吗?这纯粹是人们的方便和习惯,根本就没有什么规定。国内许多人也都是把他们简称K&R。你把这些都郑重其事地当成问题,有些像鸡蛋里挑骨头。


    1. 很多书都错了。

    2. K&R指的是书不是人,这至少在英文世界里是约定俗成的。“国内许多人也都是把他们简称K&R“,说不定就是被谭师傅毒害的。

    – eng

  7. 编编程序 Says:

    K&R C或者K&R Style确实存在的。
    通常老牌C程序员是会用K&R来指代他们两合著的那本书。原因是什么呢?因为书名类似的书很多。K&R直接用作者的姓氏缩写,可以简单明确地指出是这本书而不是其他人的同名书。K&R的根本来源,还是来自作者的姓氏缩写。

    “K&R指的是书不是人,这至少在英文世界里是约定俗成的”这种说法,纯属只知其然,不知其所以然。就好像当年票友学腕,上台要饮场一样,以为有个“与众不同”的举动就抬高了自己的身价。
    K&R的名著仅此一部,所以提起他们,自然就是指此书。如果这也要拿来说事“K&R指书不指人”那岂不是和“是腕就要饮场”一样舍本逐末。
    这都值得拿来当靶子,只能说明道行还不够深。

  8. wang Says:

    没听说过“系统描述语言”,还说“这玩艺儿到底是啥?”,这说明你的根底不深。

  9. gne Says:

    读.读谭师傅的书(1)
    “高薪聘几个骂人的抢手
    再找几个文化名人当靶子 • 谁火就灭谁

    网站靠什么呀?靠的就是点击率啊 •点击率上去了,下家(儿)跟着就来了
    你砸进去多少钱 • 加一零(儿)直接就卖给下家(儿)了
    我还告诉你啊,有人谈收购立马(儿)就套现 • 给你股票你都免谈

    你要是感兴趣你投个八百万到一千万•多了我不敢说,我保你一年挣一个亿•真的?
    我说的可是美金啊 ” - 电影《大腕》台词-疯人院

    C语言,我用了有20年了。从当年的“尖端科技”,到今天的“尽人皆知”没有觉得C语言会在今天得到如此关注。

    有人说最近C语言又火了,我还以为是突然很多人都去写Unix了(或者Linux也未可知)。结果给我发来连接一看,不禁笑出声了。

    原来是个自称eng的写手在网上发布他的新书“的 西 不可”大概是因为缺少市场开拓经费吧,将电影大腕里的高招借来用了。

    中国文人从来是对中国文人最苛刻-甚至是恶毒的。Eng对他的谭师傅之刻薄,当然原自其竞争地位-eng的新书“的 西 不可”是与他的谭师傅的C语言程序设计直接竞争的。

    同为文人,我非常喜爱eng这样的同类。正因为有了eng一类的文人,我才有机会释放一下刻薄的欲望,而不必感觉内疚——当乌鸦笑话猪黑的时候——我们终于可以说-乌鸦真“黑”!

    其实eng的手法真得很值得我们学习:
    1)要节约,不讲法律和原则:
    连想骂人,都不去买一本书来。要上网找扫描的。想推广自己的作品,不是错,依靠供给他人,就不对了,攻击他人,还要盗版,就太Cheap了。
    心得:没敢学,盗版的事,还在网上大肆宣传,没有这个必要。

    2)没事找事,还要口气要强硬,即使自己说的是错的:
    B语言的发展时间是69-70年,还是70-71年?看看如下连接http://www.linfo.org/thompson.html吧,为避免争议,我就不翻译了就是提醒大家,1969年Thompson开发了Unix,后一年开发了B语言。1969年的后一年是69年还是70年?
    其实替eng说句话,他们现在的年轻人看待那个时候,觉得是“历史”。但是我学C的时候,B还在被使用,还在发展。B语言和C#不同,没有一个上市日期。B语言地发展过程与现在的1.0,2.0, 3.0的模式非常不同。所以当后人要硬安一个时间上去的时候,最接近1969年的说法是:B语言最早出现在1969或者其前后。而《C语言程序设计》成书的时候,还没有wikipedia这样的网站。自然也没有人一定要安一个年份,所以说70,或者69都不是问题。
    当然,对历史不了解不是错,站出来说别人的说法是错的,就过分了。拿人家wiki上的“69前后”来指责《C语言程序设计》中正确说明的70(见连接)纯属没事找事,除了讨个口快,就是迷惑他人了。
    心得:以后一定加以使用,自己找个不太可靠的消息来源,就以次为依据把对的说成错的,关键是口气要强硬,不能让人看出来心虚。

    3)以小卖小,吹毛求疵:
    87 ANSI C 到底有没有?从历史的角度讲,确实不再承认87 ANSI C 标准了。但是当年我们学C的时候,真的有87 ANSI C。为什么呢?因为那个时候C语言还很新,标准还在定制过程中,到87年的时候,标准相对稳定了,所以我们都开始用了。当时还没有到89年,所以我们都称其为87标准。连Brian Kernighan 和Dennis Ritchie 《C编程语言》88年的改版,都使用的这个版本的标准。88年的书,当然不可能用89标准。
    心得:谭老师确实可以考虑改变87 ANSI C的说法了。因为年轻人都已经不了解当时的具体情况,很容易被纸上谈兵的eng马后炮唬住。

    4)想当然的批评别人想当然(好绕呀):
    Thompson 到底在PDP-7上有没有用B语言实现Unix?此事还真没有定论。贝尔实验室的官方文件对此避而不谈。谭老师的说法“……并用B语言编写了第一个Unix操作系统”应该是不准确的。第一个Unix操作系统是用汇编序言编写的,谭老师后面也是如此说的。所以本来有自相矛盾的地方。如果eng点到为止,也算是指出一个错误。
    也许是觉得这么一个错误不够“严重”eng发明了“而且Thompson也从来没有过这样的打算”的“事实”这就大错特错了。因为Thompson开发B语言的一个重要原因就是要用高级语言来写Unix。为什么呢?因为可移植性。Thompson至今认为Unix和B语言的经典特性之一就是可移植性,以及“自实现”性。这一点(Thompson的想法)是有公论的,除了eng中外都没有人否定Thompson开发B语言是为了写Unix的想法。
    至于解释器是否就不能用来写操作系统,eng的口气说明了他从业的年限。在当年的计算机领域,并不像如今,一定要编译器材能写操作系统,这些都是我们慢慢摸索出来的。早期的编程语言往往是用汇编写的,直接运行在硬件上,任何软件都可以在此上写出来。当年的AppleII DOS就是在Basic之上的。而早期的PC也是可以无盘直接启动Basic解释器的。对于有兴趣的人,再其上写出一个OS,也不是不被允许的。当然,Thompson本人对于解释器的速度慢确实有所顾虑,而这也是C语言发展出来的一个重要原因。

    至于Brian Kernighan和Dennis Ritchie是不是不可以“合称K&R”,就是一个更有趣的问题了。确实在我们早期C程序员的圈子里,有K&R C, K&R style 的说法。而这些说法都是因为他们合著的那本《C编程语言》而得来的。是不是我们就会强行定义说K&R就是那本书?不会。只有后生想往我们这个老C程序演的圈子里挤,才闹出这种笑话——他们以为我们这么称呼K&R是与众不同的。其实之所以如此称呼这本书,是因为类似书名的C语言程序设计著作太多了,难以区分。而此书的作者的姓名开头是K和R,因此比书名更易明确指出是哪一本书。如果因此,就不可以再称他们两个认为K&R,就舍本逐末,贻笑大方了。
    心得:以后争论,也不必引经据典了,只要言之凿凿,就可以了。这能节约多少人多少时间呀。

    学习完毕,学到了要假装权威,说话口气要硬,只要读者不知道的,就是我知道的。误人子弟到了很高的境界。

  10. wang Says:

    eng说:“‘国内许多人也都是把他们称K&R’,说不定是被谭师傅毒害的”。这种说法不仅可笑,而且无知。你试试创造一种说法,让全国的人都跟你说,就算你有本事。称K&R有什么“毒”?‘害’了谁?胡乱咬人,太没水平,还拿到网上发表,真丢人。

  11. eng Says:

    某位披着好几件马甲的同学,你会google吧,去找Dennis Ritchie理论一下C的历史如何?友情提示,文章的名字叫做“The Development of the C Language”。其它的胡言乱语我就暂时放在这个示众了,也让人知道一下被谭师傅毒害的人长什么样。

  12. 金仕并 Says:

    评论比正文有意思,哈哈。

  13. 是但啦 Says:

    这几位对自己的评价还真是挺到位的,“要节约,不讲法律和原则没事找事,还要口气要强硬,即使自己说的是错的以小卖小,吹毛求疵想当然的批评别人想当然”,加一条吧,脸皮真厚实。
    可我的问题是,他们几位真能看得懂“The Development of the C Language”吗?

  14. kager Says:

    For eng’s info:

    “It was named “C” because many of its features were derived from an earlier language called “B”, which according to Ken Thompson was a stripped down version of the BCPL programming language.”


    这位谭粉,您的偶像谭师傅说的是,C语言的C是取BCPL的第二个字母。上面这句话有这个意思吗?

    另:您就别费心思一个劲换马甲了,今天随手删几个以示警告。您英文这么差,看原著都有困难,还要拽e文、当德育教授,还是回家看谭师傅的吧。–eng

发表评论

CAPTCHA Image
*