StdExt/WinxGui/Erlang/Erlana - 许式伟的专栏

许式伟 ID:xushiweizh
365923次访问,排名123好友1人,关注者24
xushiweizh的文章
原创 117 篇
翻译 0 篇
转载 10 篇
评论 854 篇
许式伟的公告

本博客内容除非特殊说明均属原创,如需转载、引用其中的部分文字,请注意以下几点:

1)请在转载(引用)的内容开始添加本人署名,并提供本博客中相应文章的链接。如你的作品为非电子读物或纯文本,请给出链接的url。

2)请勿用于商业用途。

3)如果愿意,请给我邮件:xushiweizh@gmail.com,让我知道我的东西到哪去了。谢过。

重要链接


订阅

最近评论
blooney:看不了。。。。
唉,
Forbidden
Your client does not have permission to get URL /group/erlang-china/attach/eff00449bf45bb58/%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E4%BA%86Erlang……
blooney:然后最好,让更多的人也选择Erlang哈哈哈
blooney:Erlang用higher order func这样处理的话,是不是就不需要Array了,对单个处理的话,感觉还是List就足够了啊,呵呵
您说的fail fast是不是就是直接让process crash掉啊?
Xviewee:这样写有什么好处呢,LZ可否解释一下。为什么要存在这样的写法。。
hezhibo:感觉有点逗号表达式的功能?
int a=(int i=0, i++,i);
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
相册
DocX预览图
Google vs. 百度
WinX相关
WINX团队
ebasil的专栏(RSS)
VisualFC/WINX专栏(RSS)
任风行(一路奔跑)(RSS)
绅士亦花心之WINX相关(RSS)
许伟群的专栏(RSS)
友情链接
QWL1996的专栏(RSS)
Sting的专栏(RSS)
SunHui的专栏(RSS)
不亦快斋(RSS)
于无声处(RSS)
手机开发论坛
珠穆朗玛(老汉)(RSS)
福&柯实验室(RSS)
存档

原创 驳“C语言已经死了”

新一篇: 文本分析的三种典型设计模式

驳“C语言已经死了”

许式伟
2007-1-7

  现在,有很多C/C++程序员总是自命不凡,看不起其他开发人员。其实,或许别人更看不起他呢!
>> 有偏见的永远只是个体,而不是群体。作者加了后面那句,无疑证明有偏见的不是C/C++程序员,而正是他自己。

  学生时代,我也曾醉心于C/C++,但时至今日,始终无法写出无懈可击的C++代码,所以我始终认为我不会C/C++。这些年,我一直在寻找编写C++代码的最佳模式。但是,老实说,我还没有见到过哪个称得上高手的C++程序员,也没有见到过写得Very good的C/C++代码。C/C++代码总是丑陋不堪,BUG丛生!
>> 这段话更加荒谬了。没见过优秀的C/C++代码? C++标准库(STL)如此优雅。况且,有那么多经典的C/C++开源作品,以及无意之中泄漏的Windows NT核心源码,哪一样不是绝世之作?我为作者浅陋感到难过。

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

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

  1、内存分配

  仅仅关于这一点我就能写整整一篇文章了,也许能写一本书,甚至还有可能写出能够塞满图书馆技术书籍那块,那么多的内容。内存分配和存储单元分配的存在确确实实是个大麻烦。你要不就是分配太少的内存不够用,要不就是分配了太多内存浪费掉。这里的问题就是:怎么把它初始化为零呢?还是干脆就不初始化它。但最挠头的步骤还是释放内存。所有已有的工具包都会帮助你确认,你是否已经释放了之前分配的每一位的内存,在释放完之后是否永远不使用它,并且会阻止你,永远不要释放它第两次。更严重的是,分配内存和释放内存在C语言中都是很慢的,非常慢。使用内存分配时,要考虑的各种特殊情况,我真是连想都不愿意去想,只要问题(对象)的大小合适,我更愿意使用栈空间或者事先分配的结构空间。如果这么做的话,我就有更值得烦恼的事了。话说回来,发明垃圾处理器那人真应该得诺贝尔奖。
