读谭师傅的书(1) 评《C和C#标准是不一样的》
Mar 19

之前已经学习过1.1节,现在再来学习1.2节,“C语言的特点”。

谭师傅说C语言“数据结构丰富,具有现代化语言的各种数据结构“。我看到这里就蒙了。C语言里只有数组还可算得上是个“数据结构”,丰富在哪里啊?再往下看,原来谭师傅说的是C的“数据类型”丰富,可以实现复杂的数据结构。这都哪跟哪啊?我是不是也可以说汇编语言的“数据结构丰富”,因为用汇编也可以实现各种复杂的数据结构?

谭师傅说C的“语法限制不太严格”。与C相对的,“一般的高级语言语法检查比较严,能检查出几乎所有的语法错误。而C语言…放宽了语法检查“。我就不懂了,语法检查不是编译器干的事么?如果一个编译器不能检查出所有的语法错误,那一定是假冒伪劣产品。写C语言程序还能不按它的语法规则写?我又一次看到了“谭氏编译器”的身影。

谭师傅还匠心独具地解释了一番“高级语言中的低级语言”和“中级语言”,并认为C语言一般被称为“高级语言”,原因是它必需“通过编译、连接才能得到 可执行的目标程序”。“目标程序”这个词不伦不类,暂且不提。难道谭师傅写的汇编程序(如果他写的话)是不需要经过编译和连接就可以得到可执行程序的?这样看来,不光有谭氏C编译器,还有谭氏assembler。

在第二版中,谭师傅还列出几种语言作为高级语言的例子,其中居然连一个functional language都没有。试想,如果BASIC和FORTRAN算是高级语言,那C++/Java/C#不就成了超高级语言,而Lisp、Prolog、ML就成了超超高级语言了(说起来怎么这么绕口:))。还好第三版里这些被去掉了。

谭师傅还提到“UNIX和C不可分”。话是没错,不过谭师傅为什么还在用TC?

直看到这一节结束,谭师傅对诸如Linux、Java、C#等等只字未提(像PHP之类就不强求了),只讲BASIC、PASCAL、FORTRAN、COBOL如何如何,让人不禁想起七、八十年代的美好时光。

谭师傅还认为,C++只是编写大型软件用的,没必要一开始就学,而且学了C再学C++就很容易,因为“面向对象的基础是面向过程”。真的是这样吗?C和C++各有所长,但绝不是什么大型还是小型的问题。OOP与Procedure Programming之间的关系也绝非谁是谁的基础这么简单。

好,1.2节学习完毕。下次接着学习

