西西河

主题:【原创】JAVA和C#,武当和少林之争! -- Highway

共:💬137 🌺299 🌵10 新:
全看树展主题 · 分页
/ 10
下页 末页
家园 【原创】JAVA和C#,武当和少林之争!

关于JAVA和C#的比较,从C#的诞生之日开始就没有停止过。其实比较JAVA和C#,有点不是Apple-to-Apple的比较。我认为更确切的说法是JAVA和.NET的比较,而C#是.NET阵营里的得力干将,和VB.NET一起成为微软.NET战略的左右手。

JAVA和C#比较的文章网上的不计其数。其中我看到.NET总设计师之一,C#之父Anders Hejlsberg的一次采访录最为有份量,他从设计的高度和实现的技术细节上阐述了两种技术的主要异同点,比如.NET的Exception handling策略为什么和Java不一样,.NET为什么采用了delegate而不是像Java那样广泛的使用Interface,.NET为什么采用了JIT而不是Java的Hotspot策略等等等等。

Anders是计算机界名动天下的超一流剑客级人物,他的话自然高屋建瓴,广博而且深刻。不过呢,对他的话,一部分我赞同,一部分不是非常熟悉,暂且不表态,而有的地方我还没有被说服,他对Java的一些看法我还持有保留意见。不过呢,如果真地对JAVA和C#很感兴趣,Anders老剑客的谈话我认为是最好的入门一课。

点看全图

外链图片需谨慎,可能会被源头改

从技术上讲,我不可能比Anders说的更好了,我也不想把这帖子业的写的太过严肃了,所以我就轻松的评述两句,主要是从我的角度来谈这个问题。

就我个人的印象,JAVA和C#就好比武当之于少林。Java如武当,特色是一个“纯”字;.NET如少林,72般神技,精而且博。其实JAVA和C#算是同宗,都是C++派别衍生出来的。JAVA在前,为师兄,C#在后,为师弟。

点看全图

外链图片需谨慎,可能会被源头改

JAVA的诞生其实比较偶然。当时SUN的一位软件工程师(James Gosling)负责搞一个小项目,为微波炉,洗衣机之类的电器开发一个小的环境,便以编写相应的程序。作为一个C++的老兵,James非常了解C++的问题,那就是太难编写,调试,测试和发布。C++就如一把没有护手的尖刀,高手们可以随心所欲,但是功力如果稍有不逮,那么往往会伤了自己。并且那时候Unix门派众多,一个C/C++程序要提供IBM, HP, SUN, Digital,SGI以及Windows等等不同flavor的版本,简直是pain to the ass。 Write once and run anywhere的念头开始在心中产生。 他老人家于是大刀阔斧,在C++的基础上开始了Java的设计。他砍掉了C++中最危险的几个东西,如multiple inheritance,去掉了指针(pointer),不允许override operator等等。另外从OO的角度,他则将c++又提高了一步,所以从面向对象角度而言 ,JAVA算是青出于蓝了。不过呢,Java并没有追求所谓的“Pure OO”,它不是100%纯度的面向对象语言。Java开了一个后门,搞了一小撮“异类分子”,独立于Object之外, 那就是所谓的Primitive data type。这是出于实际的需要,如果将这些最基础的数据类型(int, float, double, bool...)也搞成Object,那么性能会损失巨大,对GC的压力也太大。基于这些考虑,Java放弃了对所谓“Pure OO”的追求,形成了这种8个 primitive data type加其余Reference Type的一个Hybrid局面。

点看全图

外链图片需谨慎,可能会被源头改

对于Java的程序员来说,任务其实只有一个,那就是编写Class。就好比武当绝学太极神功,要做的就是画圆圈,大大小小,层层叠叠的圆圈... JAVA里面没有指针,没有结构,没有联合,没有枚举,没有Template,没有Macro...程序员只需要凝神静气,编写Class,以Class为纲创建Class的实例--Object.