>> 内存管理是程序设计中最经典的话题。GC无疑是内存管理一个伟大的变革,但是我只是把它看作内存管理的一个解决方案,而认为不是唯一的解决方案。比GC更加优雅的方案不见得没有。我比较倾向于在特定的情况下选择合适的内存管理方案,而不是没有任何选择的余地,而这正是C/C++的伟大之处。 所有那些GC语言(如Java、C#等)均把这个解决方案强加给程序员,这一定程度上来说减轻了程序员的负担,但是也同时约束了程序员的主观能动性。"分配内存和释放内存在C语言中都是很慢的"?不知道作者从哪里获得的结论。

  2、多线程

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

  3、指针

  指针太难以控制了,太阴险了;我甚至没有委婉一点的方式去形容它。我生命中每年都有几个月被用来调试那些奇怪的指针问题。我过去常常努力获取所有的诀窍,比方说难以理解的构成符、联合体和偏移量,以及重用最后两位做标记,还有所有其他的诀窍。但我发现这么做根本不值得。其他语言的静态引用就可以解决了。
>> 指针是C/C++过于灵活的体现。使用指针的代码可以写得很丑陋,但一样可以很优雅。——这一点上用何种语言不会有区别。我相信,可以写出优雅的Java代码,那么也一定可以写出同样优雅的C/C++代码。而反之则未必(因为有些C++某些范式是Java所不能支持的)。C/C++语言中的选择太多,这的确是令人困惑的,但不见得是劣势。我对C/C++程序员的建议是,多了解和使用C++标准库,而不是过于纠缠指针相关的细节。

  4、过早的优化

  说到诀窍,你是否曾经浪费脑细胞去研究究竟*p++是不是比p[i]快?你是否曾经花时间去试着做点变化来代替乘法,或者去尝试使循环中的倒置运行更快的方法?还在为传递一个参数的速度和反对添加结构,并且传递它的速度一样而苦恼不已?停吧!算法是速度的关键,程序员的水平决定了他会使用那些算法。知道这一点能让你的程序更好,更快一点并且让你的脑袋少扭几个筋。好吧,有一些例子也许可以这样做的……不,你就别那么做就行了!
>> 算法优化是程序设计的关键。但是通常情况下,所有语言(包括C/C++)的程序员研究的是关键路径的优化。研究*p++是不是比p[i]快?我相信这是标准库的实现者要考虑的事情。所不同的是,C/C++程序员也可以和标准库的作者一样去考虑这些细节,而其他语言的程序员被剥夺了这个权利。

说到优化,话题就多了。我曾经向C#的Dictionary中插入了1亿条整数(从1万多个文本文件中读入),结果发现程序运行了整整一个下午仍然没有完成。而我改用C++的std::map,20分钟就搞定了。再试试对50万条自定义的结构体数据进行排序,我相信你和我一样,会深深喜欢上C++的的高效而优雅。

  5、测试

  你最喜欢的C的单元测试的工具是哪个?嗯…一个也想不到?单元测试一定是一点也不重要,是吧?或者是太麻烦了,很难跟上进度,浪费时间。你可以把这个时间用到更加有用的事情上,让它只占用工作时间的1%,那还比较合适。或者在数据中心,通过优化的没有标记的图形来调试这个仅仅由100个同时在线使用者引起的问题。
>> C++的测试工具,作者居然一个都想不到,我只能猜想可能他是比较喜欢自己制造轮子的那一类。和JUnit对应的CppUnit,难道也想不到?提起CppUnit,我以前用它进行单元测试,但从实现架构上说,我认为它继承了Java代码的臃肿。我在WINX提供了一个Mini版本的CppUnit,代码量大概只有几百行,功能绝不比CppUnit弱。(要了解WINX,请看这里)。

  我本来应该继续再说一些原因的,但是5个现在就足够了;说完这些,现在感觉好点了。C以前是非常棒的…那是在1984年的时候。直到今天,那些用C写的新代码都让我感到惊喜…如果你让我比较的话,我觉得C++只是比C稍微好点。如果你想要学些老一点的语言,不妨尝试Forth,List,或者APL。这些老式的语言起码能教会你,用不同的而且优雅的方式去思考你的程序。
>> 新生的语言,必然会在吸收旧的语言上基础上进行改进。看一个语言的生命力,并不在于看它某些地方存在的不足。事物会发展,并趋于完善。相信C++0x出来后,C/C++语言又将获得新的生命力。单看Java、C#等几个新一代的语言,其中有如此多的C++烙印,就证明了C/C++的影响是巨大的。动不动说一门语言死了,是一种浅薄。

(来源:51cto.com 作者Ed Burnette、编译李安民)

发表于 @ 2007年01月07日 17:40:00|评论(loading...)|编辑

旧一篇: 开源,选择Google Code还是Sourceforge?

评论

#zheng616 发表于2007-01-07 20:39:10  IP: 58.83.40.*
关键是你做出来了什么,你呢?
#maninred 发表于2007-01-07 21:29:29  IP: 59.33.247.*
当今流行的语言,如java,ruby,c#,python等无一不是用C/C++作为底层的实现,操作系统,数据库系统也都是C/C++作为底层实现。

虽然C/C++对一般人而言的确是比较难以驾驭,但是它的威力是无人可以否认的。非常期待C++0x标准的出台。

那些说C语言已死的人只能表明他的无知和肤浅。
#鸟牙 发表于2007-01-07 21:29:53  IP: 61.48.69.*
驳得也太无力了吧?
#demo88 发表于2007-01-07 21:51:32  IP:
关键是你做出来了什么

有道理



#VirtualAlloc 发表于2007-01-07 22:04:02  IP:
>>向C#的Dictionary中插入了1亿条整数(从1万多个文本文件中读入),结果发现程序运行了整整一个下午仍然没有完成。

这说明你会用C#而已。
#hit_component 发表于2007-01-08 08:30:15  IP: 58.62.125.*
IT人的用词总是语不惊人死不休
#dwbclz 发表于2007-01-08 08:32:13  IP: 192.168.0.*
看看你桌面上的程序哪些是基于C/C++。
哪些是基于其它语言的。
是死是活,不言自明
#ssuupvbamd 发表于2007-01-08 09:09:08  IP:
C的衰落,这是不争的事实。死掉到有些夸大。其实java只不过对C及C++更高一层封装。
#YidingHe 发表于2007-01-08 09:31:35  IP: 220.169.30.*
如果要在开发效率和运行效率之间选择,大多数人会选择开发效率。因为使用开发效率高的语言和工具,让人获得成就感要来得快。
#sevencat 发表于2007-01-08 09:31:37  IP: 124.243.200.*
作者浅陋?

那篇文章的作者我觉得很NB的,你看他文章提到的他采用的一些手法,都是高级人员才会去采用的。
#irplay 发表于2007-01-08 09:32:33  IP:
C和C++ 不可以把他们当作同一种语言来说...用途也不一样.C会得到永生,因为他的目的很明确,就是底层开发....而C++却有可能被新兴的语言蚕食掉....
#wangdaniu 发表于2007-01-08 09:53:59  IP: 152.104.237.*
为什么你们还在进行语言之争呢?C只不过是一种思想,把硬件设计用相对直观的方式开放给程序员,程序员在此之上做更高层的架构。Java也好,C++也好,如果没有硬件支持,还不是一堆废铜烂铁?软件架构说白了也就是为了提高效率,消除bug,在开发和使用上给用户提供更大的便利。

“C语言已经死了”,你写了20年的C,对编程的认识还在这么低的层次上,不知道该怎么评价。

许式伟老兄,你也不必逐点反驳他。这些问题的关键不是在于用哪种语言,而是在于哪种解决方案更适合用户。

一点浅见,见笑了。
#wishfly 发表于2007-01-08 09:58:41  IP: 218.246.97.*
>>C和C++ 不可以把他们当作同一种语言来说...而C++却有可能被新兴的语言蚕食掉....

你错了!
虽然的确是两门语言,但又是相辅相成,紧密联系的.
C依靠C++向程序上层发展.
C++通过C以很自然的方式接触底层,发挥效率.
#embeddedsoft 发表于2007-01-08 10:03:57  IP: 60.191.53.*
只感觉一个站在上海金茂大厦的观感台,一个只站在7层楼顶,看的视角不同,远近不同,心境也不同.
#jAmEs_ 发表于2007-01-08 10:08:32  IP: 59.37.32.*
很明顯,反駁樓主的有部分是寫“C语言已经死了”的人
說實在,寫“C语言已经死了”的人很明顯是個菜鳥,以他那水平,根本不足評論這些~~
我個人很少用C。
#xushiweizh 发表于2007-01-08 10:12:12  IP: 219.131.196.*
to VirtualAlloc: 后来我改用SortedDictionary,因为我猜想Dictionary是hash_map,SortedDictionary是std::map,确实快了不少,但是还是比C++的std::map慢了一倍多。
#marshell0 发表于2007-01-08 10:27:01  IP: 65.93.220.*
Please take a look at
C++之父B. Stroustrup近期言论 翻译者 : myan 出处: http://www.research.att.com/~bs/
(Part of)
I think I needn't say more, enough
2. 学习C++要花多长时间?
这要看你说的“学习”是什么意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。 那么是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这么长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻的变革,那又何苦来哉?跟成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的、不同的语言和编程风格还算是简单的。

3. 了解C是学习C++的先决条件吗?
否!C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。

10. 如果不必和C兼容,你所创造的语言是不是就会是Java?
不是,差得远。如果人们非要拿C++和Java来作比较,我建议他们去阅读The Design and Evolution of C++,看看C++为什么是今天这个样子,用我在设计C++时遵从的原则来检验这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按:我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的语法,与Sm alltalk相似的语义。所以可以说Java与C++是貌合神离,与Smalltalk才是心有灵犀)。Java语言相对简单,这部分是一种错觉,部分是因为这种语言还不完整。随着时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路。随便分析一种你认为在很大范 围内取得了成功的语言,我知道肯定是无有例外者,而且实际上这非常有道理。
上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强对于固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要做很多小的改动,大部分是扩展。1998年秋,我从James Gosling(Java语言的创始人——译者)那里得到一份建议书,说是要在Java中增加固有类型、操作符重载以及数学计算支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的How Java’s Floating-Point Hurts Everyone Everywhere(“且看Java的浮点运算如何危害了普天下的芸芸众生”——译者),揭露了Java的一些秘密。我发现在电视和出版物中关于Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫嚣凡是非Java的代码都是垃圾,这是对
#numbbb 发表于2007-01-08 10:32:20  IP:
呵呵,每年数千亿美元的嵌入式市场,90%用的都是标准的C作为开发语言。
#wd_6532 发表于2007-01-08 10:35:56  IP: 221.122.49.*
我用C语言编程已经超过20年了。我写过C语言的编译器、C语言的调试器、用C开发的其他语言、游戏、客户端程序和服务器程序,你说吧!还有什么是我没写过的。还有我的书架上充斥着折了角的K&R和Steele的书。我太了解C语言了,但是,我讨厌他。十分讨厌!

