Linux之父又骂C++了(一)

 Linux之父(Linus)又骂起C++了。这儿可以看点门道(点我)。更多的还可见原贴

 
一、懂一点“历史辩证主义”还是必要的
Linus骂到的某些地方,确实就是C++的弱点。比如没有并发支持,没有像Java等语言提供的GC机制(垃圾回收)等等。
Linus的意思是,C++既然是基于C,既然要走高端,怎么可以没有这些功能呢?
这一点,我觉得Linus这人也难免“揣着明白装胡涂了”。C++之父1979年开始搞Cpre,最迫切的需求是引入class,也就是要往“面向对象”走出一步。你说那阵的计算机软硬件生存条件下,迫切的需求会是搞GC?搞并发吗?
举个例子,Java并不是第一门拥有GC的语言,也不是第一门拥有虚拟机(从而可以跨平台)的语言,但先行者要没么流行不了,要么直接死掉。C++没有死,并且后面成为工业上全球范围内第一门被大量使用的,支持“面向对象”的语言,原因就是因为它走对了第一步。
除了往前迈出“面向对象”这一步,C++还留了一步,就是一开始的严格要求兼容C。C有支持线程的库吗?可以说有,也可以说没有。说没有,因为C标准库也没有规定哪个函数是用来支持线程的,一开始没有,至今也没有;说有,是因为如果操作系统这一层有实现线程,并且操作系统提供相应的C头文件和库文件,这时候C就会有支持。
C为什么到今天也没有提供线程的标准支持?(pthread等,皆非于“标准”这一层规定的实现)。原因为什么?显然易见的事情,历史局限,或者只能说C++来到这个世界来得太早……但如果来得晚,它可以就不是C++,也许叫真叫++C了。 

当然,任何事物都不能总以“历史”局限性做借口。随着软硬件的迅速发展,并发和垃圾回收机制确实越来越重要,并且就算是在C或C++这种没有VM机制的语言上实现,也完全可行。Linus说:
...As mentioned, support for both garbage collection and concurrency are quite real problems, and they are both things you can do in C, but that you cannot do well with library interfaces, which is how you normally would extend on C....
他说同时支持GC和并发是很真实的问题了,并且你可以在C上做得很好,但通常不是通过库接口来有好的实现,而是看你如何扩展使用C。 (不懂我是不是读对了……)
试问有几位C使用者,能够不依赖于库,自行实现可用的垃圾回收和并发支持呢?Linus当然是一位,但普通程序员就很难了。而恰恰相反,c++通过各种各样的库,让很普通的程序员,也可以使用上并发和垃圾回收。并且因为C++基于C,在C之上还一层扩展的舞台,所以就算C没有在其库里提供标准的线程,GC的实现,但下一代的C++终于还是可以把这些纳入标准。不再仅仅是“事实上的标准”,而是白纸黑字。
Linus也吭了一声,提到C++也没有在“图形用户界面/GUI”上提供什么方便。这更是令人无语了。图形用户界面是捆死在操作系统厂商上面的。美妙的世界当然是由编程语言来提一个标准,然后让各家操作系统厂商提供实现…——哇,这要真能实现,真爽,unix, dos, os2, mac, 还有linux全都有一致GUI编程接口,linus作为后来者,可能很希望这样,但比尔盖茨不知作何感想……GUI的问题,不仅是历史问题(DOS年代下谈什么GUI?),而且是个政治问题,这是众所皆知哪,Linus他装什么胡涂呢。Java几次三番想实现这个标准,试问它成功了吗?或者就算各家操作系统厂商同意采用统一界面了,但这一边语言也有上千家啊,用pascal?用java?用c#,或者是Object C?我看最后也得是用C语言啊,关C++何事。把任何语言都做不到的事,扣到C++身上,我看没有意义。
二、C++的特性是胡乱加入的吗?
和上次一样,Linus骂起C++来毫不客气,他说:
C++ is a mess. There's no design. It's just "add crud on top of C". And the crud isn't even meaningful, much less does it have a design. It's totally and utterly random.
好凶的骂法: C++就一个混乱,(在其中)没有设计,它仅仅是在C的头上加一堆杂质,这些杂质没有什么意义,更谈不上某种设计,完全就是胡乱添加的。
语言都骂了,语言的东家当然也要骂,所以随后马上就是:
It started out random, now it's randomness that gets added to by a committee.
真是骂得毒啊,就差说C++始乱终弃了。不过linus可能忘了,当C++还只是叫小名“C with class”时,它还是属于“C语言标准委员”管的,并且受到了C标准委员会的热情关爱,最终也正是C标准委员会为它取了个“C++”的名字,然后这才有了“C++语言标准委员会”。
C++真是“始于胡乱”吗? 如果真的是始于胡乱,为什么当初C标准委员会却支持它呢?还是从“C with class" 这小名说起。

    不管Linus现在如何看待“面向对象”(后面简称OO),但在当初,OO却的确是工业界认为解决大型应用软件开发时所面临的许多困难的一个很好的解决之道。许多语言都开始往这个方向发展,但限于种种原因(比如对内存,对硬件的高需求,以及某些语言在当时过于学术研究性质),当时世界上还没一门支持面向对象的语言得以大规模化地使用。C在那时就是最广泛地使用工业语言,但可惜它对OO的原生支持基本是零。所以当 “C with class”出现,它是受到C标准语言会的热切支持的,看看C++在1980那个最初版本提供的特性是什么吧:
