我对C++的前景看法&C++和C#的对比
Author:Tr0j4n
From:CSDN
从我进入CSDN VC/MFC的那一刻起,总能在这个版块看到这样那样的讨论VC、C++语言是不是要淘汰,被C#彻底取代诸如此类,这就是传说中的“月经贴”。一些新手可能就会因为看到这些帖子感到迷茫,比如他们正在开始学VC,要是突然发现被淘汰了,岂不是白学了?对此我认真看了每次的“月经贴”,论坛中的一些老大们的言语我也都看在眼里,他们对此是看得很清楚的。接下来我将会用中肯的语言说说我的见解,各位有什么意见可以跟帖讨论。
先说语言,C++作为数据结构入门的最佳语言的说法不少,其实有人认为Java更加适合做数据结构入门的语言,我感觉其实要看个人的喜好。但是C#肯定不会用来做数据结构入门的语言,C++我认为是一个比较好的理解远离的语言,是一切之本。Java中所说的引用,其实也就是C++中的地址传递的一种形式罢了,C++灵活的强制转换,我觉得有得天独厚的优势,拿到一个地址,就能让它成为指向一个数据结构的指针,这是其他语言所无法比拟的。
没有什么语言能比C++更加贴近Windows本身了,这一点也是不可否认的。如果哪一天C#也能写驱动的时候,那么C++就真的会淘汰了(这天可能不会太远又或者很遥远)。
C#能做的,C++不一定都能做,C++能做的,C#也不一定都好做,所以经常看到有人拿这2个语言对比,我觉得确实没什么必要。
C#繁杂的调用Win32 API的方式,确实让人很不舒服,C++这一点做得比它好。但是,C#强大的网络操作,代码量大大地低于C++,我们抛弃不用Socket,改用WinInet或是MFC中的封装好的网络类,比如CHttpFile,还是没C#简单。C#的傻瓜式的类库操作和面向对象编程的完美特性,确实让其成为了Windows平台上最受欢迎的语言。也许,是微软想将Win32 API渐渐地全部封装到C#的类库中去,我感觉微软有这个意图,也许将来C#就不需要调用那些繁杂的Win32 API了,类库中均有提供也说不定。
我们为什么学VC?这点我曾经也问过自己。圣经上说:你必须知道真相,真相会使你自由。我们学VC是为了自由,不受微软的框制。微软通过种种的FrameWork让你陷于其中,你觉得,哇,原来编程是这么容易啊,几句话就能搞定。你想知道微软在内部干了些什么呢?你不知道,当然,你如果认为你没必要知道,这个我完全赞同,我后面会说。就说杀进程吧,C#中不通过Win32 API就那么一种方式,通过System.Diagnostics.Process找到进程,然后Kill之(如果我说的不对,使用C#的朋友请指正),而C++中,我们完全有无数种选择,就说不邪恶的,TerminateProcess,邪恶点的呢?不计其数。进程内存填0,卸载模块,消息洪水,句柄强制关闭,强制释放它的堆,太多太多了,甚至我注入进去,内部Raise一个异常,它也就挂掉了。保护进程, 不管内核下还是应用层,C#肯定是做不了的,C++有自己高端的地方,其他语言无法涉足。你见过C#做的杀毒软件吗?
C#,极其简易的界面操作,令人看着很舒服的编码,他有太多的地方,C++根本无法涉足。拿C++做Web Services除非是大脑进水,用C++做网络蜘蛛,也根本是无聊之举,要么就C#,要么就拿Python来干(个人漏见),超级大量的数据,拿垃圾回收基本上为0的C++去做,简直就是自找麻烦。C#的WebForm,和Jsp占据着Web的大片江山,C++能吗?不能。C#是一门博大精深的语言,类库强大到变态,基本上可以这么讲,所以用C++的朋友也不能随便贬低C#程序员,C#的程序员的层次分得比C++多很多,高层的也是象牙塔级别的。C#的架构师,那种恐怖的实力,C++中级程序员是无法想象的。C#更加注重于软件工程的应用,各种设计模式的使用,C++则注重于实现功能。
C#的前景是不错的,我个人很看好它,MSDN 杂志每期的文章可能有8成是C#,C++不算很多,微软的重心可能在C#上,希望C#逐渐能取代C++。但是C++会这么容易被取代?不可能。就像一个搞管理的,你让他接管搞开发的人,让他从干一样到同时兼干这二样,会有这么简单么?c++的生命力至少还要7-8年,之后才会渐渐的淡出,但是只要追求自由的人存在,C++就不会消失;只要操作系统一天是用C++写的,C++就不会消失。
下面说说语言的选择问题,这2种语言各自的优劣,我在上面都做了简要的比较。我在月经贴中总看到争辩,讨论这2种语言哪个更好,甚至会出现不和谐的字眼。我觉得这是何必呢?各自有各自的天地,请你也不要再说什么C++会没落的的话,那是你自己不用,就说C++没落?就像MSDN英文你看不懂,你就说API垃圾?你自己心里认为它不行,怎么贬低,这个随便你自己心里高兴,别拿出来充专家,更别用自己幼稚的思想左右别人。微软4年前就放言,C#将要取代C++,今年都2009了,每年还不是一样有人跳出来叫嚣?
选什么语言,随自己高兴,需要哪个用哪个,这是不矛盾的。开发数据库,我倾向于用C#,做Windows底层,我肯定是C++,都掌握下没有坏处。VS2010中C++的新特性各位同胞可以关注下,不知道会加入什么,VC2008的特性我探索了这么久,还没有探索结束。C#是越来越好用了,Linq to Sql让不懂数据库的人都能去操做数据库了,辅助一些第三方类库,能发挥强大的威力。完全取代C++,等操作系统是C#写的,C#能开发系统中的一切组件的时候再说吧,至少现在C#还不能开发IsAPI,驱动吧?嘻嘻
[解决办法]
支持楼主,正在学习mfc
[解决办法]
OS大多是C+ASM写的吧……C++对底层支持不好,确切点说,C++还是一个高层语言,不过,微软最近似乎鼓捣了个基于.NET(记不清是.NET还是云计算了)平台的OS,未来的发展还真不好说
[解决办法]
强顶楼主!谢谢在中秋分享这样的心得!中秋快乐呵
[解决办法]
当然底层方面,C#和JAVA是绝对没前途的……
[解决办法]
LZ很客观!
[解决办法]
俺凑个热闹
[解决办法]
正好10楼。
[解决办法]
没意思 没意义
...
...
...
没意思 没意义
[解决办法]
无论别人怎么说,我还是喜欢C++
[解决办法]
楼主你要是不说这句话--c++的生命力至少还要7-8年,之后才会渐渐的淡出。我看了还是高兴的。
我看lz也是中等水平,座等高手来反驳这句话。
[解决办法]
底层我选C,比较高层次的开发,可选的东西一大堆。如果说到Windows平台,我选C#和Python等动态语言,只选对的不选累的,比如WPF/Silverlight可以轻易做出很炫的界面,换作MFC来做,脑子进水了。
至于C++,还真不好说它的前途。至少在我日常工作中,C++的比例越来越小了,能用C做的,不用C++,更加精悍不易出错。
[解决办法]
关键在于积累,厚度,别的不重要,不明真相的即时看了也不明真相,都是别人的东西,争论没的意义,人家都没争,我们倒是屁颠屁颠的。
[解决办法]
放假回家上CSDN不容易,还要跑网吧。
中秋快乐!
[解决办法]
[解决办法]
[解决办法]
其实只需要等待微软的一个消息——.NET代码终于开始运行在核心态了。
如果不幸某天确定了这个消息,VCer们再来诚惶诚恐吧,因为VC坟墓的大门已经打开了,否则,谈论再多都是毫无意义的。
我对未来语言的预测(欢迎拍砖):VC消失了,.NET的概念也不会存在,以后的编程语言可能叫另一个名称,但是非常接近自然语言。程序员也消失了,任何计算机的使用人员都是编程人员,用类似的自然语言告诉计算机做什么事情就行了,唯一的程序员只存在于计算机或者操作系统的公司。
今天是中秋,先祝大家节日快乐。再来点轻松的,如果我是微软,我会这样做:把VC和.NET的名称互换,如果VC被干掉了,剩下的.NET已经改名VC了,反之亦然,大家心里都平衡了。
[解决办法]
支持vc!顶一个!
[解决办法]
呵呵,中秋快乐
[解决办法]
up
MFC学习中。。。
[解决办法]
up
[解决办法]
决定市场的并不全是技术,满足用户的需求是硬道理,最赚钱的产品,往往不是技术上最有优势的
同样能满足用户需求的解决方式,1人月+10000元 VS 2人月+20000元,有多少用户会选择后者呢?
不是公司选择工具,也不是程序员选择工具,真正决定用什么的,应该是最终用户,虽然他们不懂得技术
他们也没有软件这个概念,但是他们总是会选择对自己更有利的东西。一两个普通用户决定不了什么,没什
么影响力,然而全世界的用户,在一段时间的选择之后,将决定成败,这就是用户的力量
作为用户中的一员,我也有过许多选择,从IE到Firefox,从Xp到Windows 7,从IDE到Vim,从SDK到QT,
曾经有个同学用C#开发了一个小软件,我当时是XP,没有.net运行环境,我毫不犹豫的拒绝了体验,因为
我不想那么麻烦,去找一个几十M的东西装上。我想找一个免费的密码管理软件,结果找到了keepass,我
选择了最新版,结果一看,要.net才能用,我嫌麻烦,因为这个软件要放U盘里带着走,别人机器多半是没有
.net的,所以我找到了老版本,不需要.net支持的版本。后来,我买了个手机,它的管理软件是.net开发的,
而且没有其它版本,我只好把那庞大的库装上,因为我没有选择余地,只能选择接受。现在我是Windows 7
系统了,之前很多不能接受的软件,现在都不是问题,我拥有更多的选择余地,这意味着软件厂商对待工具
也有了更多的选择余地。
大公司在发布软件时,特别是比较专业的软件,根本不需要惧怕巨大的安装程序,adobe装完后还会自己备
份一份,占用双倍空间。Oracle的管理软件需要Java,Matlab需要Java,这些人们都接受了。
直接操作其它进程,是比较底层,看上去是比较高级,但是这么做的后果就是,
违背 进程独立,各自隔离 的设计思想,引入不稳定因素,引入潜在错误,同时也把自己局限
于某个具体平台了。
直接访问磁盘,直接读写端口,直接操作网卡,直接XXXX等等,看上去都是些比较高级的用法,
实际上都不可避免的将平台无关性消灭,大大削弱可移植性,甚至影响稳定性。
配置文件不放在自身目录,也不放在用户个人目录,喜欢往注册表里写,某些功能,不用底层操作,
稍微动动脑筋就能实现,却非要搞几个系统API来实现,hook这个hook那个。
然而,这些陋习,经常被当作宣讲VC强大的例子。
VC在Windows驱动领域确实没有竞争对手,拿其它工具做这个事情,不是不能做,是很不方便
函数式脚本语言Haskell写出来的操作系统hOp,除了证明脚本也能写操作系统外,不具有实际意义
但是驱动用C来写也是非常方便的,在嵌入式上面,用GCC也是OK的,C++不是不可替代,而是C++
自己还没有把C替代过去。
如果widnows 7普及,杀毒软件拿C#做也未尝不可,底层用汇编或者C都可以,
跟用户打交道的GUI,用C#做是非常合适的,没MFC什么事情。
C++的前途,是不如过去明晰,受到Java和C的冲击不小,特别是在Linux平台
用过Gentoo或者做过lfs的都应该有所体会,用C语言写的软件,比重还是相当大的
C++过于复杂,难以驾驭,使用不当会让代码难以理解,特别是过于复杂的类层次结构
Linux内核中用C语言实现的多态,要是改成C++,恐怕理解起来就更加困难了
Linux之父创建git的时候选择了C,之所以选择C,就是为了把那些C++程序员踢出去
NT6.0内核和NT6.1内核是用C++的吗?微软内核team的人可以来说明说明情况。好让我们
这些不明真相的群众有所了解。
C++不是VC,C++也不是MFC。银行不会消失,而雷曼兄弟却破产了。
汇编语言没有消失,也很难消失,却在大部分场合被取代了,这就是没落。
[解决办法]
如果取代是没落, 我们反倒应该欣喜。事实上我也不建议,在面向对象,面向应用的领域中,c++和c#,java硬抗,这一领域中,我们应该保持清醒,虽然C++是面向对象,面向应用的高级特性的先行者,但绝不是目前这一领域的最佳选择,包括垃圾回收,反射,属性化,动态执行等诸多特性,由于得到需求的支持而大量应用,单纯C++的力不从心,由此可见一斑。但是又很难解释,C++作为混合编程的一个衔接者,连接着操作系统和上层应用。
在内核,驱动级的底层开发,甚至通信开发,C++也只是以面向过程的方式被使用,与C去竞争这一领域,C++本身的特性又无法得到真正的发挥。
我们不得不承认C++的尴尬。但是我们又从C++实现高级特性的过程中,体会真相的快乐。并灵活运用。C++的部分特性被其他语言所继承,甚至被取代。在混合开发中,C++往往起到妙笔生花的作用。往往在遇到使用更高级语言无法解决的瓶颈问题时,C++总能从根本层次上提供一个解决方案。这在我经历的项目中,屡见不鲜。
mfc是C++的衍生物,它的作用只是承接着历史,而未来,是否需要为C++和C提供一个足够强大的与UI有关的库,是需要考虑,但事实上,已经存在一些选择。所要做的就是等待一个标准的出现。
COM,COM+,DCOM,与C++/c有着紧密的联系,它的未来又是怎样,我们并未看到一个基于C++/C的替代品,所以在几年内,它还是必须存在的。
在一些项目中,使用C++实现web service和调用web service,的确看不到足够的理由,但问题更多的在于web service本身,诸如安全,性能,以及如何传递对象等等问题。
其实用户并不关心使用什么工具,不管是ibm的解决方案,还是微软的解决方案,用户只要求能实现生产运营。平台的选型争议,往往是平台提供商错误的传达给用户,解决方案必须依赖某一类平台,而不是通过程序开发来解决。这就造成了需求中往往用户指定用java,用这个,用那个。
假设企业的技术总监,是java出身,那么必然,他倾向于有利于自己的平台,而不是完全从企业考虑问题。所以说,狭隘的需求是技术总监的需求,而不是企业的需求。真正的需求考虑的是实现功能,运营,生产,解决问题,成本,版权,以及其他诸多因素。java,C#能实现的系统,没有绝对的技术差异,而相对的技术差异,并没有造成不能实现某些应用,不能实现某些需求。不能快速的完成。
我们出身于技术,但不拘泥于技术的选型,对语言的学习使我们的基础,而解决问题时,能够信手拈来是我们学习的成果,也是我们的能力。
[解决办法]
现在这么多的代码都是用 c/c++写得 哪能那么容易扔掉呢?
[解决办法]
月经贴换了一种方式
[解决办法]
up..
[解决办法]
``````````
[解决办法]
看到了J#,,,,悲剧啊!!!!
[解决办法]
7 8年 或许没这么快
[解决办法]
支持!
[解决办法]
不懂也来看下
[解决办法]
C#的程序运行速度会比C++快??不会吧?
C#说到尾,方便!
[解决办法]
不错的讨论,找时间我学学C#。
这样不就得了?反正都是混饭吃,要用什么就用什么。
[解决办法]
工作如有需要的话,一定好好学学的.
技多不压身.
[解决办法]
C++,是一种情结...
[解决办法]
C,是一种情节。
我不太搞的清楚C++,也不太喜欢C++,改觉有向大杂烩发展的趋势。
[解决办法]
微软.Net太狠了,C/C++的人都跑向Linux.
Linux一定得到很大的发展.
[解决办法]
C++是一种“恶搞”~~~纷繁复杂的用法,遍地的陷阱,越来越诡异的语法,越来越诡异的内裤
[解决办法]
[解决办法]
这帖子的讨论氛围相当不错。
[解决办法]
顶一个
[解决办法]
来逛逛
[解决办法]
为什么大家这么喜欢讨论这个???
(让我想起了 笑傲江湖 里的剑宗和气宗)
Bill Gates 以前一直顶Basic ,甚至向所有人挑战!
那为什么Bill Gates不用Basic开发操作系统,而却用C+ASM ?
而且Bill Gates说Basic好,那为什么你怎么还用C,或C++, 或C# ???
难道别人说好的,就一定好吗?
难道别人合适的,就一定合适你吗?
难道别人眼里最漂亮最好的女人,就一定是你眼里最漂亮最好的女人吗?
那你说别人的爸妈是世界上对你最好的人,还是你的爸妈是世界上对你最好的人???
转一篇故事
比长会
夏天的一个晚上,许多动物在草地上参加比长会。森林之王——老虎来当裁判。
比赛开始了,山羊问:“小兔,你的什么最长?”小兔说:“我的耳朵最长,能听见很远很远的声音。”小兔又问:“山羊,你的什么最长?”山羊说:“我的胡子最长,能当拖把拖地。”长颈鹿问:“仙鹤,你的什么最长?”仙鹤说:“我的嘴巴和腿最长,能站在小河里捉鱼。”仙鹤问:“长颈鹿,你的什么最长?”长颈鹿说:“我的脖子最长,能吃到大树上的树叶。”大象问:“松鼠,你的什么最长?”松鼠说:“我的尾巴最长,晚上睡觉能当被子。”松鼠问:“大象,你的什么最长?”大象说:“我的鼻子最长,能吸水洗澡,搬运木头。”蜈蚣问:“鳄鱼,你的什么最长?”鳄鱼说:“我的嘴巴最长,能一口把一条大鱼吃掉。”鳄鱼问:“蜈蚣,你的什么最长?”蜈蚣说:“我的身子最长,比其他小昆虫都长。”大老虎说:“别说了,你们各有所长,各有各的本领。以后你们要充分利用各自的长处,为大家多做好事!”小动物们点点头,依依不舍地离开了这青青的草地。
从此以后,大森林更美丽了,处处充满了团结友爱的气氛。
小动物们再也没有谁瞧不起谁的现象啦,小朋友,你知道这是为什么吗?
[解决办法]
顶一下没什么大不了的
[解决办法]
都是可怜人
[解决办法]
又是月经啊.
[解决办法]
顶一个
[解决办法]
C++会没落吗?我觉得是不太可能了,正如X楼所说,C++程序员跑到Linux上去了,为什么呢?作为C++忠实fans不想看到微软老是偏袒C#,仿佛C#是.Net儿子,而C++则是个即将要出嫁的女儿,C#倾注了众多微软牛人的心血和微软的基因,但是,远方的Linux家族仿佛看不惯微软这样欺负C++,在OS领域,Linux已经不是当年的小屁孩了,已经是正在茁壮成长的青壮年了,linux对C++一见钟情,Linux说出了自己的价值和时下的众多fans,Linux有着服务器市场得天独厚的条件不会这么轻易的退出江湖,相反,正在与Windows做终极PK。所以,C++是不会没落的,要没落也只能是VC++。
[解决办法]
我统计了我windows7 c:\windows目录下的exe以及dll:
total exe number: 1290 , .net exe number: 106
total dll number: 7093, .net dll number: 1477
.net 的exe大概占了8.2%, .net的动态库大概占了20.8%。
微软自己是最大了windows api的使用者,如果哪一天windows系统中可执行程序以及动态库都是.net的,那就说明在windows系统下,.net成为了绝对的主流,目前来看还早。
附带统计用的perl代码,不信你可以自己跑跑看:
use warnings;
use strict;
use File::Find;
use Cwd "abs_path";
sub usage {
print "Usage: find.net.pl TargetDir\n";
exit 1;
}
my @g_exe_list;
my @g_dll_list;
my $g_total_exe = 0;
my $g_total_dll = 0;
sub check_is_dot_net {
my ($filename) = @_;
my $dumpbin_output = `dumpbin /DEPENDENTS $filename`;
exit 1 if $? == 256;
return if $? != 0;
if ( $dumpbin_output =~ m/\bmscoree.dll\b/i ) {
if ( $filename =~ m/.*\.exe$/ ) {
push @g_exe_list, $filename;
} else {
push @g_dll_list, $filename;
}
}
}
sub checkfile {
my @ext_list=(".exe", ".dll");
if ( -f $File::Find::name ) {
for my $ext (@ext_list) {
$ext =~ s/\./\\./g;
my $full_name=$File::Find::name;
if ( $_ =~ m/.*$ext$/ ) {
printf ".";
if ( $ext eq "\\.exe" ) {
$g_total_exe++;
} else {
$g_total_dll++;
}
check_is_dot_net($File::Find::name);
}
}
}
}
usage() if ( @ARGV != 1 );
my $target_dir = abs_path($ARGV[0]);
die "target no dir" if not -d $target_dir;
find(\&checkfile, $target_dir);
printf "\ntotal exe number: $g_total_exe , .net exe number: " . scalar @g_exe_list . "\n";
printf "total dll number: $g_total_dll, .net dll number: " . scalar @g_dll_list . "\n";
[解决办法]
Mfc学习中!