我过去是喜欢C语言的,真的。直到我开始用C开发并维护多线程的服务器
=================
原作者都用C编程20年了,20年后才遇到多线程?
也太操蛋了吧。

自己都矛盾,还说c语言呢。
#BigTall 发表于2007-01-08 10:37:21  IP: 218.18.140.*
如果你想要写一个操作系统或者某种语言的虚拟机,你就知道为什么要用C写了,因为除了C之外,当前流行的语言都不能保证函数只从return的位置返回:因为C没有异常,这反而是一种优势!

建议大家读一下“exception c++”。也给大家一个题目:

int func1(int val, int val2)
{
printf("%d", val / val2);
return val / val2;
}

这个程序有几个出口?
#BigTall 发表于2007-01-08 10:37:22  IP: 218.18.140.*
如果你想要写一个操作系统或者某种语言的虚拟机,你就知道为什么要用C写了,因为除了C之外,当前流行的语言都不能保证函数只从return的位置返回:因为C没有异常,这反而是一种优势!

建议大家读一下“exception c++”。也给大家一个题目:

int func1(int val, int val2)
{
printf("%d", val / val2);
return val / val2;
}

这个程序有几个出口?
#seagate 发表于2007-01-08 10:41:52  IP: 210.76.108.*
从 “C语言已经死了” 这篇文章中,完全看不出来作者如何从自己论据中证明C语言已经死了,他只不过举出了一些初级程序员无法驾驭的C难点,甚至是在偷换概念。从原文中完全无法看出c语言是如何“死了”。作者用这种标题无非是在炒作,鄙视这种人。
#FantasyNES 发表于2007-01-08 10:50:50  IP: 60.215.83.*
分配内存和释放内存在C语言中當然都是很慢的。
#FantasyNES 发表于2007-01-08 10:50:50  IP: 60.215.83.*
分配内存和释放内存在C语言中當然都是很慢的。
#FantasyNES 发表于2007-01-08 10:51:17  IP: 60.215.83.*
分配内存和释放内存在C语言中當然都是很慢的。
#fengjian_net 发表于2007-01-08 11:19:18  IP: 219.220.210.*
nt func1(int val, int val2)
{
printf("%d", val / val2);
return val / val2;
}