a) class  //当然了,c with class嘛
b) 派生(只是还没有虚函数) //面向对象的基础
        c) 构造和析构 //对象的基础
d) 友元类 //(30年过去了,你理解友元其实也很“OO”的吗?)
e) Call and return functions (在类似java的AOP,但这项特性在发展过程被慎重移除)
f) 相对C加强的静态类型检查机制。
看,只有最后一项和OO无关。尽管C++之父也一直强调说,C++不是单一“面向对象”的语言,但其初发展,还是主要迈出“面向对象”这一步的,所以才有这些特性,如果这些特性是“胡乱”而加,那真不懂C++该如何发展?那些跟着linus大牌一起骂C++的人,多少有些“扯虎皮当大旗”的味道。没事儿让您设计一门语言,还不准有class的概念,难不成是设计函数式语言,并且得是纯种的,不带crud的?
怎么理解Linus骂话中的这一段内容呢?我感觉还是离不开一个前面提及的“历史辩证主义”。来看看当年情况吧。
面向对象概念,本身也是一个没有明确定义,模糊,不断发展的概念。就算是C++大规模普及的很多年里,全世界都还有很多C++程序员,坐在屏幕前优雅地品着咖啡,看着自己优雅的C++代码,可其实还是不懂最简单的一个OO问题“虚拟的析构函数有什么含义?”这一问题。这不仅是国内的,还包括国外的,只是由于当初网络还不发达,所以在中国这种情况持续的时间更长。许多人完全是在误用C++,误用“面向对象”。再看看至关重要的C++编译器。那个可怕的C++编译器,从1.5~6.0就没正经过,许许多多人,也因为它更加误用了C++,甚至连delete[]都不熟悉,也因为它对C++标准库都不熟悉……熟悉的倒是那个MFC。C++的专家说这MFC算C库好了,C专家一听急了,你家才有这样的库呢……大有称赞某人哥哥是中国男足一样的意思。
       所以,粗粗这么一看,会觉得先不管C++语言是不是有设计,倒要问C++语言是不是有像样的实现,这里实现是广义的,既包括编译器对语言的实现程度,包括标准库的成型,还包括C++的世俗教育等等问题。别忘了于这期间,Linus本身也试图使用过c++,结果他(都)失败了。
无论是C++程序员,无论是C++的库(包括自身的STL的缓慢发展),也无论是C++的编译器,所有问题其实除了商业因素之外上,还是有历史原因。C++与面向对象的思想,与它的程序员,它的编译器,它的库,全都是在一起成长的。所以,Linus骂C++“完全没有设计”,或者忍一忍也还是可以认下的,至少C++确实不是一开始就有一个大一统的设计。我们就当这是一个语言游戏吧,Linus容易激动,所以他说“C++彻底的没有设计”,我们就理解为“C++没有彻底的设计”。
什么语言可以有一个彻底的设计呢?100%很难说,但相对彻底设计的语言还是很多的。条件就是相对往后的的语言,比如C++流行了15年之后出现的Java语言。它冲着C++狠狠地砍几刀,就可以有一个很纯净的设计了。纵算如此,它也还是会偶尔走一下回头路,捡起被砍掉的某些特性,比如enum;也偶尔会再借鉴一些C++中发展得很好的新特性,比如泛型。
无论如何,说C++在一开始没有(也无法)设计充分,这是可接受的;但也无论如何,说C++所有特性都是无趣的,都是胡乱加入,那是很难接受的。C++标准委员会的工作效率确实是低下令人难受,但他们同时对于加特性也是慎重的。骂C++连带C++标准委员会也骂,这就更不应该了。
下一篇,我们来具体谈谈被Linus提到的几个C++特性吧。夜里2点了……

----------------------------------------------------------------

如果您想与我交流,请点击如下链接成为我的好友
http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c

 

----------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/nanyu/article/details/6499284