回 帖 发 新 帖 刷新版面

主题:[讨论]C语言已经死了,5个需要忘却它的理由(转贴)

现在,有很多C/C++程序员总是自命不凡,看不起其他开发人员。其实,或许别人更看不起他呢!

  学生时代,我也曾醉心于C/C++,但时至今日,始终无法写出无懈可击的C++代码,所以我始终认为我不会C/C++。这些年,我一直在寻找编写C++代码的最佳模式。但是,老实说,我还没有见到过哪个称得上高手的C++程序员,也没有见到过写得Very good的C/C++代码。C/C++代码总是丑陋不堪,BUG丛生!

  我用C语言编程已经超过20年了。我写过C语言的编译器、C语言的调试器、用C开发的其他语言、游戏、客户端程序和服务器程序,你说吧!还有什么是我没写过的。还有我的书架上充斥着折了角的K&R和Steele的书。我太了解C语言了,但是,我讨厌他。十分讨厌!

  当我读到一篇博客,题目是“为什么每个程序员都应该学习C语言?”时,我真是鸡皮疙瘩满地。如果你真的是个专业的程序员的话,你肯定觉得这是个天大的笑话,尽管作者的本意也许不是这样的。这篇反驳的文章有点意思,但是还是没有抓住本质。所以我展开了说一下。有以下5个原因来说明,为什么那些会C语言,并且使用C语言的程序员,现在不但应该去用别的语言,而且应该忘记他们学习C语言过程中的那些烦人的东西。

  1、内存分配

  仅仅关于这一点我就能写整整一篇文章了,也许能写一本书,甚至还有可能写出能够塞满图书馆技术书籍那块,那么多的内容。内存分配和存储单元分配的存在确确实实是个大麻烦。你要不就是分配太少的内存不够用,要不就是分配了太多内存浪费掉。这里的问题就是:怎么把它初始化为零呢?还是干脆就不初始化它。但最挠头的步骤还是释放内存。所有已有的工具包都会帮助你确认,你是否已经释放了之前分配的每一位的内存,在释放完之后是否永远不使用它,并且会阻止你,永远不要释放它第两次。更严重的是,分配内存和释放内存在C语言中都是很慢的,非常慢。使用内存分配时,要考虑的各种特殊情况,我真是连想都不愿意去想,只要问题(对象)的大小合适,我更愿意使用栈空间或者事先分配的结构空间。如果这么做的话,我就有更值得烦恼的事了。话说回来,发明垃圾处理器那人真应该得诺贝尔奖。

  2、多线程

  我过去是喜欢C语言的,真的。直到我开始用C开发并维护多线程的服务器。在为连接相冲突的线程保护数据方面,C语言没有为程序员提供那怕一点点的帮助。你在使用单线程的日子里获得的每一个直觉、经验,用在多线程的时候都是错误的。至少JAVA有表示同步的关键字和备有证明文件(但是是个很奇怪的文件)的记忆体,但即使是这样,除非你使用新的javax.concurrent,否则也只能在那些巨大的平行摆放的机器们面前崩溃。回到C语言上:在模拟生产的环境下,坚持一个星期在数据中心调试一个死锁(这事真的发生过)。而JAVA却只需要Ctrl+Break!天哪!!!

  3、指针

  指针太难以控制了,太阴险了;我甚至没有委婉一点的方式去形容它。我生命中每年都有几个月被用来调试那些奇怪的指针问题。我过去常常努力获取所有的诀窍,比方说难以理解的构成符、联合体和偏移量,以及重用最后两位做标记,还有所有其他的诀窍。但我发现这么做根本不值得。其他语言的静态引用就可以解决了。

  4、过早的优化

  说到诀窍,你是否曾经浪费脑细胞去研究究竟*p++是不是比p[i]快?你是否曾经花时间去试着做点变化来代替乘法,或者去尝试使循环中的倒置运行更快的方法?还在为传递一个参数的速度和反对添加结构,并且传递它的速度一样而苦恼不已?停吧!算法是速度的关键,程序员的水平决定了他会使用那些算法。知道这一点能让你的程序更好,更快一点并且让你的脑袋少扭几个筋。好吧,有一些例子也许可以这样做的……不,你就别那么做就行了!

  5、测试

  你最喜欢的C的单元测试的工具是哪个?嗯…一个也想不到?单元测试一定是一点也不重要,是吧?或者是太麻烦了,很难跟上进度,浪费时间。你可以把这个时间用到更加有用的事情上,让它只占用工作时间的1%,那还比较合适。或者在数据中心,通过优化的没有标记的图形来调试这个仅仅由100个同时在线使用者引起的问题。

  我本来应该继续再说一些原因的,但是5个现在就足够了;说完这些,现在感觉好点了。C以前是非常棒的…那是在1984年的时候。直到今天,那些用C写的新代码都让我感到惊喜…如果你让我比较的话,我觉得C++只是比C稍微好点。如果你想要学些老一点的语言,不妨尝试Forth,Lis,或者APL。这些老式的语言起码能教会你,用不同的而且优雅的方式去思考你的程序。

  作者简介

  Ed Burnette是一位有着丰富编程经验的程序员。他现在致力于使用JAVA和C来开发OLAP客户端和服务器。他业余时间喜欢研究Java、Eclipse和开源软件。他写了很多关于Eclipse的文章和书籍,另外他还是EclipseZone.com的主编。