这个程序有几个出口?
这种问题对于其它语言同样存在,如:
sub abc()

c = sqrt(-1)
a = c
end sub
同样有几个出口?
#blueflag 发表于2007-01-08 11:36:49  IP: 61.163.220.*
学习中~
喜欢看大家的争论,在争论中,可以学习到很多~
#xiueplane 发表于2007-01-08 12:01:44  IP: 222.222.60.*
我是C++的忠实支持者~
1> 顶楼主啊~
2> 现在开发语言的发展追求的是开发效率~或者说现在编程的商业味道越来越浓,也就越来越 也就越来越脱离编程中那类似于艺术的东西~所以越来越多的人放弃了c
3> 如果你是个谋生者,C确实有点苍老,Java,C#确实你是不错的选择,但如果你把自己当作一个程序员,当作一个编程的而不是一个赚钱的来说,C,绝对是你不能放弃的~
#joyous 发表于2007-01-08 12:08:32  IP: 222.221.220.*
一般来说,说C很烂的都是技术平庸之人
#diannaomingong 发表于2007-01-08 12:20:22  IP: 121.68.199.*
C在会用的人手里是开山利器
但不可否认的是,会用的人始终是少的

大多数时候,因为某些同志对C的操作水准有限,害得其他人寝食难安

现在C的应用走过了几十年,问题不是"你说吧,有什么程序我没编过"
而是
"你说吧,有什么C程序世界上没人编过"
太多重复建设,太多辛苦重来了,C不是一个高开发效率的语言
#Analyst 发表于2007-01-08 12:53:41  IP:
呵呵,我也来勃一勃。
全文请看
http://blog.csdn.net/Analyst/archive/2007/01/08/1476994.aspx
#dzfb 发表于2007-01-08 13:09:56  IP:
一个熟练使用C/C++的人可以很快的上手java c#
请问反过来可以吗?
java 的虚拟机 .net框架又是拿什么写的呢?
没了c/c++,java和.net在哪儿?
儿子厉害了就说老子死了?
无稽之谈
#rexfa 发表于2007-01-08 13:48:20  IP:
如果陌生的话,使用简单的语言赚到钱也确实无妨,这些语言更加接近人类。如果做研究什么的C C++当然是首选,比JAVA C#更接近机器,比汇编更接近人。

以上发言的高手们,你们靠什么生活呢,生活的好么?敢问都用什么语言?平时都搞啥研究?
#gmdroc 发表于2007-01-08 14:08:05  IP: 192.168.0.*
Java 理论与实践: 再谈 Urban 性能传言
http://www.ibm.com/developerworks/cn/java/j-jtp09275.html
分配比想像的要快,而且会变得更快

Brian Goetz, 首席顾问, Quiotix

2005 年 10 月 20 日

Java™ 语言遭到许多性能方面的攻击。虽然有些攻击可能是名符其实的,但是看看公告板和新闻组上关于这一主题的贴子,可以发现,对于 Java 虚拟机(JVM)实际的工作方式存在许多误解。在本月的 Java 理论与实践 中,Brian Goetz 驳斥了反复重复的有关 JVM 分配慢的传言。请与作者和其他读者在配套的 讨论组 上分享您对这篇文章的想法。(也可以点击文章顶部或底部的 讨论 来访问讨论组。)

流行问题:哪种语言的原始分配性能更快,Java 语言还是 C/C++?答案可能令人惊讶 —— 现代 JVM 中的分配比执行得最好的 malloc 实现还要快得多。HotSpot 1.4.2 之后虚拟机中的 new Object() 常见代码路径最多 10 条机器指令(Sun 提供的数据;请参阅 参考资料),而用 C 语言实现的执行得最好的 malloc 实现,每个调用平均要求的指令在 60 到 100 条之间(Detlefs 等;请参阅 参考资料)。而且分配性能在整体性能中不是一个微不足道的部分,测评显示:对于许多实际的 C 和 C++ 程序(例如 Perl 和 Ghostscript),整体执行时间中的 20% 到 30% 都花在 malloc 和 free 上,远远多于健康的 Java 应用程序在分配和垃圾收集上的开销(Zorn;请参阅 参考资料)。

继续,弄得一团糟

没有必要搜索众多的 blog 或 Slashdot 贴子,去寻找像“垃圾收集永远不会像直接内存管理一样有效”这样能够说服人的陈述。而且,从某个方面来说,这些话说的是对的 —— 动态内存管理并不一样快 —— 而是快得多。malloc/free 技术一次处理一个内存块,而垃圾收集机制则采用大批量方式处理内存管理,从而形成更多的优化机会(以一些可以预见到的损失为代价)。

这条“听起来有理的意见” (以大批量清理垃圾要比一天到晚一点点儿清理垃圾更容易)得到了数据的证实。一项研究(Zorn; 请参阅 参考资料)测量了在许多常见 C++ 应用程序中,用保守的 Boehm-Demers-Weiser(BDW)替换 malloc 的效果,结果是:许多程序在采用垃圾收集而不是传统的分配器运行时,表现出了速度提升。(BDW 是个保守的、不移动的垃圾收集器,严重地限制了对分配和回收进行优化的能力,也限制了改善内存位置的能力;像 JVM 中使用的那些精确的浮动收集器可以做得更好。)