Java从1.0诞生之日起,就很“纯”,一直到1.4.X。之后Java受到了C#的强烈冲击,为了在市场宣传上不落下风,Java加入了很多七七八八的东西,其中大多是为了Language-wise match whatever C# provides。比如增强的foreach loop,蹩脚的autobox/auto-unbox,蒙人的Emum(枚举)。Java 5.0的Generics是个半成品,Annotation还算是一个出于需要而引进的东西。所以现在有人在大声疾呼,希望Java不要丧失了自己最可宝贵的东西-- “纯”。Simple and Elegant,这才是Java的真谛。如果非要和别人比拼Feature,那么在一开始我们就直接使用C++好了,还何必创造Java呢?

还好,在下一个Java的蓝图中,代号Mustang(野马)的Java 6.0,这个问题没有进一步的恶化,谢天谢地!!!

点看全图

外链图片需谨慎,可能会被源头改

如果说Java的诞生是出于技术上的需求,那么.NET以及C#的出现则是“政治斗争”的产物。当时Java推出后,好评如潮,Java受到了摇滚歌星级的追捧。Sun也自然是毫不客气,将Java上升到了“平台”高度,矛头直接指向微软。

微软心中恼火,但又不便于发作,他们的策略是“downplay java”。那时候在多种重要的场合,Bill Gates兄都反复强调"Java只是一种编程语言,和其他上百种计算机语言一样,只是One of them"。嘴上这么说,手上微软可没迟缓。他们派出一少人马,由老剑客Anders担纲,搞微软自己的Virual J++。

说实在的,Virual J++搞得很有特色。微软的Virual Machine速度和性能都不比当时Sun的逊色,Visual J++的IDE很流畅,可以像VB那样Drag-and-drop方便的设计界面,可以创建COM Component,可以调用已有的COM Component,可以通过J/Direct访问Win32 API。如果说你开发的程序只是想运行在Windows上,那么我认为当时Virual J++是最出色的Java环境。

微软这么“乱搞”Java,Sun自然是大为光火。把COM,WFC安到Java头上那不是QJ Java吗?那样开发出来的东西还能算是Java程序吗?Java还能Write once and run anywhere吗?于是Sun把微软告上法庭,理由嘛说白了很简单,那就是微软在QJ Java,Sun要求微软立刻无条件停下来!

不出大家所料,微软输了官司,没法再乱搞Java了。不过呢,在搞Virual J++的时候,微软的队伍已经形成了,概念已经开始清晰了,对Managed World有了切身体会,并且如何访问COM,如何Invoke API这些技术问题都有了答案。微软抛开Java的面具,完全另起炉灶的条件已经具备,于是.NET就开始在微软酝酿了。

可以肯定的是,在微软内部关于搞不搞.NET一定有一场异常猛烈的大辩论。COM/COM+/VC++这些微软的硬脚色一定会玩命的抵抗.NET。因为搞.NET,等于放弃微软搞了多年的COM/DCOM,从某种意义上说,是向Java那种Managed Code认输服软了。虽然COM/DCOM有不少问题,比如著名的DLL Hell,但是COM还有改进和发展的余地,那些问题也不是不可以缓解或是解决,并且COM/DCOM当时在性能上还有突出的优势,尤其是用VC++开发出来的。

不知道什么人在这场辩论中起了决定作用,最后微软还是下定了决心,Bill Gates拍了板,搞.NET。

搞.NET,微软首要的问题有两个:

1)如何保住VB程序员。VB是Bill Gates亲儿子,是微软发家的基石,拥有全世界最大的程序员群,如何把这些VB6程序员顺利带入到.NET"贼船"上是微软的头等大事。

2)如何将Java程序员诏安到.NET阵营来,让他们来了以后立刻有一种“回家”的感觉,而不用重新学起dim obj as String这样的VB程序。这就是C#诞生的背景。

.NET,以及VB.NET, C#都是全新的(当然还有其他的语言),在这一轮的设计中,微软全面借鉴了C++,Java以及他们自己搞的VJ++,应该说还是比较成功的。1.0/1.1有些仓促,在2.0中,微软则下了不少力气,.NET在总体上有了全面进步。大体说来有这么几点。

1)第一流的Generics。彻头彻尾的全新设计,非常出色。

