五大原因忘却C语言

ZDNet软件频道 时间:2006-12-18 作者:Builder.com.cn |  我要评论(7)
本文关键词:C语言,编译器 C语言
我用C语言编写程序已经有20多年了。我写过C语言编译器、C语言调试器、其它语言、游戏、客户端、服务器等等。因此我了解C语言。然而,我讨厌它,厌恶它。

C语言已经落伍了——下面是我的理由。

现在,我用C语言编写程序已经有20多年了。我写过C语言编译器、C语言调试器、其它语言、游戏、客户端、服务器等等。K&R和Steele的卷角书籍装饰着我的书架。因此我了解C语言。然而,我讨厌它,厌恶它。

因此,当我读完一篇关于为何每个程序员都应学习C语言的博客文章后,我感到浑身发冷。如果你是一名专业程序员,你可能会觉得好笑,虽然可能作者并没有这样的意图。这种反驳有一些道理,但还是没有抓住C语言为何落伍的本质。所以让我来说清楚。下面是五个理由,说明为何知道并应用C语言的开发者不应使用其它语言,而应忘却他们在C语言中学到的所有无用的内容。

  • 内存分配:仅这个主题就可以写一篇文章,一本书,甚至可能是放满一个图书馆角落的内容。内存分配与存储单元分配是祸根。你要么分配得太少,最后不够用;要么分配得太多而导致浪费。然后还有是否将其归零或不进行初始化的问题。

    不过释放内存最糟。人们写了整个工具集帮助你确保释放所有分配的内存,在转译后从不使用它,从未释放两次(但愿不会如此!)而且,在C语言中分配与释放进展缓慢,非常缓慢,这更是雪上加霜。我甚至不愿想起我为避免内存分配而应用的特例,如果问题规模合适,使用堆栈或预先分配的结构空间。好了,我还担心别的事情。不管谁发明垃圾收集,都应获得诺贝尔奖。
  • 多线程:我过去喜欢C语言,真的。这种情况持续到我应用它开发并维护多线程服务器为止。C语言根本不能帮助你保护数据,使它不被相互冲突的线程访问。你在单线程中学到的所有经验全都失效。至少Java还有同步关键字和一个确实(但古怪)的内存模型,但即使它们在平行的机器上也不复存在,除非你使用新的javax.concurrent。倒叙:在C语言中,一个星期站在(真实的故事)数据中心,在一个模拟产生环境中调试一个死锁问题;在Java中,Ctrl+Break结合键,搞定!
  • 指针:指针相当麻烦,对它无法用礼貌的方式描述。我一生中有几个月时间就花在调试混乱的指针带来的问题上。我过去经常使用各种技巧,如不可理解的转型、联合和offsetof,并重复利用最后一点代码做标记等等。那样做根本不值得。静态类型引用是最好的方法。
  • 早熟优化:说到技术,你曾经浪费精力思考是否p++比p[i]快吗?你尝试用转换而不是相加,或者逆转循环努力使它运行更快吗?曾经比较是提交参数速度快,还是把它填充到一个结构中再提交速度快吗?停下来!算法才是速度的关键,而开发者的效率是算法的关键。以为动一下脑筋就能改进你的程序,或提高它的速度?嗯,是有几个特例…不,不要想它。
  • 测试:你最喜欢的C语言单元测试工具是什么?呃…一个也想不起来吧?那么单元测试不那么重要,是吗?还是太麻烦,浪费时间!你可以花那段时间来执行0.001%的代码,或者调试那个只有在同时有100名用户才发生的问题,在数据中心,关于一幅经过优化、没有符号的图片。

我还可以列举许多原因,但现在五个就足够了。我已经感到好多了。在1984年C语言很棒。今天还在用C语言编写新代码却让我感到震惊。如果你问我,C++要稍好一些。如果你想学一些旧知识,试一下Forth、Lisp或APL,至少它们会为你提供一些不同而且优良的编程方法。

责任编辑:张琎

查看本文国际来源


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134