C#就是Java只不过差了一点点

转载 zdnetchina

C就是Java只不过差了一点点

http://www.zdnet.com.cn/developer/tech/story/0,2000081602,39193401,00.htm


C和Java都是很不错的语言。他们通过类似的方式达到了类似的目的,尽管C比Java多出来一些和句法相关的东西,例如foreach关键字和一些更加让人高兴的扩展/实现架构。不幸的是,这些改进的光芒被削弱的东西掩盖掉了。在本文里,我将比较两种语言,并尽量避免深入到JVM和CLR层。

Java:无可争辩地具有C++所有的精华
在比较Java和C的时候,你不可能不注意到它们诸多的相似之处,这在某种程度上要归结于它们共同的来源:C和C++。但是,当Gosling和他的同事们坐下来创造Java的时候,他们不仅吸取了C++的能力,而且更重要的是,他们减掉了一些无用特性,后者让C++更容易出错误而且更难学习。C的设计者加入了很多C++的特性,而Java也加入了这些特性,但是C却没有去掉C++的最糟糕的一些特性。其结果就是这样一门语言,它仍然为所有人提供了所有的特性,但其结局是内部冲突不断,而且过于复杂。

散漫的句法缺陷
最容易找出的错误是流控制和句法。C提供了goto command,将其作为更改程序执行点的机制。自从Edsger W. Dijkstra在1968年出版了他的《关于Go to陈述式害处的考虑(Go To Statement Considered Harmful)》。Goto语句导致代码难以调试,而且很难被测试工具处理。

在另一种不同的情况下,操作符过载同样也有很大问题,只不过层次不一样罢了。当“+”根据操作数的类型而代表任何东西的时候,代码的功能就不再透明,难以预料的副作用就会发生。

C在安全上的削弱
C#有一个用于将代码区域标示为不安全的简单机制。在这些不安全的区域里,Java以及后来的C安排到位了一些安全措施,用以防止程序员直接修改内存位置,以及使用点运算,但是这些措施是值得怀疑的。在使用具有垃圾清理功能的高级语言时,如果下到内存地址这一层,就会把对象/内存之间有意作出分离弄混。错误就会容易出现,调试成了恶梦,缓冲区溢出再次抬头,C和C++里著名的安全漏洞再次现身。

C还允许对主机系统上本机库的简单访问。这个与非.NET对象相结合的访问同Java本机接口(JNI)所提供的功能类似,但是它更加危险。JNI被设计用来小心地限制Java代码以及本机代码同已定义好的接口之间的交互操作,.NET使得调用本机对象文件变得极其简单,结果导致开发人员在做这的时候,无法意识到他们在这一过程中把平台的可移植性也扔出了窗外。

SOAP的集成
C#,及其更大的扩展.NET,已经同SOAP Web服务紧密地集成在一起。SOAP是使用XML指定参数和结果值来进行远程过程调用的好标准,但是它并不是唯一的方式。利用用于Web服务的外部库能够允许Java开发人员轻易地更改其Web服务的风格,使其成为SOAP、XML-RPC,或者什么还没有发明的东西。当然,C#的开发人员总是能够选择将外部库用于SOAP的Web服务,但是由SOAP标准的紧密集成所造成的限制要比它能够做的东西更多。


所有者的恐慌
C里最令人恐慌的特性可能就是其所有者了。微软已经为将C.NET用于非Windows平台进行了精心的展示,但是这在很大程度上还只是作秀。其用于非Windows平台的CLR是问题多多,错误多多。它通过ECMA标准化过程来运行C#――这一步连Sun也不敢在Java上迈出。其担心来自于微软对此可能封锁的程度,如果它愿意的话。微软已经申请了一个专利,以排斥他人编写第三方的CRL,例如Mono计划。如果微软决定对免费的C.NET社区施压,它就有能力拿票子和法律的大棒把其开发活动赶回到Win32平台――当然这也不是它想看到的情况。

而Java语言则相反,不是ECMA标准的,真可惜Sun没有遵从这一标准。但是,它是可以实现的,而且没有专利的阻碍,其虚拟机和核心类库都有来自第三方的开放和封闭源代码的实现。C看起来是免费的,其实不然,而Java看起来限制很多,但是它能够依据法律通过免费的途径来实现。

最后,我从来都没有想到我会说这个,但是Java具有更好工具的支持,即使是在考虑到集成开发环境(IDE)的情况下。Visual Studio .NET是一个很不错的IDE。它代表了多年的努力,而且特性很丰富。但是,Eclipse IDE包括了对Java的支持,它在稳定性、易用性和所提供的特性上超过了Visual Studio。IBM对Eclipse的贡献举足轻重,而且如果你信奉原来的软件格言“创建一个扔掉的(Build one to throw away)”,那么你可以把Visual Age作为第一个(被抛弃掉了的)尝试。对于使用C的开发人员来说幸运的是,Eclipse的.NET版本正在开发中。