2)全面优化的XML操作,这在Web Service中使得微软的.NET有很好的表现。

3)ASP.NET 2.0的进步巨大,令人刮目相看。

4)将.NET全面贯穿到微软的每一个产品中。SQL 2005,Office 11/12,下一代的Windows中都紧密集成了.NET。

微软的.NET摊子很大,并且微软还要兼顾以前的COM世界,所以.NET不可避免的有些笨拙,有些不伦不类,比不得Java那么纯粹,那么简洁(抛开JNI不谈)。比若说,.NET要访问以前的COM,要访问以前的DLL,Win32 API,这不可避免的产生一些问题,.NET要利用COM+提供的服务,编写所谓的Serviced Component, Queue Component,这里也有一些问题。而让COM程序来使用.NET开发的Assembly也同样会带来不少问题,为了解决这些问题,微软左支右档,搞出来许多怪怪的东西。这也算是“微软特色”吧!

点看全图

外链图片需谨慎,可能会被源头改
点看全图
外链图片需谨慎,可能会被源头改

点看全图

外链图片需谨慎,可能会被源头改

如果你看看微软的.NET Library,可以简单的分为两大部分:

1)以System开头的Namespace(略同于Java Package)算是.NET标准的东西,比较清晰明确,可以和Java类比。

2)以Microsoft开头的Namespace,那将是深不见底深渊。但是如果想写出像样的Windows程序了,这些东西往往还绕不开,预先警告一下。

点看全图

外链图片需谨慎,可能会被源头改

稀里糊涂看到这里,大家一定想问这样一个问题,那就是

Java和.NET哪个更好?如果投奔.NET,我是该选择C#呢,还是VB.NET,或者是其它什么?

Again,正如我前面所说,Java和.NET,好比武当和少林。武当七侠名满天下,威名远震;而少林四大神僧也是武功盖世,震古烁今。不管Java还是.NET,功夫到家了都一样可以手刃难题,扬名立万。武当少林没有高下之分,只有功力深浅之别。

如果是在Windows世界里讨营生,我的建议是走.NET路线。毕竟使用.NET在Windows上更得心应手一些,不论是访问Office文件,开发Windows Services,使用COM+ Infrastructure,联手IIS编写Web App/Web Service,还是在MS SQL数据库上搞开发,.NET比Java要容易的多。

编写.NET程序,理论上可供选择的语言有20多种,但实际上也就是VB.NET和C#为主。这两种语言其实都是在.NET Library上做文章,底子是一模一样的,区别的只是语法(syntax)。理论上看C#比VB.NET要强一点点,比如C#可以在Unsafe Block里面使用Pointer,而VB就压根没有Pointer概念。但是在实际应用中,两者几乎是一样的,难分伯仲。用微软的话来说,选择哪种语言完全是个人喜好(Personal Preference)。

如果阁下是搞研究的,做学问的,或是在公司里写算法,编后台应用,那么Java是一个很好的选择,毕竟Java的世界要清澈透明一些,并且选则了Java,你还赢得了一个“自由身”,可以不受平台的制约,不受Software Verdor的限制,不用看微软的脸色。

关键词(Tags): #JAVA#C##.NET元宝推荐:四月一日,ArKrXe, 通宝推:哼哼哼,

本帖一共被 1 帖 引用 (帖内工具实现)
家园 花, 顺带坐坐沙发.
家园 妙!花!不过,要我说,Java和C#更象岳不群和欧阳修。Duck! Run!
家园 岳不群和欧阳修?!
家园 其实大家都在IT江湖上混,有时候彼此都心知肚明,

不过是彼此彼此!

SUN现在日子很不好过,不知道会不会拖累Java。IBM总在Java后面嚷嚷,咋咋唬唬的。但我一点也不看好IBM,觉得整个一成事不足,败事有余的主儿!

家园 不花没人性啊!

原来俺是少林派的

家园 这个才是最让人担心的地方。其他的,高明不高明到现在也没那么重要了
家园 素闻地主掌门少林龙抓手刚烈威猛,无坚不摧,敬仰的很。

不知道出招是不是这个样子滴?

点看全图

