非官方观点 java vs .net
本文作者:王森
台湾交通大学科技管理研究所
[email protected]
前言:
最近这半年的讲师生涯之中,遇到不少从vb转到java的学生,绝大大部分的工程师或新进软体开发领域的朋友都会问:"我该学.net 还是java ?" "该学c# 还是java ?"相关的主题在网路上可谓暗潮汹涌,随时可能擦枪走火,在发表本文之前, 自己把c# spec 深入地读了一次 ,也大致研读了.net的相关技术文章所以想想在此发表一心得,没有什么预设立场,请大家多多包含。也感谢洪志鹏先生愿意让这篇文章藉由java周报发表。
本文适用对象:
"本文内容只适用一般工程师,特殊情况不算!"何谓特殊情况呢?以我个人为例,明明知道delphi的原生语言是object pascal, 所以要用object pascal才能和delhpi融为一体的感觉.可是,开发project 的时候,我就是莫名其妙地喜欢用c++builder.当"程式语言基本教义派"或"程式语言民族主义"遇到正常行为的时候,是怎么说也说不清的。(以上是李敖先生说的话,我只把关键字换了,希望不会被他告)另外一种特殊情况就是,如果您的思考方式与普通人不同,那么,本文亦不适用於您。
首先想讨论的是架构的问题:
笔者并没有深入研究过架构,也实在不清楚网路上诸位先贤所谓的架构指的是什么.但是我凭一个工程师的直觉可以笃定,".net就根基架构上一定比java的根基架构还要好!"因为.net的推出比java晚了近5年,中间还有j++与wfc的发展,如果搞了个比java还鸟的东西,像话吗?只要sun在这次帝国大反击之後,没有被ms弄得节节败退,从此消失於市场,相信它若干年後还会推出个比.net还好的东西,然後若干年後ms又搞出一个更好的东西.事实上,科技的演进就是如此.所以谁强谁不强,纯粹是历史必然的结果.所以没有什么好争论的.至於将来谁会是市场的霸主,就看两家龙头太厂谁比较会行销,谁比较亲近工程师.虽然资讯界过去曾经好几次重复"好东西被干掉,次级品占领市场"的历史.但是仍然没有人敢断言。
其次是压宝谁的问题:
sun的标语是"网路即电脑",所以在java的策略上,sun假设这个世界上充满异质平台,所以设计java 的时候希望以单一一个java程式语言为中心,让它可以在各种平台上执行.因此jvm要采stack machine的设计方式,因为不管你是谁,都可以实作出stack machine.但是这毕竟是一个不理想的世界,连sun自己solaris都要好几个patch才能使用新版的jdk.连borland也花了三年以上的努力才让 jbuilder可以同时推出windows , linux , solaris , mac os x 四种版本,可见"write once,run anywhere"的理想真的有其实际上的难度.borland除了证明sun 的理想是有机会实现的礼运大同篇,也证明经过精心的架构设计和最佳化,加上工程师累积了许多经验後,仍然可以突破stack machine 先天上速度慢的原罪(虽然还是不理想,需要用很多ram来填补理想).sun把其官方工具jdk搞的很难用,网路上老是有人抱怨它是java developer killer,虽然.net framework sdk一样难用,可是微软至少还有visual studio.net如果说微软的visual studio.net让工程师感觉像在开benz,那么forte就很像路上随便一台前方贴著benz标记的烂公车.所以sun实在需要多多加强.不过这也难怪,ms是纯软体起家,sun是纯硬体起家,sun做软体做不过ms是正常的事情.
反观ms,它假设世界上只有x86的cpu,或者广泛的说是wintel 平台,并假设世界上存在许多会各种语言的工程师们.因为以此假设为策略中心,所以设计.net的时候clr可以针对x86 cpu 作最佳设计,有些指令甚至可以和op code达到1 to 1的mapping,所以速度自然跑的快.但是叫他移到sparc或as/400上就麻烦大了..就工程师的角度,自然会偏向.net,因为选择很多(喔,这点有待商榷,後面会提到),但是就3rd party 厂商的利益和老板不想被特定平台绑死的观点来说,会偏向java。各位想, .net的winform设计的那么漂亮,很可能累积了anders离开borland之後的许多好点子,如果.net出来,borland大概真的只剩下ide可以做了.所以最後谁的利益胜出,很可能就会决定输赢,因此笔者曰:"你想信耶稣就信耶稣,想信佛教就信佛教,你心中的神自然会带领你走向他口中的天堂."喔,对了,如果两边都要压宝的人当然没问题,但是请一定要小心,不要到时候上不了其中一个神所谓的天堂,却同时下了两个神口中的地狱啊!
再来是programming model的问题:
记忆中,上一次给我惊艳感觉的时候是delphi出来的时候,让我第一次觉得写程式是很美好,很简单的事情,可是自从那次的美好经验之後,一直到目前为止,都没有任何新意让人有耳目一新的感觉,总让我觉得软体的开发方式是不是已经走到一个瓶颈了呢?anders搞vcl的时候,borland说它是vb killer, anders 搞.net,ms 当.net 是java killer,怎么每次anders出现的时候都会出现杀手呢? 我建议以後改叫他enders算了,大家觉得如何?
总之,元件架构不管是vcl, javabean, wfc, .net framework,搞了搞去都是setxxx()与getxxx()那一套,进步也只是小迈步,不是大跃进.以前语言里头不支援,所以要搞特殊语法,现在搞个新语言来支援,然後把他标准化罢了.自从jordon退休之後,nba就变得有点不热闹了,但我还真希望既anders之後,有新一代的鬼才提出另外让我们工程师轻松的programming model呀!!
最後是语言上的问题:
c#比java复杂多了,多了很多关键字,让我觉得很复杂,先说型态好了,c#提供value type与reference type,value type还分成simple type ,enum type , struct type,reference type还分成class type , interface type , delegate type , array type.这些型态如果在配上传递参数时可以选用纯粹的by value ,by reference(ref) , ouput(out) , parameter array感觉上还真是热闹哩!!c#之中我们还可以利用unsafe关键字对指标直接做存取.存取权限修饰字除了固有的public, protected , private之外,也加了internal , protected internal.在多型上,除了以前的virtual之外,也加了override关键字.喔,当然有人会说我何必庸人自扰,但是如果您的汽车有类似霹雳车可以turbo的功能,我想任何有好奇心的人都会想找机会试看看他的极限在哪里,才不管会不会粉身碎.java程式语言的功能有限,工程师遇到特定问题通常会找其他特定的解决方案,这么一来程式在维护上会比较容易.但是语言复杂了,同一件事情有好多种做法,自由度变大了,工程师发挥的好,就可以突破很多限制,实现自己梦想.但是维护上呢?
君不见有些天才可以用c简单几行程式写出求pi值的程式,但是有多少人看的懂?个人主义和团队合作之间是有一些gap存在。语言的简单与复杂之间,实在是个dilemma.如果程式语言里头都是宣告,回圈,函式呼叫这三种基本要素,那么要设计出很复杂,功能超强的程式语言都没问题的,不是吗?sun大可在java里头开始引进很多c++的功能,可是它没有,原因何在?c#的复杂度,如果加上operator和template,那么和c++可有的拼哩!
每次上java课程时有好多好多的vb programmer跟我说他无法提升上来,虽然我要负大部分的责任,但是我开始怀疑如何把vb programmer提升到.net的层级呢?我说的vb programmer当然不是少数精通各种语言,用vb只是纯粹好玩的工程师,而是指目前台湾资讯业界的许多中坚分子和soho族,当然,有人会叫我去用vb.net,cobol.net,问题是,大家有没有想过为什么c++那么强大,可是还是很多人喜欢用c ?为什么开始有人改用java ?为什么虽然pascal不是主流,可是大家还是喜欢用delphi ?
现在打出ms的行销广告告诉所有工程师一个讯息:"各种语言的工程师都可以广纳在.net之下."相信去参加过微软或其他研讨会之後的朋友,除了发现.net很不错,很棒,有很多功能是自己过去梦寐以求的功能之外,也发现他们被ms骗了(有人跟我说他觉得他被ms抛弃了),因为他们发现过去学的根本没用,啥米vb.net,要他去学那种vb,他宁愿去学c#,反正比起vb.net的语法,c#也没难到哪里.
http://www.vbqa.com/discuss/vb.net/read.asp?id=11
这个论坛里头,christorng先生说的很好:"况且 vb.net与c#的相似度,依我看比vb.net与vb6的相似度还高…^_^"
任何语言,要能够在clr上发挥功能,就必须符合cls的规范,意思就是说,vb.net不会因为它的前面有vb两个字,就可以让过去用vb的朋友仍然有著绝佳的生产力.如果语法没有扩充,您相信vb.net写的component可以被c#用吗?我是指"优美的用法",而不是旁门走道绕了一大圈之後的用法.ms在.net framework sdk beta 2里头,据说把vb改回来了,虽然不知道修正的幅度多大,那么这个新生代的vb可以发挥多少clr的能力呢? 大家就拭目以待罗!
我只能打个比喻,同样的马力,扭力以及内部装潢,载女朋友的时候你要用的车子是长的像bmw的样子? 还是长的像电子花车?用vb用到很精通的情况之下,所以的工程师都会发现,要打破任督二脉,就必须去了解com,否则永远无法突破,这个在.net里头一样适用,要发挥.net的能力,最後一定往c#走.所以要.net上发展程式,我绝对选原生语言c#,不会用vb.net.因为,车子也不会因为他长的像飞碟,就可以不用轮子行走呀!
那么,同样是交通工具,台北车站到天珑,你会选飞机还是计程车?所以有些事情,在windows平台上,java或许做得到,但是做起来很复杂又不美观的时候,我用.net.写gui程式的时候我会选vb或delphi,至少不会像jbuilder和visual.net一样,只是个简单的gui,改了点property,竟然跑出一大堆让我不知道从何改起的程式码.每次看到这些无聊又重复的程式码,让我久久无法言语。
结语:
不管是大陆还是台湾的工程师,都存在著"广义中国人"的劣根性,东西还没出来,就可以诸多猜测,跟我们电视上那些算命的半仙没啥两样..而且,大家还真喜欢算命耶!难怪我妈看到我在读the art of computer programming的时候跟我说,程式设计师和巫师没啥两样,只不过他们靠乌龟壳和咒语,而我们靠的是程式语言.我们总是人家在煮米粉,我们再喊烧,一大堆会写病毒的高手,一大票善於破解的高手.但是就是做不出世界级的软体.当然,这也骂到我自己了,但是我真的是对软体业没啥贡献就是了。
非官方观点,欢迎大家来信讨论.
[email protected]