不是那么差,但是还不是Java
客观一点评价,C里并没有什么很恐怖的东西。它没有Visual Basic里的那些很恐怖的东西,而且它事实上也没有继承像C里的一些东西,而这些东西会让开发人员开枪却打中自己脚。但是,底线是,C并没有做很多东西,如果有任何东西比Java更好的话。它在某些方面很明显的要更差。在这两个非常类似的语言之间作选择的时候,请选择稍稍更好且经历风雨的那个:Java。

不错,Java的AOP目前C还没有引入,台湾的那个著名Borland专家曾经写文章说C领先于Java,那是明显误导,.NET 2004版是出不来,开发者无缘享用最新思想和最新技术,而Java不一样,Java开源社区不断推出最新思想实现的产品,当你拿到这些与世界思潮同步的热红薯时,不知你心里是如何的激动,至少我经常难以入眠。

反驳那个帖子几个跟贴,可见很多程序员很糊涂:

>明显是枪手.java的速度太慢了.而C的速度非常快,而且他的特性和java,几乎没有什么区别.我就是把C当一个速度很快的java用.

要知道,基于虚拟机的语言都慢,这位发言人还不知道下面一个流行大势:片面追求性能的时代已经过去了.....
可见平时,各种媒体宣传对这种悄然大势都没有提及,致使很多程序员用的是先进设施,思想和思维都很落后。也是中国重项目,盲目跟风的怪现象吧。

>什么垃圾理论。C怎么是抄袭JAVA了
C抄袭Java是有目共睹,微软自己都承认,只不过改成中性词语:继承和吸取。这个基本历史都会怀疑,如何和这样的程序员沟通?

关于“微软思维”

“微软思维”是我创造出来的,我不是用来贬低微软或其它什么目的,只是用来表达长期以来中国程序员接受微软体系灌输后造成的一种状态。

“微软思维”表现有下列特征:
1. 程序员表现是:懒、等、靠
懒于学习微软以外的东西,或者新思想;“等”就是等着微软产品来喂;“靠”当然就是靠着微软吃饭。这样下去,最终会毁了自己,以前吃大锅饭时,很多工人都是这样,结果,最后下岗的是自己。

相机刚刚出来时,不是人人会拍,所以拍照我们要到照相馆,有了傻瓜相机后,除非所谓艺术照,我们已经不需要照相馆了。

很多软件公司应标方案几乎是微软产品说明书,这样造成的后果是什么?最终客户会发生疑问:需要要你中间者做什么?

2. 项目表现是:使用先进简易的工具,开发出落后思维的系统
很抱歉,我使用落后不是为了攻击谁,但是确实这样的系统最终残害了软件业本身,看看那么多源代码下载网站,触目惊心的各种各样基于微软体系的源代码,这些源代码可能会满足客户一时之需,但是<b>它是企业系统的“木马病毒”</b>,Windows已经把它自身顽疾的“木马病毒”转移到了中国企业信息系统中,危害之大,这是几个金山毒霸能够防治的吗?


3. 程序员最终症状是:固执,思维奴役化,麻木,丧失自我。
在技术由于追随微软多年,技术上固步自封,在微软.NET没有推出或推出过程中,不学习Java/Linux其它知识,等待.NET将方便快速的工具送上门来,进而贻误软件公司技术定位时间,从而可能导致公司在竞争中失败。

思维奴役化,麻木,这些就不多说了,有攻击和谈论政治之嫌疑,不过这确实是技术路线政治。

丧失自我主要表现是:不会自主选择了,有机会接触到Java时,完全没有了主意,到处打听有没有包办一起的完美技术,当发现Java技术总是有弱点时,表现迟疑,拿不定主意,无法把握事物的主要点和次要点。当然,这样的程序员在技术上表现为无主见,在现实生活中也可能是这样,请注意,不要以为很固执,喜欢顶牛的人就是有主见,我认为那是最没有主心骨的表现。


最后,请注意,上述情节纯属虚构,请勿对号入座。

完全统一关于banq的微软思维一说。的确,程序员在microsoft下面,变得越来越懒惰。

什么抄不抄的,不要这样幼稚好不好

照这么说java 1.5还不是抄.net的
看看这些技术的出现时间
vbx,ocx,activex和java bean
asp ,jsp
至于aop,在com,mts,com+中早就存在,何况,现在aop在.net中有许多实现,spring.net中的aop也快要完成了