在 JVM 中的分配并不总是这么快,早期 JVM 的分配和垃圾收集性能实际上很差,这当然就是 JVM 分配慢这一说法的起源。在非常早的时候,我们看到过许多“分配慢”的意见 —— 因为就像早期 JVM 中的一切一样,它确实慢 —— 而性能顾问提供了许多避免分配的技巧,例如对象池。(公共服务声明:除了对最重量的对象之外,对象池现在对于所有对象都是严重的性能损失,而且要在不造成并发瓶颈的情况下使用对象池也很需要技巧。)但是,从 JDK 1.0 开始
#gmdroc 发表于2007-01-08 14:08:07  IP: 192.168.0.*
Java 理论与实践: 再谈 Urban 性能传言
http://www.ibm.com/developerworks/cn/java/j-jtp09275.html
分配比想像的要快,而且会变得更快

Brian Goetz, 首席顾问, Quiotix

2005 年 10 月 20 日

Java™ 语言遭到许多性能方面的攻击。虽然有些攻击可能是名符其实的,但是看看公告板和新闻组上关于这一主题的贴子,可以发现,对于 Java 虚拟机(JVM)实际的工作方式存在许多误解。在本月的 Java 理论与实践 中,Brian Goetz 驳斥了反复重复的有关 JVM 分配慢的传言。请与作者和其他读者在配套的 讨论组 上分享您对这篇文章的想法。(也可以点击文章顶部或底部的 讨论 来访问讨论组。)

流行问题:哪种语言的原始分配性能更快,Java 语言还是 C/C++?答案可能令人惊讶 —— 现代 JVM 中的分配比执行得最好的 malloc 实现还要快得多。HotSpot 1.4.2 之后虚拟机中的 new Object() 常见代码路径最多 10 条机器指令(Sun 提供的数据;请参阅 参考资料),而用 C 语言实现的执行得最好的 malloc 实现,每个调用平均要求的指令在 60 到 100 条之间(Detlefs 等;请参阅 参考资料)。而且分配性能在整体性能中不是一个微不足道的部分,测评显示:对于许多实际的 C 和 C++ 程序(例如 Perl 和 Ghostscript),整体执行时间中的 20% 到 30% 都花在 malloc 和 free 上,远远多于健康的 Java 应用程序在分配和垃圾收集上的开销(Zorn;请参阅 参考资料)。

继续,弄得一团糟

没有必要搜索众多的 blog 或 Slashdot 贴子,去寻找像“垃圾收集永远不会像直接内存管理一样有效”这样能够说服人的陈述。而且,从某个方面来说,这些话说的是对的 —— 动态内存管理并不一样快 —— 而是快得多。malloc/free 技术一次处理一个内存块,而垃圾收集机制则采用大批量方式处理内存管理,从而形成更多的优化机会(以一些可以预见到的损失为代价)。

这条“听起来有理的意见” (以大批量清理垃圾要比一天到晚一点点儿清理垃圾更容易)得到了数据的证实。一项研究(Zorn; 请参阅 参考资料)测量了在许多常见 C++ 应用程序中,用保守的 Boehm-Demers-Weiser(BDW)替换 malloc 的效果,结果是:许多程序在采用垃圾收集而不是传统的分配器运行时,表现出了速度提升。(BDW 是个保守的、不移动的垃圾收集器,严重地限制了对分配和回收进行优化的能力,也限制了改善内存位置的能力;像 JVM 中使用的那些精确的浮动收集器可以做得更好。)

在 JVM 中的分配并不总是这么快,早期 JVM 的分配和垃圾收集性能实际上很差,这当然就是 JVM 分配慢这一说法的起源。在非常早的时候,我们看到过许多“分配慢”的意见 —— 因为就像早期 JVM 中的一切一样,它确实慢 —— 而性能顾问提供了许多避免分配的技巧,例如对象池。(公共服务声明:除了对最重量的对象之外,对象池现在对于所有对象都是严重的性能损失,而且要在不造成并发瓶颈的情况下使用对象池也很需要技巧。)但是,从 JDK 1.0 开始
#kwanhong 发表于2007-01-08 14:49:47  IP: 192.168.6.*
SortedDictionary和Dictionary在添加元素时会根据项目数来分配空间,空间的大小M是2的N次方,一旦元素个数达到M/2时就会扩大一次。而且每次扩大时都是先分配空间然后再将旧的元素COPY过去。
这样的原理在项目数不多时工作得很好,而如果项目过大,而在实例化时的构造函数里又没有制定一个初始的大小时,就会工作得很慢。。。
而实际应用过程中,项目数大部分情况下不会很多的。

.net的对象都存在一些优化算法在里面的,有兴趣的可以反编译来看看。这些优化对于一般的应用是很有帮助的,而如果有特殊需要的话建议自己构造一个Dictionary专门处理特殊的应用。

总之你不能因为这样的一个特性而说C#很慢,只能说。NET的类库不够丰富以应付所有的情况。
#yingbinma 发表于2007-01-08 16:53:01  IP: 222.85.77.*
C语言没事,他心死了……
#wsc 发表于2007-01-08 18:05:37  IP: 124.64.25.*
JAVA是用什么写的?
#VCFansKing 发表于2007-01-08 18:10:30  IP: 220.231.1.*
古老不意味着死了,只要你精通了这门语言,永远不会死,就像汇编
#willko 发表于2007-01-08 18:18:58  IP: 58.62.159.*
C正是有他的缺点所以才能作为低层开发语言
#cyantree 发表于2007-01-08 18:50:55  IP: 222.71.166.*
对于linux下的开发人员而言,讨论C是否已死是一个笑话

