Spiga

事理越辩越明,那么就来详细说说为什么我不喜欢Java*语言*

2009-04-19 02:56 by Jeffrey Zhao, 30111 visits, 收藏, 编辑

写在前面:这篇文章是在谈Java“语言”,文章里面也会再强调一下的。支持.NET的朋友也不用认为Java平台就此没落了,搞Java也没必要用Java平台的其他优势来反驳。咱吵架也要专业点,不是么。

最近我对Java语言唱衰似乎凶狠了一点,让有些朋友不是很爽,认为我不负责任凭个人感觉乱说话,影响不好。这讨论事情事小,否认我做事方式就不好了。因此我这里也继续整理一下我对Java语言的观点,这样大家不必四处查看我的说辞,再者也可以控制一下讨论事情的方式,以免大家舞蹈半天尘土飞扬最后停下一看——得,双方在自说自话,这怎能辩明事理,您说呢?

在这里,我借用一下郑晖同学(再此强烈推荐一下他的《冒号课堂》系列,如此好文不该受到如此冷落)在《高阶函数、委托与匿名方法》中留下的评论,这可能也是目前为止最具体最集中的质疑了。我很喜欢,因为可以一条一条的应对,思路清晰。

质疑:Java固步自封?Java语言从1.0到即将的7.0,每次都有新的语法特征加入。C#作为后辈,起点高,对函数式、动态类型等的支持是Java所没有的,但不代表Java今后就不支持。

回应:首先,“Java语言从1.0到7.0,每次都有新语法加入”,就能代表它“不固步自封”了吗?固步自封,是说它改进不大,不顺应“历史潮流”。C#的很多特性Java没有,但不代表Java今后不支持——是啊,的确“能力”是肯定有的,但是有能力而不去做,难道这不是“固步自封”的最好证明?Java 7已经再一次把业界早已强烈要求的闭包特性排除在门外了,只是增加了一些例如“[]式下标”或“使用->而不是get/set访问属性”这样的简单语法糖,看看每次C#改进的力度,具有可比性吗?

质疑:此外,Java的小兄弟Groovy也是动态语言,与Java很容易集成。其他的如JRuby、Jython与Java的集成也不难。

回应:JVM上实现的Groovy、Ruby、Python语言实现,不是我想讨论的内容。我说的是Java语言,由语言的规约来确定。我说Java生产力低下,其实只是说Java这门语言在设计上特性缺失过于严重,而不评论所谓JVM的能力。而JVM上可以实现Groovy等高生产力语言,更是证明了JVM的能力是完全足够的,而Java有那么好的平台基础,却不愿意发展,这也是我说的“固步自封”的原因之一。

质疑:要知道,Java有更多的历史包袱,动辄在语法上作大改动,会牵连到大批用户。这是成熟和流行的代价。

回应:我想说的是,“改进语言”并不代表如Rails 2之于Rails 1.2,Python 3之于Python 2.5那样的“破坏性”改变。改进语言只要保持向前兼容,还会有什么问题吗?难道C#1.0到3.0的过程中破坏了以前的程序吗?很明显,C# 1.0中的所有语法到3.0还可以用,而.NET Fx 1.0编写出的应用程序在3.5上也基本能用。这不就是很好的证明吗?这样的升级无论是语言(包括语法和IL/Binary Code级别的指令)、框架/类库、亦或是平台都不会造成问题,为什么在Java上面就成为无法升级的理由了呢?Java为.NET证明了统一托管平台的成功,由此诞生了.NET,而.NET为Java证明了那么多有生产力的高级语法,社区也吵吵嚷嚷多年——Java又在做什么呢?

质疑:想想c++吧,十年还没有出一个新标准呢。另外,微软一直不肯提供C#在Windows平台之外的支持,算不算固步自封呢?

回应:最后说C++,十年还没有出一个新标准——我不知道,我不关心别人为什么做的不好,我不关心别人的缺点为什么就能成为我不向前看的理由。我不提C++的另一个原因,是因为我对它的了解程度还不够,说了怕别人笑话。还有说微软一直不让C#在Windows以外平台上支持,这是固步自封吗?这是微软的一贯策略而已,当然这个策略我也不会认为是好事,但是谁能告诉我为什么这就叫“固步自封”?难道没有看到mono已经越来越引人注目了吗?微软在这方面的确“封闭”,但可没有“固步自封”。

质疑:Java开发效率虽然比Ruby、Python低,但有丰富的类库、框架和开发工具,更何况Java语言更加严谨,程序员的风格较为一致,减少了许多可能的犯错机会。综合起来,其效率真的会比C#低吗?

回应:某个语言“功能强大”,便说它“混乱”,自己“能力不足”便说是“严谨”。说实话,我认为这是一个很可笑的理由——不过也不是第一次见到这样的说法。从Ruby流行开始就有这种说法了,每次我都看得无可奈何,一笑了之。记得之前哪位朋友在园子里说过类似的话:“人们都希望事物发展,但是一旦事物发展让自己感到难以控制,就会引起恐慌,并对其打压”。虽然当时是在说C#语法的升级,但是现在也恰好可以用在C#与Java方面。至于框架的强大——我知道这一点肯定会被拿出来提,因此每次说Java“坏话”时总归会强调一下Java这一优势,只可惜似乎又被忽略了。那么我再强调一次,我谈论的是Java语法的生产力,不是Java平台的生产力——平台上框架的强大,难道语言上就可以不进行改进了吗?难道进行了语言能力上的强化,用它编写的框架就会变少了吗?平台能力就减弱了吗?当一个事物要用其优势来为自己的劣势做掩饰的时候……我就不多说了。

质疑:“难以辩驳的事实”是从什么数据得来的?太夸张了吧?即使用C和C++,只要对语言足够的熟悉,也不致于寸步难行。若果真Java如此难用,Java早就被淘汰了,不劳你唱衰了。

回应:我错了,我举不出“数据”,但是以前的文章都已经给过“示例”,个中比较可以由大家自行体会。至于“寸步难行”……的确也是我夸张了,我错了,以后不随意用修辞手法了。至于Java是否难用,是否早该被淘汰,我想说的是,您又犯了“极端化”的逻辑滑坡错误了。Java的确难用,但是我并没有说他难用到以至于无法推广,无法使用的地步。Java也不是没有过“优雅”的时期,只是到现在来说已经太不够看了,而且还是那四个字“固步自封”。我也从来没说Java平台应该被淘汰了,我还眼馋它们上面那么多项目呢,而且平台的能力并不是一个“语法”一个因素就能“拖垮”的。那么多年下来,大家早有依赖性了,肯定会继续用Java。不过我想说,如果回到十几年前Java刚出现那会儿,出现一种各方面都和Java一样,唯一的区别便是拥有C#语法的语言,Java能否活到现在还是个问题。

质疑:“你可以说ruby某个功能1行就能做,而C#要5行,那么我可以补充一个类库,完成1 行的功能。而Java就做不到”为什么Java就做不到呢?能说个理由吗?“这也是为什么现在不少编程语言的书,都喜欢和Java做对比,因为Java的生产力的确是‘难以提高’”——这个说法十分站不住脚。什么语言都与Java比,那是因为Java是当今最流行的语言。等C#在流行度超过了Java,人们自然会找C#比。