如果纯公司之间的比较
sun vs ms 谁的创造力更强,大家凭心而论吧

java现在所有的成就离不开开源社区的贡献,当然这同sun的策略也有关系,我倒认为ms也可以学学sun,不要凡事亲力亲为,这样既吃力也不讨好

郑重声明:我无意挑起争端,我用.net,但我也非常喜欢java,只是没有这个机会用而已
c# 没有匿名类,匿名方法,而且像interface中不能用常量等等,比java不灵活许多。虽然2.0会有些变化
要了解一种技术需要很长时间的积累,不能光凭表面判断,如果要评判.net,必须读几本像.net 本质论之类的书再说。
当然,如果要评判java,也需要同样的积累

Banq说的有些道理。我也觉得有些程序员已过份依赖MS的系统了,一提Java还是说“Java性能差!”,其实是他在内心深处是抵制Java,抵制新技术,就说学C,还说C应用现在还不多!唉!!!!!

确实,抄袭带有感情色彩,使用有误,JJX分析很对,开源对Java影响很大,这其实是有一个更重要的原因,因为Java是Open的,IBM Oracle SAP都以Java构造大型系统,因为他们Java上的发言权不亚于SUN ,所以谈到Java,大家总是想到SUN,这也是一个误区吧,更不适合将SUN和M$公司比较,接受学习Open的技术,首先我们需要有Open的思维。


谈到.NET本质论,我想起“微软思维”还有一种表现,在微软技术中,最厉害的人不是如何设计出高质量的软件,而是对Windows API内部如何精深掌握,这些人不是微软内部的,他们只能靠对黑盒子的猜测,象黑客一样去了解API机制,他们会被微软的人推崇:“好厉害,比我了解得多”。
浪费人才,浪费精力!

只有微软的东西,才有所谓"本质"探询的动力,见过Java本质论吗?没有,你需要了解Java本质,他是Open的,没有向你隐藏什么,所以,你不需要好奇,不需要探询所谓本质,它是真诚的,没有皇帝的新衣。

不要将时间浪费在某种技术的本质上,应该是如何在该技术上如何高质量搭建自己的应用系统。

以上只是个人意见,呵呵。

不同意sun vs ms!!!

如果单靠sun,java不会这样成功。

成功应用例说明一切(如ebay等)!

写得太差了!banq的评论也太感情化了。
我来驳一下

1. C# 的goto主要是为了纠正c/c++/java里面臭名昭著的switch-case里面的fall-through问题。不小心忘了写break,结果程序就一塌糊涂的事情不是没有出现过。而且,即使是c风格的goto,在大家都知道其危害并小心使用后,也不是什么大问题了。现在还拿这个做文章,无聊!
2. Unsafe, native。要保留c/c++的强大的底层能力,这两者就是很有意义的。有趣的是,如果一个c抢手来写文章臭java,这两点大概也要被当作c的有点和java的软肋。至于是不是为了怕噎死就不吃包子,个人有不同的选择,至于饶舌吗?
3. Operator overloading。经验证明,虽然过度使用不好,但是,有些场合,operator overloading还是很有好处的,比如数学库。
4. Soap的集成。Soap并没有集成进c语言。那是.net framework的东西。我觉得挺好的,标准库对这个最popular的东西有了支持,你还抱怨?太难伺候了把?而且即使ms没有提供xml-rpc, corba,不会自己写个库吗?
5. 所有者问题。Political crap! 现在在讨论语言,学术点好不好?如果非要卷入政治因素,那么,java有跨平台的优点,ms有windows的支持,微软强大的资金和技术实力岂容忽视?个人喜欢open的东西。但是,用在企业开发上,不一定open的就好。
6. 抄袭问题。这个最无聊了。技术本就是互相继承借鉴的。有成熟的java不抄才是弱智呢。
7. C有delegate,有匿名方法(从2.0起),这些java还没有呢。
8. Java里面,在interface里面定义常量也被认为不是个好习惯。所以禁止interface里面的常量无可厚非。
9. 盲目地做ms的扇子固然是个shame,但是盲目地做java的扇子也光彩不到哪里去。请了解了批评的对象再说话。不要跟辩论对手比赛无知。
10. Aop问题。谁说c就不可以aop了?请问,java那一点使她适合aop?Tiger的annotation吗?它和c的attribute不是很象?c又有哪一点妨碍它aop了
11. 我喜欢的c特性:yield, value type, using, template constraint.

上述言论不是想伤害M$程序员感情,那已经是历史,希望在.Net或Java新平台上能够构筑更好的自己的应用系统,克服以前的缺点,仅此而已。