对于windows下的开发人员,如果面向的是企业应用,那么可以说接触C的机会和必要的确很少,如果面向是底层或者一些核心开发,C依然是唯一的选择

对于嵌入式的开发人员,除了C还是选择什么?pascal?basic?C#?

不要说C低级,那是因为你还没有学会,不要说C原始,那是因为你还不懂开发
#wenlinqishao 发表于2007-01-08 19:51:36  IP: 59.41.218.*
改天你用其他语言写个比UNIX,LINUX还牛的操作系统后

再说C死了不迟....

-----------------------------------------------------------------------
# cyantree 发表于2007-01-08 18:50:55 IP: 222.71.166.*


对于windows下的开发人员,如果面向的是企业应用,那么可以说接触C的机会和必要的确很少,如果面向是底层或者一些核心开发,C依然是唯一的选择

对于嵌入式的开发人员,除了C还是选择什么?pascal?basic?C#?

不要说C低级,那是因为你还没有学会,不要说C原始,那是因为你还不懂开发
-----------------------------------------------------------------------

绝对同意
#dwbclz 发表于2007-01-08 20:34:51  IP: 192.168.0.*
-----------------------------------------------------------------------
cyantree 发表于2007-01-08 18:50:55 IP: 222.71.166.*
对于linux下的开发人员而言,讨论C是否已死是一个笑话

对于windows下的开发人员,如果面向的是企业应用,那么可以说接触C的机会和必要的确很少,如果面向是底层或者一些核心开发,C依然是唯一的选择

对于嵌入式的开发人员,除了C还是选择什么?pascal?basic?C#?

不要说C低级,那是因为你还没有学会,不要说C原始,那是因为你还不懂开发
-----------------------------------------------------------------------
一针见血。

某些朋友从理论角度讨论Java的内存效率具有一定意义,但是
实际效果却当另论。平心而论,无论是Java还是C#,总体执行
效率就是要差一些,放到一个稍微大一点的程序里,这一点就变
得非常明显。
我学过多种语言,现在还是主要使用C++。并非因为它完美,而
是因为对于我所做的项目而言,它是最好的选择。
在构建很多程序的时候C/C++的确不如某些语言方便,但是品质
上却往往更胜一筹。回想几年前,BT大行其道的时候,大多BT软
件都是基于Python的,勉强一用,耗费内存很多,效率很差。
后来终于出现了SimpleBT(Bitcomet的前身),现在的情况大家
也都知道了。
对于发布给很少人用的软件来说,Java或者C#还是很不错的,方便
快捷,做UI绝对胜过C。我们公司也讨论过是否要使用C#来编写内部
工具,我的个人工具,只要是有UI的,就会用C#。不过作为一款商
业软件,选择什么就需要慎重考虑一下。即使是微软的产品,也并没
有那么依赖.net。VS的UI是基于.netframework的,编译器的核心却
依然是C++,谁有兴趣可以看看sscli,看看C#编译器的实现是啥?
有一个开源的.net实现叫mono,基础代码是标准C的。Sun前阵子开
放了JVM的源代码,大家也可以看看是啥实现。
俺们公司做游戏,对这方面也还是了解一点。据我所知,流行的游
戏似乎只有传奇和千年是Delphi的,其它的似乎也是C/C++。也有游
戏使用C核心+脚本语言,比如WOW,这似乎是目前的流行趋势了。
总结一点,把程序员比作一个厨师。C是一把最强的菜刀,C++是组合
刀具,Java等可以认为是绞肉机。什么合适就用什么,这是咱们最好
的选择。组合使用多种工具也是很好的做法。
#wzb13 发表于2007-01-08 20:54:40  IP: 219.134.185.*
等Java死了再来讨论这个问题吧
#jsjjms 发表于2007-01-08 21:01:03  IP: 220.232.79.*
去争论一门语言是死是活本身就是一种肤浅的行为, 语言没有好和坏, 在做一个简单的窗口界面的时候谁也没有VB快,在进行文本处理的时候,谁也没有perl方便.... 各种语言都有各种语言特定的用途. 没有死与活的区别.我在嵌入式行业待了两年,铺天盖地全部是c/c++(大部分是c),从来没有看到过一行java或者delphi.c /c ++怎么会死.
#femalelover 发表于2007-01-08 21:22:41  IP:
许式伟还是很NB的, 尤其是内存管理优化这块肯定是专家, 看过他不少的文章.
#dwbclz 发表于2007-01-08 21:34:23  IP: 61.50.138.*
嗯,C/C++的内存管理效率可以很高。
比如MFC中CPlex的实现,比如STLPort(我没仔细看过)。
SSCLI里有一个NRHeap,比较适合于突发性的大量内存操作。
#bqtiger 发表于2007-01-08 23:51:06  IP: 221.219.102.*
  把优化和资源回收之类的工作交给机器来做是一个办法。有的时候不失为一个好办法。但决不是最好、最安全或者是那种放之四海皆准的办法。

  面对一段代码,没有“谁”能够比写这段代码的“人”更知道它如何才能运行的更好。
  在目前和可以预见的将来,机器相对于人的优势依然是机械的运算而不是其它的什么。机器智能对我们这个世界来说还很弱小、很昂贵、很不稳定。
  并且,机器智能做为一个不太简单的人工系统,象一切稍微复杂一点的人工系统一样,是注定了会有缺陷和漏洞的。在外部力量(通常只能是人)改变和修复它之前,它无法做到自我修复。

  就象“是人对火和蒸汽的掌握,而不是火或者蒸汽本身改变了世界”那样。在一切变革中,起主导作用的只能是人。推动变革的是人的思考(正确的或错误的)和思考之上的实践(当然:正确的或错误的)。所以,从这个意义上来说。过分的解放不见得是件多好的事情。

  这个话题挺没意思的。本来没有任何争论的必要。但是还是多说了两句。。。。。呵呵。