回应:不知道郑同学说这句话的时候有没有看过我那篇文章中给出的链接——没看过也不要紧,现在我再整理一下。那篇文章是《从CSDN的趣味题学C# 3.0》,因为有朋友认为Python做字符串小游戏很顺手,于是我也就顺便使用C#实现了一下,体现以下C# 3.0的强大特性。这个字符串游戏挺有意思的,不如郑同学用Java也来玩一下?C# 3.0已经不同以往,引入了Lambda表达式、扩展方法、LINQ语法之后在很多方便已经不熟于Ruby、Python等语言,用来玩玩这种小游戏也丝毫不落下风。而且您还别认为这只是一个“玩具”,就在我《高阶函数、委托与匿名方法》这篇文章里就用Java来设法“模拟”了一把C#里轻易实现的功能,不知道郑同学对此如何感想——求求您不要告诉我这个例子实际生产中没有用,因为这并不是我乱想出来的,在函数式编程语言,或者Parallel Fx中早就大量运用了。我懒得“列举”出来了,原谅我吧。

至于“作对比”是因为“流行”还是“能力”原因,似乎有点微妙,在这里不多作讨论了。现在呢我想多谈谈为什么说“生产力的确是难以提高”——我忽然又想到当时初学Ruby时看的《Everyday Scripting with Ruby》一书中对Ruby的功能大家赞赏,尤其是它的正则表达式配合灵活强大的语法给我留下了无比深刻的印象。当时C#还处于2.0阶段,由于没有Lambda表达式和扩展方法的特性,C#在这方面远远落后于Ruby。不过不久之前刚好施杨同学刚好需要《实现一个项目需求》,要求把一个字符串中1存在的位置区间表现出来,例如“00101111110111101110 => 3, 5-10, 12-15, 17-19”,这时某位匿名大虾用Ruby给出了一段实现,很好很强大:

i=0;
"00101111110111101110"
    .scan(/0+|1+/)
    .map
    {|s|
        l=s.length;
        i+=l;
        s.to_i.zero? ? nil : (l>1 ? "#{i-l}-#{i-1}" : "#{i-l}")
    }.compact * ", "

虽然在正则表达式的使用上略有缺陷,不过这段代码使用表达式配合map方法把Ruby的特点实实在在地表现了出来,很有典型意义。我一时兴起,也用C#实现了一把类似的:

