C 并不是对机器模型的完整抽象,就是说把 C 作为一种 portable assembly language 是有缺陷的。即使是做底层,光有 C 也是不够的 (IMHO) 。
C 语言的卫道者们最喜欢举的一个例子是:某某语言的 VM 都是用 C 的;或是某某语言都是先编译成 C 再编译成本地码等等,以示 C 的重要性。没错,现今的事实如此,这是历史选择的结果。我最近在读一本翻译的很糟糕的书,《游戏——自然规律支配偶然性》 。如果有人耐着性子读下去,就可以从书中列举的小球游戏看到选择一般怎样发生。
今天看来 C 并不太适合写 VM ,也非做别的语言编译成本地代码的中间语言之最佳选择(尤其对函数式语言来说)。选择 C 只是没有更好的选择而已。
我最近读了一些关于 C– 的 paper ,C 对 gc 支持的不足可以说是最大的一个缺陷。这一点是语言的不足,用库去解决是不太现实的了。对于函数式语言来说,函数尾调用的堆栈优化也使 C 在性能表现上相形见绌。到了 C++ 解决了一些,不仅外观是拙劣的(大量的 inline 函数的使用),性能依然有欠缺。可悲的是,许多 C 程序员对这些不屑一顾(尤其是对 gc 的错误认识)。
C 在静态语言中没有太大的竞争者其实也是 C 的悲哀。造成了在 C 能力临界点上的领域,它依旧成了最好的选择。这造成了大家在低阶开发上把 C 当万能药来使。今天看来,没有 C 是万万不能的,这也是一个历史选择的结果。假若当年 pascal 战胜了 C ,现今所有用 C 写的代码都用 pascal 来实现也未尝不可。
云风的 BLOG
思绪来的快去的也快,偶尔会在这里停留
« 不小心成了高收入人士 | 返回首页 | 周末 »
C 语言已死?
今天俗一把,掺乎近期网上最热门的这个话题:C语言已经死了,5个需要忘却它的理由。大家驳来、驳去 的。这的确是一个不值得一驳 的问题,我这里也没打算驳斥那些观点。只是写点别的:
C 并不是对机器模型的完整抽象,就是说把 C 作为一种 portable assembly language 是有缺陷的。即使是做底层,光有 C 也是不够的 (IMHO) 。
C 语言的卫道者们最喜欢举的一个例子是:某某语言的 VM 都是用 C 的;或是某某语言都是先编译成 C 再编译成本地码等等,以示 C 的重要性。没错,现今的事实如此,这是历史选择的结果。我最近在读一本翻译的很糟糕的书,《游戏——自然规律支配偶然性》 。如果有人耐着性子读下去,就可以从书中列举的小球游戏看到选择一般怎样发生。
今天看来 C 并不太适合写 VM ,也非做别的语言编译成本地代码的中间语言之最佳选择(尤其对函数式语言来说)。选择 C 只是没有更好的选择而已。
我最近读了一些关于 C– 的 paper ,C 对 gc 支持的不足可以说是最大的一个缺陷。这一点是语言的不足,用库去解决是不太现实的了。对于函数式语言来说,函数尾调用的堆栈优化也使 C 在性能表现上相形见绌。到了 C++ 解决了一些,不仅外观是拙劣的(大量的 inline 函数的使用),性能依然有欠缺。可悲的是,许多 C 程序员对这些不屑一顾(尤其是对 gc 的错误认识)。
其实即使是机器语言上的编程,到了具体流行的系统上,也有强烈的历史选择的痕迹。比如堆栈的设计,对于冯诺体系来说并不是必须。但是大家都这么设计了,CPU 也按这个做了优化(提供堆栈寄存器、优化堆栈指令的速度),导致了最终我们都得选择这种结果。别的设计并非不存在,比如 forth 语言就依赖双堆栈来工作。btw ,forth 这种小语言,至今也未能消失。它的大量使用甚至鲜为人知。比如在 boot firmware 领域的地位就无可取代。
C 在静态语言中没有太大的竞争者其实也是 C 的悲哀。造成了在 C 能力临界点上的领域,它依旧成了最好的选择。这造成了大家在低阶开发上把 C 当万能药来使。今天看来,没有 C 是万万不能的,这也是一个历史选择的结果。假若当年 pascal 战胜了 C ,现今所有用 C 写的代码都用 pascal 来实现也未尝不可。
C 在历史的选择中走到了今天,当然还会一直存在下去。
云风 提交于 January 12, 2007 01:06 PM | 固定链接
TrackBack
如果你想引用这篇文章,请复制下面的链接
http://blog.codingnow.com/mt/mt-tb.cgi/221
Comments
类似MIS的行业应用已经成为国内主流,个人很喜欢C/C++~但也必须承认在商业开发上C语言的劣势,GC的先天性问题必须要求程序员具备更高的素质.
Posted by: Shawn | January 19, 2007 03:33 PM
信仰问题,嘿嘿
Posted by: c0der | January 17, 2007 09:43 PM
文中的“近期网上最热门”的“网上”指的是哪里?比如,哪个社区或者BBS之类。
Posted by: 迪伦 | January 15, 2007 03:47 PM
最近国内外都在讨论语言的问题,客观上这是计算环境变迁,旧语言不能适应新环境的一个反映。看一下这篇文章:
http://tomayko.com/articles/2006/12/30/ruby-java-co-op
Posted by: myan | January 15, 2007 10:28 AM
这个问题对于还没真正进入公司做产品的我来说真的值得关注。我想深入地学习C++,如果花了大量精力进去,在未来的某一天C++的市场突然减少,我真是悲惨啊。也想学Java,但如果这样,由于时间限制,也必然地制约了对C++深入的了解。每看到这样的争论都比较郁闷,也在思考,如何清晰看到未来的方向?
Posted by: Leo | January 14, 2007 09:27 PM
C的胜利是 unix 的附属物.
Posted by: mike | January 12, 2007 09:30 PM
http://forum.techweb.com.cn/thread-49059-1-2.html 这个连接基本上可以说明提C语言xx的站点的档次了。这个问题根本就没有争论的比较,华为中兴大把用C开发的系统,他们比任何国内做什么外包的公司都大。。。
Posted by: sunway | January 12, 2007 05:47 PM
我从来没有观点说 gc 是不需要的。C 里面不是不需要,是做不出来。
gc 主要是用来回收内存的,不是用来销毁对象的。在不在确切的地方销毁对象跟 gc 关系不大。尤其在 C 里,对象并不是一个普遍采纳的概念。如果 C 有一天支持了 gc ,也跟对象的构造和销毁无关。
引用计数是一个方案,但是却有性能问题。没能采用 gc 的方案是受 C 语言本身的限制而已。
Posted by: Cloud | January 12, 2007 04:32 PM
呵呵,我记得云风去年的观点是对象被分配出来一定有一个确切的地方被销毁,因此自动内存管理(GC)在C里面是不需要的。 GC在C语言发明前就已经随着LISP被发明出来了,没有被纳入C应该是设计原则所决定的,如果今天再从头发明一遍C,GC可能还是不会被采纳。个人认为在C++里面引用计数的指针指针是替代GC最实用的折中方案,虽然云风很排斥这个。但是目前为止我没有看到过更好的方案。我之所以反驳说C/C++已死,是出于性能上的考虑。现在我们可能为了性能而选择C/C++,将来我们可能为了性能而放弃C/C++。失去了性能优势的C/C++对于上层应用来说还有什么值得我们选用?
Posted by: analyst | January 12, 2007 04:00 PM
Erlang代表未来
Posted by: Atry | January 12, 2007 03:21 PM
讨论了n久了,真是无聊,还不如写点代码。
Posted by: QIANGSIR | January 12, 2007 02:45 PM
< name=comments_ ="if (this.bake.) rememberMe(this)" =http://blog.codingnow.com/mt/mt-comments.cgi method=post>< type= value=1 name=static> < type= value=221 name=entry_id>
Post a comment
如果你有 TypeKey identity(它可以帮助自动审核发言), 可以登陆 使用
< id=comment-author size=30 name=author>
< id=comment-email size=30 name=email>
< id=comment-url size=30 name=url>
< id=comment-text name=text rows=10 cols=30>
< src="http://www.google-analytics.com/urchin.js" type=text/>
< type=text/>
_uacct = “UA-1194145-1″;
urchinTracker();