#tczyp 发表于2007-01-09 09:04:09  IP: 58.62.77.*
为什么一再有人证明C#的效率跟C++相差无几(1%~2%的效率损失),而又同时一再有人声称两者效率相差很多。。。老实说,如果效率上只是1%~2%的差别,那么大部分应用就倾向于用java,C#这类半动态语言或者其它全动态语言了。虽然C/C++不会死,但也只能退居二线。所以我非常希望有人能够澄清这个效率问题。
#microyzy 发表于2007-01-09 09:22:40  IP: 220.101.198.*
说了那么多,其实就一句管用的,就是最后那句
#zhmnsw 发表于2007-01-09 09:43:27  IP: 218.12.29.*
基本同意楼主的观点,搬马扎观战。。。
#zhmnsw 发表于2007-01-09 09:45:23  IP: 218.12.29.*
基本同意楼主的观点,搬马扎观战。。。
#dsj1234 发表于2007-01-09 10:47:13  IP: 219.130.85.*
^_^
#zjh222 发表于2007-01-09 12:08:49  IP: 222.212.113.*
当CPU计算能力没有PC的CPU强大的时候,如工控、自动化、智能家电、数码产品等等的时候,你用什么语言开发?
做板级的信号信息处理你用什么?
你所用的种种高级语言又是建立在何种语言做的平台基础之上?
#layerr 发表于2007-01-09 12:24:25  IP: 222.183.196.*
本人不太同意此观点,详见:
http://blog.csdn.net/layerr/archive/2007/01/09/1477754.aspx
#weicanhuang 发表于2007-01-09 12:30:14  IP: 58.248.34.*
其他语言都死光了(包括c++),c也不会死,因为它太基础了,用它可以做任何“事”。

只不过现在很多人只是写写网站,对一些底层技术的东西所知甚少,倒是整天吹,整天抄代码。

#Ropyn 发表于2007-01-09 12:59:03  IP: 218.1.97.*
我不想评论C语言死了没有,用眼睛看就知道。
内存分配效率跟系统实现有关,malloc是调用系统调用来实现的,快慢在于这个库函数封装是否高效。C#,Java等分配的快是怎么得出的呢?难道VM不调用系统调用吗? 即使malloc不够高效,只能说这个实现不够高效。跟C语言有什么关系。
#zfive5 发表于2007-01-09 13:08:14  IP: 202.96.63.*
其实,我本人也看了这个篇文章,感觉作者有些片面,当时我就是很想说说自己的看法,其它是每一种语言都是有它存在的价值,如果单纯说它生或死,简直就是在找骂。当然c语言有c语言的不好,当今这么多的程序就用它,你就不能说它死,现在还没有一个语言敢说自己是完美的。

关于语言的议论,记得上一次就有一个ruby议论,真是好不热闹!


#Ropyn 发表于2007-01-09 13:08:24  IP: 218.1.97.*
我只喜欢C语言。
我喜欢我写的代码经编译后运行在真正的CPU上。我不需要虚拟机来横插一脚,谁知道他在对我的指令进行怎么样的修改。我喜欢看到我写的代码在CPU寄存器之间流动的感觉。

C语言万岁,C语言永不死。
JAVA才会死,世界上最丑陋的语言。
#dwbclz 发表于2007-01-09 13:16:59  IP: 192.168.0.*
缺省情况下,VM确实在内存分配上更高效,它只需递增地址
就可以了,并通过GC来缩并。而且由于GC的存在,内存策略
就比较简单,比如C#等语言无需给String加入引用计数,这
也可以在很多时候提高效率。

C/C++的malloc是低效的,最起码,VC带的malloc是低效的。
所以才会有各种优化手段。优化的C/C++程序可以通过很多方法
来利用内存,比如栈对象,内存池等。多数情况下,一个优化的
C/C++程序整体效率要高于C#,Java程序;未经优化的程序
有可能更低效。
#syhan 发表于2007-01-09 13:31:12  IP: 121.229.7.*
这个驳的不怎么的,不过我也反对”C语言已经死了“
#starwhisperer 发表于2007-01-09 16:28:43  IP:
The author is just complaining something, why you all take that so seriously, kinda stupid.

Everything exists for a reason, there will be ones benefiting from it, there will be ones having nothing to do with it. Just accept the fact and enjoy that funny story, man.
#blastzgd 发表于2007-01-09 17:08:42  IP: 222.212.149.*
有些人问"你做出来什么?"
我觉得有点搞笑.在这样的贴子里,你其实不应该这样问:
Q:"C/C++"做出来什么?
A:这太多了.Java就是它的儿子.

如果人们只去追求某种思想,而没人有去学习"掌握在少数人手里"基于C/ASM在底层的设计与应用.

在当这"少数人"因意外或自然规律而不存在于这个世界上之后.
思考者们,请你们告诉我,你们的思想能做什么?空想而已!

C/C++的人牛X,那是因为在思考者们越来越多的一天,他们越是认识到自己所学的价值,他们觉得自己会有牛X的权力,将来更是这样..
除非,有哪位高人,直接用机器码重写Java的编译器以及Java的开发环境,有哪位高人,能让整个计算机系统中能够没有ASM/C/C++的存在,到那时候,我想,全体做C/C++的人都会对这位思考者五体投地,共道一句牛X!