您认为初学者应该掌握C语言吗? 
  是的,C语言能让初学者更快地掌握计算机的底层技术 
  不,现在有很多快速开发语言,C语言应该退出历史舞台了   

您认为能够取代C语言的是什么开发语言? 
  C++ 
  Visual C++ 
  Java 
  .NET Framework

转的一篇帖子,觉得言辞稍显偏激了,大家都说说自己的看法!   

回复列表 (共54个回复)

沙发

什么语言,干什么事情。

板凳

现在,有很多C/C++程序员总是自命不凡,看不起其他开发人员。其实,或许别人更看不起他呢!

楼主发此贴的原因是 认为这篇文章写得不妥才来讨论。

这篇文章的作者:有很多C/C++程序员总是自命不凡,看不起其他开发人员。光看这句,发此文章的原因一目了然,还讨论什么。
或许别人更看不起他呢!(而且还有看不起自己的倾向)

我想了一下,此文章的作者写这个文章的原因:
我来举个例子,比如一个在软件公司工作的人,今天被上级骂了。到了家里很不开心,想当初没日没夜的干,我为的什么,工资也没加多少,甚至都没加,好了,越想越来气,新仇旧帐一起想,干脆再写一篇文章,让大家看看才解恨,好了,文章一写,什么都牵扯进去了,先说自己的公司怎么怎么样坏,然后牵扯到自己的国家,最后牵扯到一个世界,其实就是今天 心情不好,挑骨头的写了一通,第二天一醒来,再去看文章,才发现自己为什么会写这些东西,写的自己都搞笑,笑自己幼稚。。第二天照旧。说白了就是一写牢骚,谁没有呢。

他里面好象有说到,C语言很要搞一大堆时间才搞定的,其他的只要小搞一下就可以了,就来说明我们要忘记C语言,就好象一个人 对我说:喂小子,你吃这么大一碗米饭干什么,浪费时间,看我吃压缩饼干多好。。

想我们初学者 不应该看这些东西,我们要的是如何找一个适合自己的学习方法和学习进度然后如何去学习一样东西。。

世界上心情差的人多了,他今天心情不好发一篇,我今天心情不好发一篇,压都压死你,你还都去评论啊,什么都没干都已经累死了


3 楼

这个问题好像:世界上哪种语言能写出好文章?
其实,关键不是哪种语言,而是语言的使用者有多少水平

4 楼

呵呵,萝卜青菜,各有所爱。
语言是其次,程序员水平才是关键,一个程序员不应该只会C语言,自然会学学其他语言,各有各的优点和缺点。

5 楼

1、内存分配
使用垃圾回收机制,并不是在所有方面都比不使用垃圾回收机制要好。况且,在C语言中,要写一个垃圾回收器来取代常规的内存分配函数,并不需要太多的代码。
分配内存并把其中的内容初始化为零?C语言提供了calloc函数。
分配内存空间太大或太小显得不合适?C语言提供了realloc函数。
无法两次释放同样的内存?请记得在释放内存后将指针设置为零,以后无论重复释放多少次都没问题。如果连这个习惯都没有,我只能认为这样的人还不算程序员。——正如他使用JAVA中的class,但连定义名字后还要使用new关键字创建对象,这样的基本常识都不知道。