我已经注意到我有时说话有感情,刚发了 帖子矫正,就看到ajoo帖子,我非常欣赏ajoo的理性思维,以后也请多发言,我们共同受益。

> 写得太差了!banq的评论也太感情化了。
> 我来驳一下
>
> 1. C#
> 的goto主要是为了纠正c/c++/java里面臭名昭著的switch-cas
> 里面的fall-through问题。不小心忘了写break,结果程序就一
> 康氖虑椴皇敲挥谐鱿止6遥词故c风格的goto,在
> 蠹叶贾榔湮:Σ⑿⌒氖褂煤螅膊皇鞘裁创笪侍饬恕O衷诨
> 拿这个做文章,无聊!
> 2. Unsafe,
> native。要保留c/c++的强大的底层能力,这两者就是很有意?> 的。有趣的是,如果一个c抢手来写文章臭java,这两点大概
> 惨坏弊c的有点和java的软肋。至于是不是为了怕噎死就?> 吃包子,个人有不同的选择,至于饶舌吗?
> 3. Operator
> overloading。经验证明,虽然过度使用不好,但是,有些场?> ,operator overloading还是很有好处的,比如数学库。
> 4. Soap的集成。Soap并没有集成进c语言。那是.net
> framework的东西。我觉得挺好的,标准库对这个最popular的
> 饔辛酥С郑慊贡г梗刻阉藕蛄税眩慷壹词ms没有提?> xml-rpc, corba,不会自己写个库吗?
> 5. 所有者问题。Political crap!
> 现在在讨论语言,学术点好不好?如果非要卷入政治因素,那
> 矗java有跨平台的优点,ms有windows的支持,微软强大的资
> 鸷图际跏盗ζ袢莺鍪樱扛鋈讼不open的东西。但是,用在企?> 开发上,不一定open的就好。
> 6. 抄袭问题。这个最无聊了。技术本就是互相继承借鉴的。
> 谐墒斓java不抄才是弱智呢。
> 7. C有delegate,有匿名方法(从2.0起),这些java还没?> 呢。
> 8. Java里面,在interface里面定义常量也被认为不是个好?> 惯。所以禁止interface里面的常量无可厚非。
> 9. 盲目地做ms的扇子固然是个shame,但是盲目地做java的?> 子也光彩不到哪里去。请了解了批评的对象再说话。不要跟辩
> 鄱允直热拗?> 10. Aop问题。谁说c就不可以aop了?请问,java那一点使?> 适合aop?Tiger的annotation吗?它和c的attribute不是很?> ?c又有哪一点妨碍它aop了
> 11. 我喜欢的c特性:yield, value type, using,
> template constraint.
>

1.你既然知道可能会忘记break,你干吗不小心呢,你小心了就可以了啊,就好像你的goto小心使用一样???????不理解?这个还可以成为理由???
2. 要说底层功能,你干吗不直接用c/c++,何必用c#,奇怪??
3.你看多少数学库是重载了+、-、×、/的基本功能,既然是面向对象的,为什么不能提供的方法,非要多次一举??不理解
4.没有深入研究
5.不知所云,现在为什么越来越多open的东西可以和ms抗衡了呢??显而易见
6.你想说明什么呢?反正我知道你承认了它是抄袭java的
7.没有研究过匿名方法。(个人想法:怎么调用匿名方法?)
8.没错,java不提倡用接口来定义常量进行继承。
9.你到底在做谁的扇子?
10.你太激进了
11.个人问题不用拿来讨论,我还喜欢游戏呢,哈哈(java的更多特性是你不了解的,你当然不喜欢了,个人习惯问题罢了)

ajoo所列观点中我认为大部分是如何看待事物两个方面的态度,可以将事物不好的方面看成是优点,取决你的角度,因此很难争辩了,有一点可以辩论一下:

>个人喜欢open的东西。但是,用在企业开发上,不一定open的就好。

企业开发的东西一定要Open,如果不Open,会导致受制于一个技术和公司,最后利润被顷扎,所以现在电子政务都比较推崇linux/Java组合。

企业作为软件供应商的消费者,需要将自己置身于在多个可选供应商下,所以,企业采购需要拍卖,让多个供应商竞争,因为Java是Open的,有多个厂商供应商支持,所以,企业选用Java是安全的。但是如果选用M$,虽然Borland等也有厂商,但是不能和M$同日而语,因此,对于企业选择非真正Open的软件技术,将严重依赖某个供应商,最终伤害的是自己。

以上道理应该是市场经济的基本规则。

注意大家讨论,对事不对人,尽量平和来讨论,倡导理性争论,谢谢。

这个论坛火药味真浓