“读谭师傅的书(2)”有5篇评论

  1. steven Says:

    Lisp, Prolog and etc are certainly higher-level than C++/Java. Since those languages take away the “computer” details, and let the programmers focus on the problems they need to solve.



    Right. That’s exactly my point. The meaning of “high-level programming languages” is relative and must be put into context. His book gives the wrong impression that stuff like BASIC is the highest level among programming languages.

  2. Says:

    Since those languages take away the “computer” details,
    ========
    take away computer是对的。

    let the programmers focus on the problems they need to solve
    =======
    就不准确了。那要看问题是什么。难道C不是用来解决问题的?呵呵,吹毛求疵一把。

    听说国内现在n多专业都学C,真的吗?能学会吗?先不说学好。



    我知道的情况是,计算机等级考试用这本书作教材,所以不管学不学得会,考试还是要过的。

  3. Tong Says:

    1.BASIC和FORTRAN怎么不是高级语言,看来你也是一知半解。请你再复习一下大学的基础知识。
    汇编语言翻译成目标程序,是将助记符一一对应翻成机器指令,这叫“汇编”,而不是“编译”。汇编语言当然是低级语言。你连这样基本的问题都不清楚。亏你说得出“如果BASIC和FORTRAN是高级语言,那么C++/Java/C#不就成了超高级语言”。你知道低级语言和高级语言以什么来区分的吗?人们说Java或C++比Fortran,Pascal等老一些的语言“高级”,并不是指区分低级语言和高级语言的“高级”,而是指以前的语言多是面向过程的,而现代一些语言是面向对象或面向问题的。这两个概念不应混淆。

    2. 难道你连“目标程序”这个最基本的名词都未听说过,竟然说它是“不伦不类”,请你先查查字典,弄清楚后再教训别人。

  4. san Says:

    1.BASIC和FORTRAN怎么不是高级语言,看来你也是一知半解。请你再复习一下大学的基础知识。
    汇编语言翻译成目标程序,是将助记符一一对应翻成机器指令,这叫“汇编”,而不是“编译”。汇编语言当然是低级语言。你连这样基本的问题都不清楚。亏你说得出“如果BASIC和FORTRAN是高级语言,那么C++/Java/C#不就成了超高级语言”。你知道低级语言和高级语言以什么来区分的吗?人们说Java或C++比Fortran,Pascal等老一些的语言“高级”,并不是指区分低级语言和高级语言的“高级”,而是指以前的语言多是面向过程的,而现代一些语言是面向对象或面向问题的。这两个概念不应混淆。

    2. 难道你连“目标程序”这个最基本的名词都未听说过,竟然说它是“不伦不类”,请你先查查字典,弄清楚后再教训别人。

  5. gne Says:

    读•读谭师傅的书(2)
    这水平也来学C呀?
    以为eng学了西洋功夫,来介绍真经了,值得认真学习一下。
    结果怎么越看越不对呀?Eng到底知道多少关于编程的事情呀?

    1) 看数据结构,就看蒙了。倒也不是什么错,好多人对数据结构都比较蒙。再说“只有数组还可以算得上是个数据结构”就过分了。数据结构是有公论的,不能你说算就算,你说不算就不算。C语言的数组,指针是数据结构,struct, union, 什么时候就被宣布为不是数据结构了。struct是C语言的一个重要特征。Thompson甚至要等到C支持struct之后才能够用C来重写Unix。汇编语言当然可以用来实现很多复杂的数据结构,但它需要程序员来实现,Thompson最早使用会编写的Unix,之后用C重写Unix,就是因为C语言支持的数据类型和结构更丰富了。Thompson认为Ritchie 设计C语言最大的贡献就是数据类型和数据结构呀!看不懂不是错,出来假装权威就不道德了,这纯属误人子弟呀。
    2) C语言放宽语法检查,就又看不懂了。咳!初学的人啊通常不明白编译器和程序员的互动。Eng还口口声声说K&R在国外约定成俗指那本书,不能用来指两个作者。结果连这本K&R的书都没有看过。C语言的关键词少,语法限制不严格是其设计特点。比如在C语言中,你可以将一个字符变量开方,这在语法检查严格的语言(如Pascal)中是不允许的。
    语法检查(Static semantics checking)和C语言句法检查是不同的概念,当然象eng这样没有学过编译原理的人一般不明白这个道理。C语言编译器检查的是C语言的语法,但是因为C是弱语法语言,通过C编译器的语法检查,不等于从编译原理的角度讲,所有的可能成为语法错误的地方都被检查出来。学业不精,还要通过混淆概念来冒充权威。张铁生呀?可悲。
    3) eng的汇编大概是最近学的,微软的汇编译器确实要编译连接,还有C/C++库呢。这不等于汇编语言都要编译。事实上,近代的汇编语言需要编译器的主要原因是支持跨语言开发(用汇编写一部分,用其他语言写一部分,连接生成完整的应用程序) 。纯汇编语言本身是不需要编译器的。Eng似乎不知道汇编语言的本质是代码化的机器语言(加上宏的支持)纯汇编语言需要的是assembler,而不是compiler。虽然近代的汇编语言很多都有编译器,问出来汇编程序“是不需要经过编译和连接就可以得到可执行程序的?”这种话说轻了是抬杠,说重了就是装疯卖傻了。不知道目标程序?居然把自己学不会的东西都叫做不伦不类。难道只是越多越反动的年代又回来了?真是张铁生呀?
    4) 高级语言与中级语言的争论就更无理头了。20年前我们就开玩笑,高级语言是给初级的人用的,低级语言是给高级的人用的。没想到,20年后还有人整不明白,还出来卖弄知道几个语言的名字。去google一下,看看Basic 和Fortran是不是高级语言?你知不知道Thompson想用高级语言实现Unix,他的第一个尝试就是用Fortran,他没两天就放弃了,因为Fortran太高级,距离硬件太远。去问问Thompson, Fortran是不是高级语言,再出来误人子弟。
    5) Unix和C不可分,为什么就不能用TC? Eng到底想说明什么呀?是不明白Unix,还是不明白TC?
    6) 没有提Java也成罪状了?难道eng盗版来读的是《Java语言程序设计》?显摆自己知道几个名词也就罢了,怎么别人不显摆得反而成了有错?
    7) 对C++的断论颇有气魄。且不说这个“++”是怎么来的,也不说OOP是不是不需要面向过程作为基础(C++里的C是啥?)。学习一下OOP历史,OOP本身就是在解决复杂软件开发的过程中发明出来的。整个“决非……这么简单”出来就好像这些概念和历史都是eng一个人可以随便定义,修改的。

    学习完毕。除了口气敢冒充权威,只剩下语言刻薄,学业不精了。基本上是混淆视听,误人子弟。

发表评论

CAPTCHA Image
*