2、多线程
C语言本身不支持多线程。因此它不提供任何的保证数据同步机制。我认为这没什么好奇怪的。我对多线程的经验并不多,也就不好再说什么。
引用:“你在使用单线程的日子里获得的每一个直觉、经验,用在多线程的时候都是错误的。”这也没什么好奇怪的。正如你习惯了求解有理数的方程,现在要求解复数的方程,于是x*x=-1这个方程就从无解变成有解了。以前的每一个直觉和经验,现在都必须怀疑。C是这样,其它语言难道就不是这样?

3、指针
怎么说呢?我感觉楼主贴的那段文字,简直就是想把指针批判得体无完肤,完全不承认指针的优点。但指针真的就那么差吗?我想最多也就是好坏参半而已。如果我们放弃使用指针的一些容易出错的特性(比如一些难以理解和掌握的“技巧”),而仅仅使用指针中较简单方便的特性,则可以得到利大于弊的效果。举例来说,从你的位置到目的地有两条路,一条较近,但不好走,一条较远,但相对好走。究竟要走哪条路,是一个见仁见智的问题,没有标准答案。
好吧,就算一部分人对指针很感冒,坚决不使用它。实际上,要避开使用也不是不可能。正如JAVA一样,把指针放到底层,不让程序员接触它。如果要把C语言改造成这样,所需要做的工作也不过是再实现一些函数库而已。(当然这样做的实际意义并不大)

4、过早的优化
一段不知所云的描述。
简单点说,并不是每个C的程序员都认为,研究*p++是不是比p[i]快是有意义的。——当你认为有意义时,你可以研究;当你认为没有意义时,你可以不研究。并且,即使你不去研究它,它也不会很明显的影响你。
算法影响速度。但这说明了什么?难道它就说明C语言是不好的语言吗?听起来这就像是一个冷笑话。另一方面,算法并不完全的决定了速度。不同的程序员实现同样的算法,运行效率的差距可以是成百上千倍。另一方面,对某些计算来说,效率慢了一倍带来的损失是致命的。(例如:导弹拦截。)还是那句话:当你认为有意义时,你可以研究;当你认为没有意义时,你可以不研究。

5、测试
由于我用C语言写的唯一比较有点规模的程序就是一个小型编译器,我并没有使用太多的测试工具。
单元测试和总体测试都很重要,但请让我复制第4条中的一句话:“难道它就说明C语言是不好的语言吗?听起来这就像是一个冷笑话。”
应该说,语言的优劣,并不决定于关于它的工具的优劣。JAVA刚出道时,有什么好的单元测试工具呢?不多。但这一事实成为了“JAVA语言已经死了”的一条理由了吗?很显然,不是的。我们需要做的,也就是为它增加一些工具而已。

C当然也有问题,有些时候也显得笨重。但离“死”这个概念还差了很远。



您认为初学者应该掌握C语言吗?
  我选择“是的”。C语言是很考验基本功的语言,可以让人得到锻炼。如果一开始就搞什么“快速开发”,容易让人忽略一些小问题,最后千里之堤,溃于蚁穴。

您认为能够取代C语言的是什么开发语言? 
  这个可不好选。但首先Visual C++应该被排除在外。
  虽然C++的出现,占领了C语言原来的一些地位,但我认为这并不能说明C++最终就会取代C。C最后可能会消亡,但取代它的可能会是多种语言。

6 楼

Visual C++不是语言
是开发工具
lZ要搞清概念

7 楼

你说死了就死了吗?还不是流行了呢么多年,群众的眼睛是雪亮的。

8 楼

呵呵,本来不打算说话的,让大家讨论的,不过不要误会我啊,上面的除了最后一行是我写的,其他的都是那个自称编程20年经验的貌似是个程序员写的啊,所以不要攻击我哈....嘿嘿....

9 楼


支持2楼说法,灌下水[em2][em2]

10 楼


任何事物都有两面性,这主要取决于发表那些廖论的人,不要厌天忧人!

我来回复

您尚未登录,请登录后再回复。点此登录或注册