外链图片需谨慎,可能会被源头改

家园 这两天在看The Java Programming Language 4th Edition

门外汉开始学JAVA了,书价越来越高喽。

觉得GENERIC很有点C++的TEMPLATE的意思,我觉得不错啊。

要说JAVA没有指针,感觉上不太严格,比如

Class Point {

public double x, y;

public static Point origin = new Point();

}

如果不用指针的概念,怎么能理解class的member还能包含自己的一个object这种现象?

又比如在下面的表达式里面:

Point p;

p只是一个reference, refer to what现在还不知道。有可能将来让它refer一个Point object (p = new Point();) 或者让它refer去一个Point的subclass (p = new Pixel();)

我感觉这种reference其实就是C++的指针。

大家的意见呢?

家园 【建议】也是随便说说

1.作为语言与c#比较的Java应该是J2SE;与.NET比较用J2EE较合适。

2.尽管从java诞生起就不断强调“java不是c++”,就好像c#从诞生起就不断强调“c#不是java翻版”一样,仍不能简单地将java视作继承于c++。也许将c++视作java与c#这对师兄弟的师兄更为合适些,而这些语言设计之初都不能不考虑smalltalk的影响。

java现在有脚本化的倾向。就好像打仗的时候除了重炮,步枪也必不可少一样,我认为出现这样的变化是必然的。所以annotation的引入是迟早的,不管它叫什么,以什么面目出现。微软好像没有这样的问题,因为它的VB太强了!打从6.0起就叫嚣要抛弃VB,直到现在也丢不掉。这一是因为在快速开发领域VB几乎没有竞争对手,二是因为在微软构造的框架里,暂时还找不到替代它的粘合剂。

java有另一个优势很少有人提,就是在院校里使用得比较广泛。有点象当初unix和c的情形。

家园 Java的Reference感觉很象C/C++的指针,但是区别是本质的。

他们相同之处在于都是含有一个地址,但是在Java中你无法对这个地址进行任何数学运算,并且这个地址你不知道,是Java Runtime分配给你的,它随时还要调整这个地址(After GC,Memory要Compact,这时候一个Object Reference的地址就会改变)。

而C/C++之中,你可以对指针变量进行各种操作。譬如下面这个小例子

// more pointers

#include <iostream.h>

int main ()

{

int numbers[5];

int * p;

p = numbers; *p = 10;

p++; *p = 20;

p = &numbers[2]; *p = 30;

p = numbers + 3; *p = 40;

p = numbers; *(p+4) = 50;

for (int n=0; n<5; n++)

cout << numbers[n] << ", ";

return 0;

}

家园 为什么不看好IBM呢?感觉又是一篇强帖的料啊!
家园 全世界,包括IBM,投在Java上的钱可海了去了。即使Sun翘掉了,Java

也能活过去。毕竟,在服务器端,微软不占垄断优势,而用Java写的服务器程序可是越来越多。

说起IBM和Sun在Java上的关系,挺微妙的。本来么,都和微软不对付,敌人的敌人就是朋友了。IBM还在Java上投入甚巨,那么至少在推动Java这事儿上,两家公司应该合作愉快,大搞共建的。那知IBM竟挑头搞了个力促开放Java的“日蚀计划”(eclipse.org),居然还假模假样地邀请Sun加盟。这可是把Sun给恶心坏了。Sun的答复也挺干脆、直接:“就冲这名儿,咱也不能入。”

大家现在都指责Sun在Java的标准制订上把的太宽,纷纷建议Sun真正地开放Java,并把Java的核心标准制订权交到一个“中立”机构手里。IBM就是其中喊地最响、跳地最高的那个。估计这帮人看着Sun现在这个要死不活的样子,心里都在担心Sun会不会破罐子破摔,带着Java进坟墓,裹挟着大家当陪葬呢。

五年前Sun如日中天那会儿都没有给Java自由,现在快日落西山了,哪里还会放掉手里这不多的几根稻草。

家园 再推. 图文并茂
家园 都想一统江湖。一个阴险,虚伪,另一个狠毒,粗暴。
全看树展主题 · 分页
/ 10
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河