String.Join(
    ", ",
    Regex.Matches("00101111110111101110", "1+")
        .Cast<Match>()
        .Select(m =>
            m.Length == 1 ?
                m.Index + 1 + "" :
                String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
        .ToArray())

嗯嗯,更好地利用了类库中正则表达式的功能,因此整体上更“函数式”一些,也更流畅了一些,不过基本思路是和之前的Ruby实现是一样的。不过好像……还是不够意思?没事,咱可以扩展嘛,简单扩展以后就可以变成这样了:

"00101111110111101110"
    .Scan("1+")
    .Select(
        m => m.Length == 1 ?
            m.Index + 1 + "" :
            String.Format("{0} - {1}", m.Index + 1, m.Index + m.Length))
    .Join(", ");

简简单单扩展10行代码,这边的实现便可以更进一步,这便是语言的能力,C#能做到,Ruby能做到,而我的Java造诣只能得出“Java无法实现”的结论了,又不知哪位兄台可以试试看?由于语言能力的缺乏,“无法提高”也已经是“不争的事实”了,还需要更多证据吗?其实我最近也常思考一个问题,那就是“语言和框架/类库”之间的关系以及重要性。目前我的结论是:语言与框架/类库相辅相成,但总体来说“语言 > 框架/类库”,因为框架类库可以在现有语言能力的基础上进行补充,新开发也好,从其他平台进行移植也好,都很难说是“能力”问题。但是语言难以由框架来增强,框架最多只能为“特定场景”增强,无法弥补“语言”上的整体能力缺失。关于这个问题,也欢迎大家和我一起来讨论。

质疑:楼主喜欢C#是你的事情,犯不着一而再、再而三地贬低Java吧?没有人反驳你,是因为园子里大多以.net技术为主,对Java不一定熟悉,而你在这里似乎又是个权威。但那不代表你说的都是正确的。本来你关起门来自说自话,我也不会费神去反驳。但既然放在首页,总要经得起推敲吧?尤其你还是个在园子里有影响的人,说话更要严谨。楼主听惯了太多的恭维话,我的话想必有些刺耳。先别急着反驳我,心平气和地想一想。一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。

回应:这可真是“终极质疑”了,直接怀疑我的做事方式,我不爱听,必须好好解释一下。我贬低Java不是因为偏见,而是因为Java本身不争气;我也在很多公开场合(比如.NET技术大会或MSDN Web Cast的讲座时,还够正式吧)发表对微软的不满(比如Oxite这个绝佳的反面教材);此外,博客园给我带来那么多好处,我不也很有唱衰的欲望吗?——这是一贯做事方式而已,不搞“平衡”,一个东西某方面不好也不会非要帮它找理由来掩盖。当然我承认,里面可能会夹杂对C#的好感,但是至少我举出自认为非常恰当的实例来证明我的观点。我也知道弟兄们对我的厚爱,因此说话最多“偷懒”不会“随意”,说出来的话自认非常严谨,欢迎大家推敲,也欢迎郑同学在此继续推推敲敲——不过咱讨论问题不光要“讲道理”,还要“摆事实”不是吗?郑同学的质疑啥都好,条理清晰,就是缺少事实依据。对您这点要求不为过吧?这也不光是对您的要求,我现在这篇文章也够有诚意了是不?

我其实也做过1年多2年不到的Java程序员,也一直在关注Java(语言和框架)的发展,做出现在这样的判断绝不是图一时之快,而是长久以来积压的不满情绪。我同意“一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格”这样的说法,也是这样的做的。之前在QCon上还和一些朋友谈过我对混合编程的实践和热爱呢(我认为“混合编程”绝对是趋势),而作为一个山寨版的Web 2.0架构师,对于其他平台的各种技术必须得有足够多的了解啊。请大家相信我,我一直在关注其他各种语言/平台/框架(实际上我也一直在结合使用,上次北京俱乐部聚会中我也强调了这方面的重要性),绝对不是井底之蛙——就算还没有变成“王子”,不管怎么说也是个井外的蛙呢。

可惜,对于Java……不用多说了罢。

 

咳咳,好累,好累。大家也一起来讨论,也欢迎大家叫上Java的朋友一起来玩,转载到Java的阵地上也无不可。不过有些东西兄弟我说在前头,一些啥“语言不是关键,没有讨论必要”,“你个死胖子有什么资格评论这些个”这类问题咱就先放放吧,大家在进行讨论的时候记得切中关键,并且看清我已经谈过的东西——咱也要遵循DRY原则嘛。至于如果您还要说我是“MVP鼓吹微软技术”不可信,那还真不怕您笑话,我半夜里辛辛苦苦码上这四五千字,微软不会给我一定点儿额外好处——平时也没有。信不信由您,咱也恨着呐,真的。

标签: C#, Java
Add your comment

336 条回复

    评论共4页: 上一页 1 2 3 4 
  1. #237楼 jun      2009-04-20 22:52
    --引用--------------------------------------------------
    兄弟,你刚刚批评我脑子不好使,现在又这样。我工资虽然不高,但也不至于到生活窘迫。有工作压力,但还是能在上班时间抽出几个小时来学习,来BLOG看看。你说我傻X,这点勉强同意。我老婆也说过我傻X,那次是因为我把一个工作岗位让给一个兄弟,换来一个朋友。
    --------------------------------------------------------

    赞一个小猴子,撇开技术不说,这样的人才值得一交。
     回复 引用 查看   
  2. #238楼 躺着读书[未注册用户]2009-04-21 07:04
    首先java是不大可能有太大的变化了。即使是在oracle74亿美金买下以后。

    很多的技术互相依赖。我个人是做科研的,用的就是java,目前的总趋势是一些化学啊,生物啊,物理啊等领域原来都有专业软件的(比如说什么D语言之类,名字都未曾听过在某个领域却是响当当)现在这些专业软件都在往java转移。当然java在这些领域做得还十分的有限,根本不能和这些专业软件比,但是很多的项目都根植于java好多年头了。

    科研领域和生产领域有很大的不同就是:一个项目做了1、2年,然后就完成了。接下来,没有任何的改变,但是因为你的项目发布了出去。就会有几个或者几十个项目基于你的项目。接下来,年复一年。如果一旦有成果,这些java的实验项目很容易的就转化成了产品。如果像C#那样几年一个变化,等到几年后你之前写的东西就过时了,那你又要不停的重写那简直是不可能的。而java,哪怕你是几年前写的代码,别人看你的代码还是那么的“时尚”。

    还有就是跨平台、修改二进制码和脚本生成代码。C#是也都能做到。但是能不能做到和做得怎么样是两码事。做得怎么样还是要靠产品说话的。就好比C#支持泛型,我说java也支持呢。哪个好?我总不能说c#能做的java也能做到,java做不到的在未来jdk7中也会做到的,java也是向前进步的嘛。

    其实我个人是不希望java有啥新的语言方面的“进步”的。我只是希望java的产品能够越来越广,能够垄断。开发效率低?开发效率低,代表要聘请很多的人,扩大就业机会。语言不进步?语言不进步,代表程序员的知识比较稳定,不需要总去接触新的东西,从而和建筑工程师一样。花十几年学东西,剩下的几十年,看看图纸收钱。体系复杂?体系复杂代表进入门槛高,可以不让街头的什么培训学校培训一年出来的人就能和我们平起平坐。

    看C#最近是往动态语言方面走了,感慨良多。C#和Java已经是截然不同的2条路了。以后C#可能会占有相当程度的网站市场。但是网站市场变数太大:asp, php, jsp, python, perl, aspx, struts.do....谁知道将来还会有什么呢。 java可能会慢慢替代cobol,以及在数据库领域、通讯和科研领域成为工业标准。
     回复 引用   
  3. #239楼 张蒙蒙      2009-04-21 09:01
    我两个一起用,是被逼两个一起用的,有时想如果可以留着相互的优点该多好啊。
     回复 引用 查看   
  4. #240楼[楼主] Jeffrey Zhao      2009-04-21 09:05
    @躺着读书
    我文章论述的那么多,C#升级,代码是不需要重写的,还是被你忽略了,可见现在想要让人“看清楚文章内容”是一件多么困难的事情……
    你说的“希望不进步,以保持代码‘时尚’”,或者“不希望提高生产力,以保持相对优越性,扩大就业机会,并且垄断”之类的说法,很有意思,虽然我觉得历史上从没有什么事情是这样发展的,呵呵。
     回复 引用 查看   
  5. #241楼 lex choi[未注册用户]2009-04-21 09:57
    @躺着读书
    不知道以后O记Java还能否保持现有的开放性,如果Oracle把Java也商业化了,恐怕就无法继续用在科研领域了。
     回复 引用   
  6. #242楼 Jeffrey Hua[未注册用户]2009-04-21 10:28
    Jeffrey Zhao,
    Have you ever kissed a girl?
     回复 引用   
  7. #243楼[楼主] Jeffrey Zhao      2009-04-21 10:38
    @Jeffrey Hua
    kiss a girl有什么特殊含义吗?
     回复 引用 查看   
  8. #244楼[楼主] Jeffrey Zhao      2009-04-21 10:38
    @Jeffrey Hua
    kiss a girl有什么特殊含义吗?
     回复 引用 查看   
  9. #245楼 Ryan Gene      2009-04-21 10:52
    感觉讨论这个没有太大意义
     回复 引用 查看   
  10. #246楼 勇者之心      2009-04-21 14:45
    恩,英文没有中文好,英文只有十四行诗没有骈体文。。。
     回复 引用 查看   
  11. #247楼 zhao_jis [未注册用户]2009-04-22 14:26
    大家来围观LZ装X
     回复 引用   
  12. #248楼 Victor      2009-04-22 16:15
    @zhao_jis
    ....脑子被驴T了吧...
     回复 引用 查看   
  13. #249楼 躺着读书[未注册用户]2009-04-22 20:33
    不仅仅是代码吧,java也能做到字节码的向下兼容,这个的确不容易。当然这个是jvm和.net平台的问题。不过讨论语言也不能完全不谈平台,也是不切实际的。因为并不是所有的时候都能拿到源代码的。我知道或许c#有dll的转换工具,不过用vs转换以前的项目总是失败,想着都不放心哪。

    对于语言的新特征。可以这样说:如果有一个写C的人,他的工作就是用C语言调整霓虹灯的播放顺序。他已经写好了几千多种程序。这个时候你却对他说,你可以不用这么写,你可以试下2.0的语言特征少写几行。然后试一下3.0的语言特征再少写几行。这看上去是好事情,因为当他如果要写新的播放程序的时候,他能少写几行,获得解放。

    但是那个人,肯定会破口大骂的。呵呵。因为第一他每天要去喝酒,要去见客户,要去玩,他哪有时间学习新的东西?第二,虽然以前的代码兼容,他还是可以像以前那样写,但是新招的学徒都是这么写,他恼火不已。第三,有一天上网,他去上他的霓虹灯专业论坛,看看高高手的程序,发现怎么也都是全部用了新语言特征,花花绿绿的。所以他觉得他不得不学。于是他喝酒的时间没有了,玩的时间也没有了。等到他学完。又有人告诉他,喂,4.0的新语言特征出来啦。5.0在议程之上了哦。他肯定会一口鲜血喷出。呵呵。

    其实我也是这样一个工人,比起编程我还是更喜欢吃吃喝喝,到处玩玩。你说不停的学下去何时是个尽头?总要留点时间想想生活吧。可不要出去玩个半年,天都变了。不然程序员总是被束缚在键盘之上,生怕被淘汰了。而那些学汽车的,学机械的,他们确可以潇洒快活。你说凭什么呢?想100年前,汽车不也是个时髦的行业?一天不学习就会被新的知识给淹没。

    Anders在08年的演讲我也听了。说是c#4.0的新特征就是动态性。后来,他又在推广F#。python我用过,我也想谈谈,动态性强,建网站的速度肯定又快又好。我觉得没有一个语言能解决所有的问题,c也好,c++也罢,java也好,.net也好。其实都是在各自的领域内为战的。

    Linq确实是一个伟大的创新,能够把函数编程里头的lamda这样的用,挺新鲜的。其他的东西,我并不觉得c#和.net平台是在创新,而是不停的把其他语言的东西拿进来做成大杂烩。也亏得是Anders这样的伟人设计的,其他人恐怕早就搞砸了。Anders终究还是没有吧函数编程里头的list comprehensive, lazy evaluation 拿进c#而是弄了个f#,遗憾哪。

    至于oracle倒不必太过于担心。首先,oracle也不见得非得封闭不可。是人都知道java就是靠开放才有今天的成就的。他一拿到就封闭,你也太小看那个比比尔盖茨还会玩兼并的埃里森了。其次sun早就开放了jdk而且是基于GNU授权的,而非sun的jvm本来就有很多个各家公司都有,ibm,redhat,oracle,开源组织都各有各家的jdk。如果oracle真的搞封闭。那我们也只有挑一个兼容现在字节码的jvm的机器,反正现在很多项目还是在jdk1.4之上呢。没办法,很多人都不理解泛型是什么东西?觉得尖括号太难看。而且用那个也没什么好处嘛。而,我觉得任何一家做大了,恐怕都不会放弃对于1.4的字节码的兼容吧。

    其实很多人把问题想得很复杂。我们需要一个什么样的语言?第一,有垃圾回收机制。第二,面向对象,类库强大。第三,有个傻帽公司不去研究新的东西,而是不停的把这个语言实现到各个最新最先进的系统之上。至于语法上的特征,多写几行就多写几行呗。
     回复 引用   
  14. #250楼 躺着读书[未注册用户]2009-04-22 22:37
    其实我对c#也有很多意见的

    比如说它的操作符重载只支持少数几个操作符,要是能和c++或者haskell一样完全自定义操作符那就好了。这样才能和函数指针以及lamda表达式配合得天衣无缝。比如说既然有了lamda表达式,为什么不支持list comprehensive?

    既然4.0支持了dynamic我估计lazy evaluation肯定也会获得支持的。这样,很利于写随机测试。

    好了,这一切都有了,为什么不弄个message passing的内存模式?这样写多线程就可以不必写效率低下的lock了。

    但是这样一想,那c#到底是一个什么样的东西?到底是适合在哪个领域?就像我之前所说的,适合一切的编程语言是不可能的。C++把以上的特征几乎全部做到,还是始终跑在底层上。c#弄了这么多,确还是一个asp.net。我倒是挺希望windows 7 能赶快普及,这样c#起码能进入到桌面程序领域。

    至于oracle,我看大家了解太少
    http://www.jroller.com/scolebourne/entry/no_java_se_7_the1

    首先oracle是积极支持JCP独立,把java语言公有化的,早在2007年就是它提议给JCP更大的权利,支持apache项目而反对sun对java语言的独占。

    JCP EC meeting summary - December 7th 2007
    Resolution 1 (proposed by Oracle, seconded by BEA)
    "It is the sense of the Executive Committee that the JCP become an open independent vendor-neutral Standards Organization where all members participate on a level playing field with the following characteristics:

    当然,不知道现在oracle拥有了java以后还会不会如此。这是一个很有意思的事情。
     回复 引用   
  15. #251楼[楼主] Jeffrey Zhao      2009-04-22 22:51
    @躺着读书
    C#其实和Java能做的事情一样,唯一的区别看来只是“舆论”,能力什么的都有证明了。
    还有message passing适合框架来做吧,比如微软的CCR已经实现了这样的功能。
     回复 引用 查看   
  16. #252楼[楼主] Jeffrey Zhao      2009-04-22 22:54
    @躺着读书
    oracle老大很有意思,n多年前就说“我觉得世界上几台计算机就行了”,后来计算机铺天盖地。但是现在进入云计算时代了,似乎又接近他当年的思路,现在却忽然说“我不知道云计算有什么意义”——真是商业利益可以改变一切呀,呵呵。
     回复 引用 查看   
  17. #253楼 幸存者[未注册用户]2009-04-23 00:16
    @躺着读书
    似乎公认共享内存的线程同步模型比消息传递效率高,共享内存的缺点是对开发者不友好,lock很难用好。
     回复 引用   
  18. #254楼 躺着读书[未注册用户]2009-04-23 02:02
    @幸存者
    你完全弄反了。 共享内存是开发者友好,但是效率低下。消息传递是效率高,但是开发者不友好。 你去搜一下erlang的资料就知道了。

    这个我还是专门培训过的,还记得很清楚。
     回复 引用   
  19. #255楼 躺着读书[未注册用户]2009-04-23 02:09
    @Jeffrey Zhao
    “舆论”的力量很重要啊。 话是人说的,这里的舆论就是各家公司的言论,也从另外一个侧面说明了其他公司对于java和c#的态度。如果人家的产品是java的,当然说java的好咯。c#的没有,当然要谴责c#没有能力。关键是产品啊,产品!

    c#的跨平台始终是个问题,我不是说mono的坏话。我觉得mono的前途在与把c#的windows桌面程序移植到linux下,这个很有吸引力。你说企业级,或者科研,还是不碰为好。至少java的虚拟机早就是linux\unix下的标配了。说来可笑,就有点像windows排斥linux一样。 先占领市场的,有客户依赖噢。后起者再优秀,别人的产品一堆压死你。你再优秀你还要开发呢。人家连开发都免了,直接用就是了。

    至于oracle,sun做了一件大好事就是在自己完蛋之前几乎吧java的所有部分都开放了,这样即使oracle要封闭,其他公司如果要产生基于java的新语言也八九不离十的。不过我还是不希望这样。我觉得oracle不会傻到闹分裂,而是会把各个方面都打理好,只要大家都用java,他又有java的版权,不正好收培训费和咨询费么?

    话说我早就偏题了。我本人学了好些年的java了,最近也研究c#,还指望您的指导呢。呵呵。我觉得在语言级加新功能要有个度,我现在学c#我就觉的c#太复杂了。比java难学一倍还不止。java以eclipse的出现为分水岭,eclipse出现以前,java是很难写的,写得太繁琐。eclipse以后,很多代码都是自动生成,重构也很强大。所以我觉得很多语言级别的增强,为什么不能放到IDE或者平台的新语言上去解决呢?这样一个语言就干一个语言的事情,各有分工合作。

    最后赞一下LinQ,绝对是伟大。O(∩_∩)O
     回复 引用   
  20. #256楼[楼主] Jeffrey Zhao      2009-04-23 02:15
    @躺着读书
    我也看过erlang,不过我觉的你说反了?
    之所以内存共享效率高,是因为它不需要做数据的复制。说消息传递效率高,是因为它可以大量并行。
    但是如果内存共享也写成并行的,那么效率自然也就高了,而且还不像erlang需要复制数据。
    所以有人说erlang是欲练神功挥刀子宫,大量复制数据造成浪费,不适合计算密集型应用。
     回复 引用 查看   
  21. #257楼 躺着读书[未注册用户]2009-04-23 02:26
    @Jeffrey Zhao
    那要看你怎么定义效率了。以及程序是在什么环境下并行。

    我所说的效率是并发效率。erlang所宣传常常是什么在普通的PC上百万线程并发。这个java和.net都做不到吧?
    在高并发的环境下,lock的瓶颈就产生了。因为lock的时候各个线程之间访问这个程序块,要么效率低下,要么编程困难。而消息传递模式则不然。这一原本lock的部分在各个线程之间还是同时计算的。所以叫做“效率高”。

    所以消息传递模式比较适合运算密集型的程序,也就是各个线程都比较轻量级(我指内存)。通常用在通讯和科学计算领域。
     回复 引用   
  22. #258楼[楼主] Jeffrey Zhao      2009-04-23 02:26
    @躺着读书
    舆论我不想谈,我只想谈能力,因为我又不是要为微软做销售,.net有能力就够了,而且产品和实例也已经讲的够过了,真正企业中的说法和社区这边胡乱嚷嚷的不一样。比如有些人就会嚷嚷银行,没办法银行都十几二十年的老系统了,当年还没有微软的服务器市场呢——现在都逐步抢占过来了。
    至于跨平台,企业的目标不是跨平台,它是节省成本,微软的解决方案综合产品成本低,自然会选择微软的(微软有授权费用,但是开元平台也要负服务费阿,oracle比sql server贵10倍,sql server性能也根本不差)。而且就算要和linux系统配合也不难,现在都是基于标准了阿,大家都用tcp/ip,http,ws,没有区别,两台linux服务器之间和一台win一台linux之间配合一样的。
    我也偏题了,赫赫。我不觉得工具可以弥补语言的生产力,但是我觉得语言这东西的确混合使用是必然趋势,因为没有语言能做任何事情——但是我也不觉得这就是语言不发展的理由……
     回复 引用 查看   
  23. #259楼[楼主] Jeffrey Zhao      2009-04-23 02:30
    @躺着读书
    消息传递如果不用lock,那么也是基于不共享的原则。如果要共享数据,那么还是需要lock了,比如多个消息读取同一个资源(文件/网络)
    内存共享也可以做到线程之间不共享的,比如做矩阵乘法各做独立的一部分,所以也不存在瓶颈的问题,当然编程麻烦是确定的。
    这里麻烦还是简单说的是,基于现有模型下麻烦还是简单,不是实现一个消息传递模型的难度。
    所以消息传递是个“模型”,实现这个模型麻烦,基于这个模型开发简单。实现消息传递模型,用内存共享的方式也完全可以做到low-lock或lock-free的。
    erlang那种消息传递,如果复制了大量数据,内存复制的开销就是浪费的。所以我觉得趋势应该是读取数据通过内存共享方式,而任务分配方式是消息传递的。
    // 睡了,醒了再讨论,赫赫。
     回复 引用 查看   
  24. #260楼 躺着读书[未注册用户]2009-04-23 02:42
    确实无论是消息传递还是共享内存,这都只是内存的模型而已。

    只是“开发者友好”和“效率”,这2个很难定义哪。如果是消息传递模式,势必你以前的编程习惯也要改变,这个你适应了就友好了。关键是很多人很难转过脑筋来。相反,如果要在共享内存的模式下,实现复杂的消息传递,那势必“不友好”。但是如果你对lock-free技术等等都有了解。lock-free其实也可以看成一种简单的消息传递。那么你也就“友好”了

    至于效率看来我说得也是有问题的。同样的,如果消息传递模式里头也有优化,比如说不复制了。那么效率也高。实际上也有人做这种优化。不过在分布式运算的环境下,你势必是需要复制的。
     回复 引用   
  25. #261楼 xiaotie      2009-04-23 04:35
    @躺着读书
    .Net下并发百万线程可以做到,得自己写线程库或用第三方线程库。
     回复 引用 查看   
  26. #262楼 xiaotie      2009-04-23 04:41
    @躺着读书

    erlang只不过把这种线程模型内置入语言之中了。Java, .Net, C, C++都可以做到百万线程甚至千万线程,但需要第三方库,网上都有实现的。在此之上,如果需要更高的运行效率,需要自己写Scheduler。
     回复 引用 查看   
  27. #263楼[楼主] Jeffrey Zhao      2009-04-23 09:27
    @躺着读书
    lock-free怎么理解为一种消息传递?
    erlang的问题我觉得是无论分布不分布都会复制,这是它内置模型决定的。
    所以我觉得这个模型还需要调整,相信会有更好的东西出现。
     回复 引用 查看   
  28. #264楼[楼主] Jeffrey Zhao      2009-04-23 09:29
    @xiaotie
    不是百万线程千万线程,操作系统抗不起的,erlang也只是说百万千万的process,这个process可以认为就是“任务”。
    所以其实实质是百万千万任务同时进行,这个是.NET/Java也做得到的。
     回复 引用 查看   
  29. #265楼 fs[未注册用户]2009-04-23 11:45
    System.out.println("太有道理了!");
     回复 引用   
  30. #266楼 躺着读书[未注册用户]2009-04-23 20:09
    @Jeffrey Zhao

    lock-free的原理就是写一个loop,开头的时候记录某个资源的值,当loop结束的时候去比较这个资源的原始值和最新值。如果最新值变化了,那就表示有其他线程访问和更新了值,自己就从新执行这个loop。如没有变化,则自己更新这个值。这个资源其实就相当被拿来通讯。

    你说的我并不同意,看下面:

    如果有2个线程p1和p2他们都要访问一个资源r,进行操作action。如果是erlang的模型,会把这个资源r复制2份传递给p1和p2,当他们计算完成再通过一个线程D来收集r1和r2的值,获得总值,这个时候计算完成。

    如果你采用的原始的lock。那么资源r不会复制,但是p1和p2进行action运算的时候必须是p1和p2按一定顺序进行(因为action被锁住了)。如果这个时候是一万个线程,这个时候的等待时间就很长。所以效率低下。

    这个时候如果采用lock-free技术:同样的资源r不会复制,这个时候没有同步的运算快(synchronized),p1和p2同时进行action运算,但是他们在更新的时候会比较刚开始进行action运算的时候的r值和运算结束后的r值是否一样。如果一样,在自己运算的时候没有其他的线程更新这个资源r,那么自己更新。如果变化了?则重新读取r值,自己的action模块按新值重新跑一次。这样如果是一万个线程跑的时候,没有等待,但是会有大约100个线程重新跑了2遍action甚至4,5遍。这样效率大幅提高,但是还是运算的时间还是大于消息传递模式。

    这个时候,问题来了。是这重跑的200多遍的时间大呢?还是复制资源r的时间大呢?如果r只是一个原始类型,那么肯定是重跑200遍的时间大。消息传递模式胜出。如果资源是一个开销大的资源,那么内存复制的开销就不能忽略。

    这个时候要具体分析:
    首先考虑矩阵的情况,如果整个矩阵是一个资源,那么通过人的思维很容易的吧这个矩阵分成一个一个的模块,先分别运算,在最后的时候一起相加。这个时候其实与其说是复制资源r,不如说是分解整体资源R给很多的r。内存开销仅仅只是共享内存模式的2倍而已。

    如果你编程的时候没有分解,而是把整个大的资源R给了很多的小线程,那么你的运算就是一个灾难。

    所以说erlang的应用范围很小,仅仅在于电信领域,和部分科学计算领域。

    顺便提一下这种思维方式和jdk7中所要添加的fork然后合并模式很类似。但是消息传递模式能够实现的运算模式绝不只有这一种。我提到这个例子只是因为这是最简单的。
     回复 引用   
  31. #267楼 幸存者[未注册用户]2009-04-23 21:40
    @躺着读书
    我虽然不了解erlang,但是你描述的机制很像STM,即共享事务内存。
    但是严格来说STM的机制是obstruction-free的
     回复 引用   
  32. #268楼 幸存者[未注册用户]2009-04-23 21:45
    并且STM和message passing是有区别的
    不过未来并行计算的发展方向似乎是结合STM和message passing
     回复 引用   
  33. #269楼 躺着读书[未注册用户]2009-04-23 21:50
    从我上面说的看来

    lock-free技术其实也还不是真正的并发,实际上action运算还是有先后顺序的。只是不会像有lock的时候那样,傻傻的等在那里。(这个有点类似cpu的超线程技术?)真正的并发还是只有消息传递模式。

    当然,内存的开销是在那里的。无法避免的。
     回复 引用   
  34. #270楼 躺着读书[未注册用户]2009-04-23 21:52
    @幸存者
    你说的是我对lock-free的描述? 正是!
     回复 引用   
  35. #271楼[楼主] Jeffrey Zhao      2009-04-23 23:02
    你说的完全正确,但是我说的没有问题。
    我说了前提啊,要把不同线程做不同事情,不会互相阻碍,如果真要互相阻碍,那么也可以看情况复制成多份,权衡复制开销和锁开销。而且有时候共享内存,而不是互斥的资源,也没有问题,例如只读的资源。
    我说的lock-free不是替代message passing,而且lock-free也不一定适合所有情况,就像你说的那样。
    所以就像我说的一点,erlang强制复制,没有选择,这点可能会遇到瓶颈,而共享内存可以共享只读的资源,不用额外复制。所以我倾向message passing但是不倾向erlang。
     回复 引用 查看   
  36. #272楼 Bob-wei      2009-04-24 16:01
    前辈们都吵吧,真是大开眼界。
    难怪程序员总该有做不完的工作,
    这不,没事做了,就开始自相残杀。
    都是搞程序来解决现实问题的,吵什么吵。
     回复 引用 查看   
  37. #273楼 阿滨       2009-04-24 17:09
    @躺着读书 哈哈,骨灰级的吵架大师!!!
     回复 引用 查看   
  38. #274楼 dfd[未注册用户]2009-04-24 21:17
    身心原因
     回复 引用   
  39. #275楼 xiaotie      2009-04-25 03:02
    @Jeffrey Zhao

    又不是内核线程,没啥扛不起的。这些线程库,都是用的 Thread 这个词的。
     回复 引用 查看   
  40. #276楼[楼主] Jeffrey Zhao      2009-04-25 14:41
    @xiaotie
    你说的是fiber?
    首先托管代码里是操作不了fiber的(pinvoke或cli/c++例外),其次fiber也不适合相当多场景的。
    我没听懂什么叫作“thread”这个词,不过如果要真正跑数千个线程,上下文切换已经耗时太多了,数千个thread要的stack也已经撑了几百兆到几个G了,所以才要线程池这个东西,操作系统也提供原生支持。
     回复 引用 查看   
  41. #277楼 mysun      2009-04-25 22:29
    老赵辛苦!
    以前我埋怨跟着MS走太累,更新太快,天天都在学习。后来我终于明白了。技术的更新进步,促进我们的进步。
     回复 引用 查看   
  42. #278楼 Nick Wang      2009-04-25 23:39
    万丈高楼平地起啊,老赵的楼特别容易盖...

    今天听到周爱民的一句话:有时候的争论,不是为了正误,而是为了面子。不知道盖楼的都是为了正误呢,还是为了面子.
     回复 引用 查看   
  43. #279楼 Ramy      2009-04-28 12:56
    评论某个语言首先看看自己有没有那个资格,你觉得资格够和java语言的开发者相提并论么?还是你觉得你够资格和C#语言的开发者相提并论?
    你可以说.net如何如何强大,没人会骂你!
    甚至你可以说你不喜欢java,也没人骂你!
    但你不能说java如何如何不行,那肯定会有人骂你!
     回复 引用 查看   
  44. #280楼[楼主] Jeffrey Zhao      2009-04-28 13:07
    @Ramy
    其实我觉得啥时你不谈资格论了,啥时你就搞得好技术了,呵呵。
     回复 引用 查看   
  45. #281楼 韦恩卑鄙      2009-04-28 16:21
    java本身也是产品么
    对产品不批评只知道捧 无异于被卖了还帮人数钱
    老赵骂m$也丝毫没软过 更没有必要给什么别的产品留情的余地

    还是事实说话
     回复 引用 查看   
  46. #282楼 幸存者[未注册用户]2009-04-28 17:01
    什么样的语言才是优秀的语言?突然想到很久以前看的一篇文章,有兴趣的可以google “百年语言”。
     回复 引用   
  47. #283楼 Sai~      2009-04-29 09:02
    唉,怎么 又来 比这些东西,
    再好用的语言 也是为了做 商业产品,
    再牛X的C# 做出来的东西,没有商业价值都是 0

    国家单位 要 Java 怎么说的?
    C# 那种被微软 恶魔化的东西,不能用,防止微软垄断化,


    老赵 很明显的 是 不挣钱的帮微软做活 广告啊,
    要知道 以后 的语言
    是不用会编程的也会做的

    不给你废话了。
     回复 引用 查看   
  48. #284楼[楼主] Jeffrey Zhao      2009-04-29 09:14
    @Sai~
    C#做出一个失败的产品当然没用,但是我现在说得就是C#写出优秀的产品更方便嘛,呵呵。
    还有C#被微软恶魔化啦?我觉得是微软被你妖魔化了,哈哈。
    我现在看到这种说好话就是做广告的说法真的很无奈啊,啥时吵架时能够专业点,做到对事不对人,做到客观,你就可以进步了。
     回复 引用 查看   
  49. #285楼 我是阿狼      2009-04-30 11:18
    有在进行这种无聊的争论,谁愿意用什么就用什么呀,干嘛非得分个你死我活无聊呀,就是闲的
     回复 引用 查看   
  50. #286楼 CowboyRyan      2009-04-30 14:03
    路过,“一个好的程序员,应该有一颗开放的心,任何语言、任何技术都可为我所用,不带偏见,不拘一格。”这句讲得好。
     回复 引用 查看   
  51. #287楼 zzyy[未注册用户]2009-05-05 12:31
    什么时候世界上会有中国人发明的语言的一席之地。好闲啊!
     回复 引用   
  52. #288楼[楼主] Jeffrey Zhao      2009-05-05 12:42
    @zzyy
    别紧张,全世界看来看去也就美国人在发明语言,其他国家发明的人也变成美国公民了。
    但是各个国家的计算机行业还是那么热闹,说明发明不了是很正常的,争论也是必须的。
    否则全世界都把美国当大爷算了,都别搞了,你说是不。
     回复 引用 查看   
  53. #289楼 blacktear      2009-05-06 10:05
    路过,楼主可以试着比较比较汉语和英语。
     回复 引用 查看   
  54. #290楼 jiabaozhen[未注册用户]2009-05-07 15:28
    写个java实现:

    public static void main(String[] args) {
    Matcher matcher = Pattern.compile("1+").matcher("00101111110111101110");
    List<Object> list = new ArrayList<Object>();
    while (matcher.find()) {
    if (matcher.start() + 1 == matcher.end()) {
    list.add(matcher.start());
    } else {
    list.add(matcher.start() + "-" + matcher.end());
    }
    }
    String s = list.toString();
    System.out.println(s.substring(1, s.length() - 1));
    }
     回复 引用   
  55. #291楼 jiabaozhen[未注册用户]2009-05-07 15:34
    关于java与c#,我关注的一点:c#似乎只能运行在windows平台下吧?

    大型企业应用中,windows哪里是*inux的对手?
     回复 引用   
  56. #292楼[楼主] Jeffrey Zhao      2009-05-07 16:18
    @jiabaozhen
    嗯,Java实现的冗余可见一斑吧。
    还有,你一定没有仔细看文章和评论,否则你肯定知道我说的是“语言”而不是“平台”。
    再者,你的观点又过时了,Windows早就在大型企业应用中分了一杯羹了。最近的消息:伦敦奥运会只在某些地方用了一点点Linux,大型应用统统跑在Windows下。
     回复 引用 查看   
  57. #293楼 jiabaozhen[未注册用户]2009-05-07 18:39
    @Jeffrey Zhao

    我觉得这个例子并不能说明java的冗余,不都是10来行代码吗? 或许你需要一个更好的例子。

    我知道你说的是“语言”而不是“平台”,但是程序最后还是会运行在某个os上;
    还有,windows的服务器市场份额能有多少?高端的服务器向来都是类Unix,你看看电信行业、通信行业、银行系统,有多少用windows做服务器的?
     回复 引用   
  58. #294楼[楼主] Jeffrey Zhao      2009-05-07 18:56
    @jiabaozhen
    这个例子还不够典型吗?Ruby和C#都是1行,而且是流畅接口(Fluent Interface),Java用了10来行。
    语言是能够,也应该脱离平台来讨论的,这也是为什么会有语言向平台移植的情况。因为平台是好的,语言不行,所以靠其他语言移植过来希望可以弥补语言的低生产力。
    至于windows服务器市场,中小企业90%+,世界500强50%+,中石油,纳斯达克全部Windows,新构建的银行平台已经大量考虑windows了。这些都是事实,只是没有被人关注而已,呵呵。
    大型系统Unix多是因为历史遗留问题,没人会重写呗。这些系统大都已经有15年以上历史了,而10年前Windows服务器还没有半点市场份额。
    入手太迟,Windows的失误。
     回复 引用 查看   
  59. #295楼 MarkY[未注册用户]2009-05-08 10:19
    兄弟们,有时间多去研究和创造吧,还有好多的事要做呀!
    当八路军在研究究竟是德国造的驳壳枪好使还是小鬼子的王八盒子管用的时候,美日已经在中途岛展开的是多艘航母和几百架战机的对战.我们落后呀,得加油哇,兄弟们.
     回复 引用   
  60. #296楼[楼主] Jeffrey Zhao      2009-05-08 10:40
    @MarkY
    可惜没有正确对待识别德国造的驳壳枪好使还是小鬼子的王八盒子好用时,根本就没能力造出航母和战机呀。
     回复 引用 查看   
  61. #297楼 5207      2009-05-10 01:46
    对于老赵对java生产力方面的论述,还比较同意。但是java框架上的优势是这么多年形成的,也是有其道理的。

    C#路还很长,不见得就是未来。就像微软在网络方面做了很多,但却被别人走在了前面一样。

    java这种无平台支持的东西是没法走向未来的。这是注定的,也是必然的。跨平台永远都不可能是最主流。否则就不会有跨平台一说
     回复 引用 查看   
  62. #298楼 打酱油的[未注册用户]2009-05-10 02:02
    因为无知,所以无畏!
     回复 引用   
  63. #299楼 zzyy[未注册用户]2009-05-10 17:58
    @Jeffrey Zhao
    O(∩_∩)O~
     回复 引用   
  64. #300楼 柳城之城      2009-05-11 11:27
    我倒是仔细地看过了正文的文章,不过再看完后面的评论之后,已经把正文忘记得差不多了。

    我的观点是带着个人喜好的:微软的东西其实“可以有”。

    这个C#,我学着、用着感觉很舒服。基本上是我心目中很理想的语言了,例如:

    相当完美的面向对象
    有一个很强大的娘家——MS
    不断进步——有让人感觉到惊喜的

    我的回复简单地说,就是支持老赵!
     回复 引用 查看   
  65. #301楼 Kirov[未注册用户]2009-05-13 21:35
    看了这么多,有点想去关注一下C#的语法。
    我是欣赏UNIX的,爱看《UNIX编程艺术》,同时也不喜欢微软。
    如果仅从计算机语言的语法上来比较,这篇文章挺有趣。
    原谅Java语法吧,他从来就不是一把简单的螺丝刀。我喜欢shell & perl等等基于UNIX发展的语言,因为他们是好用的螺丝刀,而不是包罗万象的航母。
    KISS原则让人很舒服。

    感觉个人成长最迅速的一段时间,就是逐渐脱离MS,走入UNIX世界的这两年。
     回复 引用   
  66. #302楼[楼主] Jeffrey Zhao      2009-05-13 22:49
    @Kirov
    我成长最快的一段时间是深入MS的时候,当然我倒一直是跨平台工作的,呵呵。
    Java让我反感的地方,并非是一种包罗万象的航母,C++更像。Java给我的感觉更像是一把钢刀,可惜是大家刚会炼钢时练出的一把。
    因此比木刀强,但是由于不肯加入最新萃取技术,已经渐渐落后于时代了,呵呵。
     回复 引用 查看   
  67. #303楼 ZilchWei      2009-05-20 08:26
    大牛们在争论..
    不管什么语言..学精了就是好语言...跟着老赵走...希望老赵出一本asp.net mvc的书籍....顺便弱弱的问下:Professional ASP.NET mvc 1.0国内哪儿有卖.
     回复 引用 查看   
  68. #304楼[楼主] Jeffrey Zhao      2009-05-20 09:06
    @ZilchWei
    学精了就是牛人,学精了不好的语言还是不好的语言,呵呵。
    这本书国内没卖,不过网上有公开版本啊。
     回复 引用 查看   
  69. #305楼 Wells[未注册用户]2009-05-24 13:33
    做什么样的事情就选什么样的工具
    “筷子”和“勺子”谁更有用,您要不也给分析分析
     回复 引用   
  70. #306楼[楼主] Jeffrey Zhao      2009-05-24 15:12
    --引用--------------------------------------------------
    Wells: 做什么样的事情就选什么样的工具
    “筷子”和“勺子”谁更有用,您要不也给分析分析
    --------------------------------------------------------
    您偷换概念,用大道理唬人。Java和C#同族同宗,要比,也就是一把勺子和另一把勺子之间的比较
    其中一把勺子旧,破,许久不打磨了,其中一把勺子不断进化,想让使用者更顺手,更好用。
    对了,其实我是混合编程的实践者,而不是说“什么样的事情什么样的工具”等套话的人。只可惜,有了C#,我真不了解什么情况适合用java语言。
     回复 引用 查看   
  71. #307楼 高歌      2009-05-27 21:14
    看的好累,老赵果然fans无数啊

    每次别人问我Java好还是.NET好,我就问他你知道明天那只股票更好?

    只不过我现在满仓的.NET,只能希望MS大旗不倒了...

    支持老赵!
     回复 引用 查看   
  72. #308楼 CowNew开源团队      2009-05-27 21:31
    --引用--------------------------------------------------
    高歌: 看的好累,老赵果然fans无数啊

    每次别人问我Java好还是.NET好,我就问他你知道明天那只股票更好?

    只不过我现在满仓的.NET,只能希望MS大旗不倒了...

    支持老赵!
    --------------------------------------------------------
    听类似的言论总感觉好别扭,难道真的MS倒闭了你就失业了吗?
     回复 引用 查看   
  73. #309楼 live41      2009-05-30 23:58
    “你个死胖子有什么资格评论这些个”
     回复 引用 查看   
  74. #310楼 live41      2009-05-30 23:59
    "你个死胖子有什么资格评论这些个"

    楼上是发错了,我想说,这句最好笑,哈哈,喜欢blog主直率的为人..
     回复 引用 查看   
  75. #311楼 大白      2009-05-31 10:37
    用了几年的C#.Java没用过。学过一点。
    个人认为,在语法上,Java没有C#先进,优美。
    比如属性访问器之类的。
    C#语言设计上的优势是不可否认的。
    Java之所以比.net普及,是因为,.net出生的有点晚。
    如果,同时出生呢?
    当时,和Java挣天下的,难道有.net ?
    相对于asp,java肯定是首选。因为,大多数的人,喜欢c,C++.
    转到Java学习容易。
    当前,Java的优势,就是普及。长得比较大,成熟。
    但未来不好说。
    以后的windows,都直接集成.net framework了,当新的系统都集成了.net framework,那么到时.net程序,就是现在的win form程序了一样了。




     回复 引用 查看   
  76. #312楼 路过得[未注册用户]2009-06-16 11:42
    说了半天,我看说得意义不大,楼主得意思是c#语言本身得设计比java优秀,反对意见是说java得应用比C#广泛。其实,这两种语言的特点是由它们的开发公司的利益决定的。因为sun当时是一个服务器提供商,它开发java是为了更好的卖服务器,说java跨平台,其实,主要是支持unix,sun的服务器都是这种系统,其实,现在大多数企业应用都是基于unix内核的,java的开源是为了吸引更多的企业购买服务器,而不是语言本身。而微软是产品公司,他开发.net平台是想把更多的程序员吸引到这个横向的开发框架下,虽然现在看,当时的这个想法有点失败。c#语言的多次特性变化是微软无奈下的决定。因为,在企业开发领域,微软根本就是后来者,许多分布式的应用技术和企业业务流程,微软不是强项,所以,.net这项本身要做企业级应用的开发平台没有获得它预想的市场。其实c#和java谁好谁不好,没有意思,单从语言上来看,C#确实是有很多新技术在里面,但是历史往往对接受那些对真正能够创造价值的技术感兴趣,有的技术现在看是新技术,但可能很快被抛弃,作为开发者讨论那种语言好,意义不大,应该讨论在特定语言下如何开发出更好的产品会更有意义
     回复 引用   
  77. #313楼 我什么都不是[未注册用户]2009-06-29 23:10
    赵兄,说得有理。不过我相当不喜欢MS,,所以我用python+wxpython写桌面,用django写web,只用linux或unix,用openoffice,用firefox和你吹水。
     回复 引用   
  78. #314楼[楼主] Jeffrey Zhao      2009-06-30 00:01
    @我什么都不是
    门户之见呀,hoho。
    我是什么都用,.NET,Java,Python,Ruby,Windows,Linux——哦,基本上不用Unix。
    总之该用啥用啥,啥顺手用啥。
     回复 引用 查看   
  79. #315楼 kgame[未注册用户]2009-06-30 17:22
    ----------------------------------
    @Jeffrey Zhao
    我现在真想在说,如果现在有个C#编译器可以生成Java的binary code该多好,不知道你现在有没有听懂我的意思。
    ----------------------------------
    當然有
    那就是Mainsoft for Java EE
    有支援Visual Studio 2008
    官網:
    http://dev.mainsoft.com/Default.aspx?tabid=177

    簡介:
    http://blog.csdn.net/heqi915/archive/2007/06/21/1660891.aspx
     回复 引用   
  80. #316楼 阿龍      2009-07-16 11:11
    Who is '老赵'?
     回复 引用 查看   
  81. #317楼[楼主] Jeffrey Zhao      2009-07-16 11:49
    引用阿龍:Who is '老赵'?

    就是兄弟俺。
     回复 引用 查看   
  82. #318楼 congling[未注册用户]2009-07-20 05:43
    老赵,
    最近我做了一下.NET和java的性能测试,发现
    1. 在反射方面.NET的性能比java差上好多,很多东西都需要使用emit等方式进行优化

    2. 在hashtable的性能上,.NET的性能也比java要差不少

    我的测试
    http://blog.myspace.cn/congling1/category/585959.aspx

    我一直想优化NVelocity, 以致和Velocity一样的性能,但是目前还远未做到,您有否什么建议?
     回复 引用   
  83. #319楼[楼主] Jeffrey Zhao      2009-07-20 09:03
    @congling
    等我有时间去看看,谢谢!
     回复 引用 查看   
  84. #320楼 假装不认识[未注册用户]2009-09-07 15:34
    @幸存者
    请问,你说汉语“你好”,和英语“hello" 意思一样,为什么是不同的语言?
     回复 引用   
  85. #321楼 sanshi      2009-09-18 16:00
    赞,以后有人再给我说Java怎么好怎么好的话,我就拿这篇文章吓唬他。
     回复 引用 查看   
  86. #322楼 minttang2003[未注册用户]2009-09-19 08:02
    @躺着读书
    这话不对,你不应当选择java,应当选择fortran
     回复 引用   
  87. #323楼 googlehacks[未注册用户]2009-09-19 15:49
    看来当初我放弃Java,自学C#是对的,哈哈!
     回复 引用   
  88. #324楼 MK2      2009-10-10 10:54
    哈哈,python也可以做到的,献丑了。。。

    import re
    ', '.join([
                len(i.group()) == 1 and '%d' % i.end() or '%d - %d' % (i.start() + 1, i.end()) 
                for i in re.finditer(r'0+|1+', '00101111110111101110') if int(i.group()) != 0
                 ])
    
     回复 引用 查看   
  89. #325楼[楼主] Jeffrey Zhao      2009-10-10 11:12
    @MK2
    python的确是可以的。
    所以我说Java是低劣的语言,我丝毫不掩饰自己对它的厌恶,哈哈。
     回复 引用 查看   
  90. #326楼 Max On Java[未注册用户]2009-10-12 18:18
    一门语言是否高效不仅在于它是否能使开发者少按两下键盘。我只能说“喜欢微软技术的人,从骨子里都有一种奴性。”
     回复 引用   
  91. #327楼[楼主] Jeffrey Zhao      2009-10-12 18:30
    @Max On Java
    兄弟,别自命清高了,你还真以为自己血统有多高贵啊,不承认事实只能让别人瞧不起你,知道不?
    不过很显然,你我是属于互相瞧不起滴,没事没事。
     回复 引用 查看   
  92. #328楼 lerit      2009-10-15 22:17
    吼吼,我看到其他文章说的导火索啦
     回复 引用 查看   
  93. #329楼 我啊我呢我呵呵[未注册用户]2009-10-30 15:53
    我想说,C#的风格比JAVA好不是一点点,JAVA本身几乎没有进步,都是别人帮衬的,这种靠别人扶未必不好,但完全是被扶着的迟早没戏的。
     回复 引用   
  94. #330楼 helloworlder[未注册用户]2009-10-30 16:00
    java这种无平台支持的东西是没法走向未来的。这是注定的,也是必然的。跨平台永远都不可能是最主流。否则就不会有跨平台一说

    java人曾经说donet人 用VS开发,很笨,如果没有VS的智能感应。他们什么都做不成。程序还是要用写字板来写。
    多年后,jb,eclipse出来后,再也不见这种说法了。java人对于自己没有的东西一边说人家的不好一边学习人家的不好,然后重复着上一步,就这样成长起来的。
    JAVA人的特点是:
    一次编译,到处运行。现在变成 “到处调式!”
    性能超过C++! (偷学C++,接着打击C++)
    不需要物理的CPU就能运行JAVA!
    java os ! (开机半小时)

    美国大型系统用什么我不清楚,但是中小型系统绝对是.Net具有压倒性优势,我们公司专门做这块的。
     回复 引用   
  95. #331楼 sharerer[未注册用户]2009-10-30 16:04
    JAVA本身的发展明显后劲不足,现在的问题只是历史遗留问题
     回复 引用   
  96. #332楼 天堂口      2009-12-28 23:10
    @躺着读书
    支持你的观点,.NET做网站或者中小型的系统还行,但是真正上升到企业级甚至是行业级的项目的时候,.NET很难渗入。其实也不是.NET不行,就像谁也不能拿出标准的能够说服人的证据证明windows的服务器安全性比LINUX服务器安全性差一样。所以我觉得争论这个是没有意义的。我个人觉得.NET开发起来更舒服。但是不得不说,现在市场上对.NET人才的需求远不及对java的人才需求。
     回复 引用 查看   
  97. #333楼 天堂口      2009-12-28 23:16
    @Jeffrey Zhao
    当客户要求用java的时候,你就得用java
     回复 引用 查看   
  98. #334楼[楼主] Jeffrey Zhao      2009-12-28 23:29
    @天堂口
    客户又不懂Java还是.NET,hoho。
     回复 引用 查看   
  99. #335楼 天堂口      2009-12-31 19:49
    @Jeffrey Zhao
    呵呵,可不是所有的都不懂哦。
     回复 引用 查看   
  100. #336楼[楼主] Jeffrey Zhao      2009-12-31 19:59
    @天堂口
    懂的就让它们懂去呗,咱找不懂的,嘿嘿。
     回复 引用 查看   
  101. 评论共4页: 上一页 1 2 3 4 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1438975 9dLf2HsQBJY=