我不贬低Java之类的"脚本语言",只有一句许想对那些因看不到C/C++价值所在而贬低C/C++或认为"C已死"的思考者们说一句老话:
儿不嫌母丑!
当然,有认为上面这句话不对的人,尽管砖头上来,我受了!
#yulichao 发表于2007-01-09 18:56:16  IP: 58.20.53.*
过早优化确实是错误的。这是高德纳说的
#hello520 发表于2007-01-09 19:46:33  IP: 222.68.42.*
太过完美的东西本身就是不完美的
#luxu001207 发表于2007-01-09 21:07:18  IP: 122.4.192.*
飞机大炮,大刀长矛个有所用!
#_17708668 发表于2007-01-09 23:12:13  IP: 121.35.1.*
看到这个贴子,我就想起一件事:如果有人得以在著名媒体上发表类似“在大街上强奸他人是无可厚非的”之类的内容,肯定即刻招来万人唾骂 ----可见一个毫无意义或者肮脏下流卑鄙的主题,也会有轰动效应和可观的 WEB点击率。
#benneng7601 发表于2007-01-10 09:25:24  IP: 221.196.63.*
哥哥,不比不行呀!早先年FOXBASE还很流行呢,那时还火了一阵子,现在不是彻底死了吗?
#wingfiring 发表于2007-01-10 11:38:59  IP: 202.95.81.*
C语言和C++都在都下坡路.不过,C已经下坡路走了很多年,变化不会很大。而C++的下坡路才刚刚开始,会有一个快速下降的时期。
#kevin_yuanhui 发表于2007-01-10 13:51:01  IP: 61.185.246.*
C语言和C++都在都下坡路.不过,C已经下坡路走了很多年,变化不会很大。而C++的下坡路才刚刚开始,会有一个快速下降的时期。
=======================================
C真的死了嗎?
來這裡看帖的應該都知道華為吧,華為一直在用C作開發,者能說明華為很落後嗎?
C適合開發低層的東西,難度大,週期長;
C#適合開發應用軟件,難度相對小,週期短;
現在很多IT公司都在做應用軟件的開發,所以C#用的多,這並不代表C就死了.
C會死,除非Windows操作系統先死了.
#zhouhongyun 发表于2007-01-10 20:20:50  IP: 219.140.59.*
Q:"C/C++"做出来什么?
A:这太多了.Java就是它的儿子.

--------java,windows,linux,dotnet都是他儿子,它是计算机软件之父.

哥哥,不比不行呀!早先年FOXBASE还很流行呢,那时还火了一阵子,现在不是彻底死了吗?
------foxbase够资格和c比吗,一个是常青树,一个是流行歌手,和foxbase比的应该是java和c#这种流行歌手,全仰仗某个公司的实力,公司一垮也跟着垮,c靠哪个公司撑腰了?看了你对foxbase的评价,我倒更替这两种流行歌手担心了,长不了啊。
#Kryptonum 发表于2007-01-10 21:11:31  IP:
#quote
yulichao 发表于2007-01-09 18:56:16 IP: 58.20.53.*
过早优化确实是错误的。这是高德纳说的
#end quote

这话没错,不过决不是因为它是高德纳说的
#julong88 发表于2007-01-11 08:50:47  IP: 218.83.62.*
你们考虑到嵌入式行业了吗?
c才刚上道啊!
#poshboytl 发表于2007-01-12 01:33:41  IP: 125.71.24.*
我认为似乎作者没搞明白你批驳的文章的意思~~

你要批驳的文章谈的是C
而你谈的很多优点几乎是C++的

这样的批驳有点偷换概念的感觉~~呵呵 个人意见~

还是上面有位朋友贴的 B. Stroustrup的话说的好~~
不要争了~~ 会很浪费时间的 哈哈~
#levelquan 发表于2007-01-14 22:07:46  IP:
认识很皮毛.
只知道当今我们用的开发工具大部份不都是C/C++写出来的吗?
#codestart 发表于2007-01-15 23:30:39  IP: 221.221.155.*
C/C++还是相当有人用的啊,至少我工作半年时间,一直用c语言做开发,而我以前确是花了不少时间学java,毕业设计还是java+C做的。到公司后,c语言是最重要的语言了。估计至少两年内是不会换语言的。
#kulg 发表于2007-01-16 09:58:37  IP:
做嵌入开发的时候不用C/C++用什么?
#kkun_3yue3 发表于2007-01-23 16:26:03  IP: 219.238.187.*
天下大乱了
#gussing 发表于2007-01-23 17:31:00  IP: 220.248.25.*
让认为c已死的人都去学java吧
让他们去挤破头皮的争廉价劳动力岗位
让他们去挡住蜂拥而至的培训了20天java就敢自称it精英的傻逼
或者让他们培训20天java后自称it精英去进攻不学无术的混子们
请把有限的社会资源和工资留给我们这些c/c++程序员吧
#xsiiao 发表于2007-01-23 18:34:40  IP: 219.159.39.*
风调雨顺,为什么庄稼颗粒无收.
#luckysym 发表于2007-01-24 09:06:42  IP: 60.176.177.*
任何事情的发生都是有条件的,包括C语言的死。

毛主席教育我们,要历史地看问题,老外显然不懂历史唯物主义。

很多人都忘记了一件事,C语言的死只是在某些软件领域比如所谓的MIS系统、WEB应用等,而这些软件设计领域,在C语言诞生的时候几乎就不存在,也就是说C语言并不是为他们而存在的,C的诞生时也不可能考虑到要为30年后的企业应用、WEB应用做准备。

尽管C语言在新兴的软件领域并不擅长,但是C语言诞生时就已经存在的那类软件如系统软件,到目前C语言仍旧时这类软件开发的绝对主力。只要这类软件不消亡,C语言就不会死。
#lovesinox 发表于2007-01-24 10:27:59  IP: 125.254.133.*
还没死哦,sinox内核还用她
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 许式伟