C语言已经死了,5个需要忘却它的理由

fiv5er 2010-03-26 10:06:39
  现在,有很多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的主编。

------------------文章转载,博众家乐乐....
...全文
465 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanglibin_1222 2011-03-06
  • 打赏
  • 举报
回复
其实,我们唯一惧怕的是惧怕本身。
内存分配、指针——不得不承认这是C的硬伤。
但是,多线程、过早的优化、测试等问题什么语言都有?不能单说C吧!
comewisdom 2011-02-10
  • 打赏
  • 举报
回复
感谢楼主分享,收藏!
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
PsCreateSystemThread和CreateKernelThread,我不清楚这两个API是不是内核级的线程,但是第一个只有驱动程序用,第二个干脆undocumented。

看来微软认为CreateThread外加几个线程池API完全够用了
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kingstarer 的回复:]
引用 2 楼 keiy 的回复:
我想问一个简单的问题,JAVA编译器是用什么开发的?

Eclipse是java开发的
[/Quote]
java确实可以写编译器,但是我要纠正一点,Eclipse是ide本身不能编译java,没有jdk,Eclipse连运行都不行,而jdk的java编译器是C++写的
yzx714 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 jackyjkchen 的回复:]

别的不讲,就多线程来说,Windows核心编程里面对UNIX线程是不屑一顾的,甚至有点误导读者说UNIX线程是“假多线程”的意思(强调UNIX的多线程实际上是多进程,当然现在UNIX/linux下也有类似Windows的多线程);而linux用户干脆就说Windows线程是抄袭linux线程的,这同样不负责任,因为早期的UNIX多线程就是多进程,而Windows这种多线程似乎比现代linux的多……
[/Quote]Linux的多线程分为内核级多线程和用户级多线程。
kingstarer 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keiy 的回复:]
我想问一个简单的问题,JAVA编译器是用什么开发的?
[/Quote]
Eclipse是java开发的
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
这样的话,C不仅可以开发协议、算法,还可以开发桌面应用,开发网络后台,开发驱动,开发病毒……
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
别的不讲,就多线程来说,Windows核心编程里面对UNIX线程是不屑一顾的,甚至有点误导读者说UNIX线程是“假多线程”的意思(强调UNIX的多线程实际上是多进程,当然现在UNIX/linux下也有类似Windows的多线程);而linux用户干脆就说Windows线程是抄袭linux线程的,这同样不负责任,因为早期的UNIX多线程就是多进程,而Windows这种多线程似乎比现代linux的多线程还早。
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
C和C++的问题都在标准库太差,多线程。网络方面其实是平台造成的,如果Windows一统天下,Windows API成为C的标准库,C的标准库功能上将不亚于任何一种语言
AAA20090987 2010-03-27
  • 打赏
  • 举报
回复
JFFJJFFJJFFJJFFJJFFJJFFJ
wangxipu 2010-03-27
  • 打赏
  • 举报
回复
死毛
该干嘛干嘛去
xhp5743 2010-03-27
  • 打赏
  • 举报
回复
C的时代还很长久的
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 dixiad 的回复:]
引用 16 楼 jackyjkchen 的回复:
C和C++的问题都在标准库太差,多线程。网络方面其实是平台造成的,如果Windows一统天下,Windows API成为C的标准库,C的标准库功能上将不亚于任何一种语言

微软可以搞这么一个自己的标准库嘛,搞得好大家都用它的,不是标准也成标准了嘛?我虽不太懂,但总感觉C还是有它固有的缺陷,也许只适合于专家级程序员用
[/Quote]
微软如果对标准库动大手术必然招致非议,现在VC的CRT里面有不少非标准函数,已经被骂了;而出于意识形态原因,微软的库基本上无法渗透到gnu那边
xiaoxiangmao 2010-03-27
  • 打赏
  • 举报
回复
路过,拿分走人!!!
yzx714 2010-03-27
  • 打赏
  • 举报
回复
C先是把编程弄得简单了,然后又把编程弄复杂了
我非常喜欢C,但更喜欢Python和Perl,尽管我的大部分工作都必须用C,但要我自己的小东西的话,我毫不犹豫用Python和Perl
dixiad 2010-03-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jackyjkchen 的回复:]
C和C++的问题都在标准库太差,多线程。网络方面其实是平台造成的,如果Windows一统天下,Windows API成为C的标准库,C的标准库功能上将不亚于任何一种语言
[/Quote]
微软可以搞这么一个自己的标准库嘛,搞得好大家都用它的,不是标准也成标准了嘛?我虽不太懂,但总感觉C还是有它固有的缺陷,也许只适合于专家级程序员用
yxriyin 2010-03-27
  • 打赏
  • 举报
回复
呵呵 只有大牛才敢这么说啊
andy1658 2010-03-27
  • 打赏
  • 举报
回复
没什么好讨论的,java能排上用场的几乎也就没C的影子了,关键是很多地方不能用java啊
shindow_D 2010-03-27
  • 打赏
  • 举报
回复
我不想说你在放屁 不过总感觉有点臭味... 操作系统没写过吧...

既然不想说c/c++语言比起他语言好 那也没必要说c/c++语言不好..
jackyjkchen 2010-03-27
  • 打赏
  • 举报
回复
确认了一下,sun的jdk所有的exe文件都有rich signature,这是微软的独家标志(VC、MASM),还有VC2003的运行库
加载更多回复(28)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