日期:2013-07-04  浏览次数:20377 次

非官方观点 Java vs .NET
本文作者:王森
台湾交通大学科技管理研究所
moli.mt88g@nctu.edu.tw
  
前言:   
    最近这半年的讲师生涯之中,遇到不少从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++可有的拼哩!
  
    每次上