C与C++社区混战,C#会重蹈覆辙吗?

最近,Linux之父Linus Torvalds在事隔三年之后,又一次炮轰C++语言(见http://www.realworldtech.com/forums/index.cfm?action=detail&id=110563&threadid=110549&roomid=2)。在国外技术社区掀起新一波的批判C++语言的狂潮。国内技术社区也不甘清净,csdn在这里(http://news.csdn.net/a/20100612/218785.html)也有非常热烈的讨论。国内C++的大牛网易的云风也加入论战(http://blog.codingnow.com/2009/01/the_new_c_standard.html),似乎C++一无是处。
总结目前各方对C++的批判,主要观点如下:
1. 做系统底层编程(比如linux内核、网易游戏引擎),C++和C相比没有任何优势。因为底层编程不需要C++那么多的“面向对象抽象”
2. 做上层应用编程(比如CRM、ERP等企业应用),虽然需要“面向对象的抽象能力”,但C++过多的语言机制导致C++语言陷阱太多(特别是稍不留神就有内存泄漏),因此应该选用提供垃圾收集机制的语言。(Linus没说,但是基本指的是C#、Java几个主流语言)。
虽然这种说法有些太过绝对,但是firelong认为还是相当有道理的。特别是第2点,因为以前我们公司就有一个C++写得CRM项目,刚开始老板还让我们在C++上继续改,改了将近半年,全体人员都决定放弃了,转到现在的C#上。Linus这种观点出来后,C#社区好像很受鼓舞,我甚至在某个论坛上看到一些C#程序员在欢呼C#万岁了。但是firelong的问题是,C#语言真的完美了吗?仔细思考这个问题后,firelong认为并非如此。事实上C#语言现在一路狂奔,有点重蹈当年C++语言发展的覆辙。firelong将不成熟的思考写出来,与大家共同讨论。
firelong认为C#目前可能重蹈C++语言覆辙。微软从2002年C# 1.0开始,到2010年8年时间推到C# 4.0,平均每2年一个新版本。其中属于重大的语言特性有:泛型、Lambda表达式与linq、dynamic动态特性、并发编程。除了重大语言特性外,还有很多很多技巧语法。微软这样一路狂奔,只要是想出来的cool点子,都往C#语言里面加。 很多程序员也很追求cool的效果,瞧瞧看,我们C#语言又有XXXXXXXXX功能,你们Java、Python  XXXXX有吗?
但问题是“新特性越多,语言就一定越强大吗?”,我们真的需要那么多cool特性的编程语言吗?C++语言走到今天的墙途末路,众人踩踏的地步,跟C++语言过于臃肿的功能特性密切相关。
 
firelong有限几年的编程经验表明,语言新特性对语言并非一本万利,而是可能会带来很多伤害:
1. 新特性加重了编译器的编译负担,编译效率低下。大家试试很多linq项目的编译速度就知道了。
2. 新特性加重了运行时的运行负担,运行效率低下,大家试试很多dynamic动态新特性的运行效率就知道了。
3. 新特性加重了程序员的心智负担,在写代码时必须考虑很多功能背后的影响,“顾前思后”就是C++程序员最后抛弃C++的一个很大的原因。大家回想一下现在在VS2010底下写C# 4.0程序,还有当初写C# 1.0程序的流畅性了吗? 
 
有的朋友可能会说,那是firelong水平低,对这些新特性没有掌握好,所以要批判C#新特性。首先firelong水平不一定低(带一个10人的C#队伍已经近2年)。其次水平再高,也有心智负担。看看Linux之父Linus Torvalds和网易的云风等诸多国内外大牛批判,他们可都是响当当的C++技术大牛,难道是对C++各种特性不熟练所以才批判C++?
综上所述,飞龙对C#编译器组有以下建议:
保留C#以下功能:
1. 面向对象
2. 接口
3. 构造器、字段、方法
4. 垃圾收集
5. 异常
6. 并发支持——这是firelong唯一投票支持的新特性,因为它在今后的项目太常用了。
7. 和其他语言的互操作(类似P/Invoke)——那些不适合C#做的,用其他语言来做,然后与C#互操作。
然后将研发精力投入C#语言的代码优化和内存收集优化上,让C#成为一门效率超高的语言,比那些华而不实的新特性重要得多!
删除C#以下功能:
1. 委托和事件(这些都可以用接口来做,参考Java)
2. 反射(反射用处很小,如果真想用反射,请用其他语言)
3. 特性(也可以用接口做,C++没有特性不是一样活得很好)
4. 属性、索引器、析构器(都是方法)
5. JIT编译(直接编译成native代码,完全没必要JIT,微软当初JIT是因为承诺跨平台,但是现在C#真的跨平台了吗?还是Windows上跑,Mono这种阿斗别提了。)
6. 泛型(没必要,用的很少)
7. Linq(去掉,还是用Sql语句+存储过程来的实际)
8. dynamic(去掉,真想dynamic,让ruby、python, f#等去做吧)
9. 还有更多。。。。大家来补充
firelong说得不一定对,但是firelong相信一个简洁、高效的语言,比那一堆华而不实的“新特性”要有用得多——语言最后的威力是“开发软件”,而不是“比拼新特性”。为什么C语言至今仍是编程语言的王者?它满足了简洁、高效!而不是它有很多新特性。如果C#不这么做,将会有其他语言埋葬C#。就像C慢慢埋葬C++,Ruby慢慢埋葬Java一样。
 
当然微软C#编译器组不会听firelong的建议,但是如果这样下去,C#几年之后将比现在的C++更为臃肿,那时候批判C#的就不止firelong一个人了,恐怕也不仅仅是批判了。
 
非常想听听大家的意见。
 
P.S. 顺便做一个小调查,请大家回帖说一下自己主要在用C# 1.0,还是2.0,还是3.0,还是4.0?


最近,Linux之父Linus Torvalds在事隔三年之后,又一次炮轰C++语言(见http://www.realworldtech.com/forums/index.cfm?action=detail&id=110563&threadid=110549&roomid=2 )。在国外技术社区掀起新一波的批判C++语言的狂潮。国内技术社区也不甘清净,csdn在这里(http://news.csdn.net/a/20100612/218785.html)也有非常热烈的讨论。国内C++的大牛网易的云风也加入论战(http://blog.codingnow.com/2009/01/the_new_c_standard.html)。


总结目前各方对C++的批判,主要观点如下:

1. 做系统底层编程(比如linux内核、网易游戏引擎),C++和C相比没有任何优势。因为底层编程不需要C++那么多的“面向对象抽象”

2. 做上层应用编程(比如CRM、ERP等企业应用),虽然需要“面向对象的抽象能力”,但C++过多的语言机制导致C++语言陷阱太多(特别是稍不留神就有内存泄漏),因此应该选用提供垃圾收集机制的语言。(Linus没说,但是基本指的是C#、Java几个主流语言)。


虽然这种说法有些太过绝对,但是firelong认为还是相当有道理的。特别是第2点,因为以前我们公司就有一个C++写得CRM项目,刚开始老板还让我们在C++上继续改,改了将近半年,全体人员都决定放弃了,转到现在的C#上。Linus这种观点出来后,C#社区好像很受鼓舞,我甚至在某个论坛上看到一些C#程序员在欢呼C#万岁了。但是firelong的问题是,C#语言真的完美了吗?仔细思考这个问题后,firelong认为并非如此。事实上C#语言现在一路狂奔,有点重蹈当年C++语言发展的覆辙。firelong将不成熟的思考写出来,与大家共同讨论。

 

firelong认为C#目前可能重蹈C++语言覆辙。微软从2002年C# 1.0开始,到2010年8年时间推到C# 4.0,平均每2年一个新版本。其中属于重大的语言特性有:泛型、Lambda表达式与linq、dynamic动态特性、并发编程。除了重大语言特性外,还有很多很多技巧语法。微软这样一路狂奔,只要是想出来的cool点子,都往C#语言里面加。 很多程序员也很追求cool的效果,瞧瞧看,我们C#语言又有XXXXXXXXX功能,你们Java、Python  XXXXX有吗?

 

但问题是“新特性越多,语言就一定越强大吗?”,我们真的需要那么多cool特性的编程语言C#吗?

 C++语言走到今天的墙途末路,众人踩踏的地步,跟C++语言过于臃肿的功能特性密切相关。 firelong这些年的编程经验表明,语言新特性对语言并非一本万利,而是可能会带来很多伤害:

1. 新特性加重了编译器的编译负担,编译效率低下。大家试试很多linq项目的编译速度就知道了。

2. 新特性加重了运行时的运行负担,运行效率低下,大家试试很多dynamic动态新特性的运行效率就知道了。

3. 新特性加重了程序员的心智负担,在写代码时必须考虑很多功能背后的影响,“顾前思后”就是C++程序员最后抛弃C++的一个很大的原因。大家回想一下现在在VS2010底下写C# 4.0程序,还有当初写C# 1.0程序的流畅性了吗?  

 

 有的朋友可能会说,那是firelong水平低,对这些新特性没有掌握好,所以要批判C#新特性。首先firelong水平不一定低(带一个10人的C#队伍已经近2年)。其次水平再高,也有心智负担。看看Linux之父Linus Torvalds和网易的云风等诸多国内外大牛批判,他们可都是响当当的C++技术大牛,难道是对C++各种特性不熟练所以才批判C++?


综上所述,firelong对微软C#编译器组有以下建议:
保留C#以下功能:

1. 面向对象

2. 接口

3. 构造器、字段、方法

4. 垃圾收集

5. 异常

6. 并发支持——这是firelong唯一投票支持的新特性,因为它在今后的项目太常用了。

7. 和其他语言的互操作(类似P/Invoke)——那些不适合C#做的,用其他语言来做,然后与C#互操作。

然后将研发精力投入C#语言的代码优化和内存收集优化上,让C#成为一门效率超高的语言,比那些华而不实的新特性重要得多!

删除C#以下功能:

1. 委托和事件(这些都可以用接口来做,参考Java)

2. 反射(反射用处很小,如果真想用反射,请用其他语言)

3. 特性(也可以用接口做,C++没有特性不是一样活得很好)

4. 属性、索引器、析构器(都是方法)

5. JIT编译(直接编译成native代码,完全没必要JIT,微软当初JIT是因为承诺跨平台,但是现在C#真的跨平台了吗?还是Windows上跑,Mono这种阿斗别提了。)

6. 泛型(没必要,用的很少)

7. Linq(去掉,还是用Sql语句+存储过程来的实际)

8. dynamic(去掉,真想dynamic,让ruby、python, f#等去做吧)

9. 还有更多。。。。大家来补充

firelong说得不一定对,但是firelong相信一个简洁、高效的语言,比那一堆华而不实的“新特性”要有用得多——语言最后的威力是“开发软件”,而不是“比拼新特性”。

为什么C语言至今仍是编程语言的王者?它满足了简洁、高效!而不是它有很多新特性。如果C#不这么做,将会有其他语言埋葬C#。就像C慢慢埋葬C++,Ruby慢慢埋葬Java一样。 

 当然微软C#编译器组不会听firelong的建议,但是如果这样下去,C#几年之后将比现在的C++更为臃肿,那时候批判C#的就不止firelong一个人了,恐怕也不仅仅是批判了。


 非常想听听大家的意见。 P.S. 顺便做一个小调查,请大家回帖说一下自己主要在用C# 1.0,还是2.0,还是3.0,还是4.0?

 

posted on 2010-06-20 13:38  firelong  阅读(...)  评论(...编辑  收藏

导航