阅读更多

66顶
91踩

企业架构

翻译新闻 离开Java,寻找更佳语言的10大理由

2009-07-15 18:02 by 见习记者 ixu 评论(129) 有54791人浏览

寻找更好的Java替代语言的10大理由

作者:Mario Fusco  

译者:liuu 

 

      别误解,其实在我的职业生涯中,我已经编写了无数的Java代码;而且,我仍然认为Java一门伟大的(程序)语言。相对于C++SmalltackJava已经有了很大的改进;但现在,即使是Java,也已经开始感觉到了其15年的积重。

 

    事实上,在我的经历中,我总是不得不面对Java的设计和规范上的一些错误、缺陷和不足,这些东西,让我的Java程序员生活少有乐趣可言。现在全世界的Java程序员有数百万之众,Java写就的代码更达数亿行,要是我说Java在不久的将来死去,这还有些远。不管怎样,随着一些兼容JVM的语言出现(我最钟意Scala)后,这些问题变得越发不能容忍了,我开始想,是时候慢慢离开Java了(但并不脱离JVM)。具体说来,我认为Java语言的10大问题是:

 

   1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。

 

   2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。

 

   3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的对象是通过传递(译注:其实是复制对象地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此效果上类似传引用)。

 

   4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

    boolean test = a < b || a == b || a > b;

 

    5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List<?>参数,如果传进来一个List<String>,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:

 

    List<String>[] listsOfStrings = new List<String>[3];

 

   6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解 (@SuppressWarnings("unchecked")) 来处理这种情况,我觉得,范型应该可能被设计的更好。

 

  7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样,:

  

   doSomething(System.out.println("test"));

 

   8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如SpringHibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String

 

  9、差劲的Switch...case语句:Java规定,switch...case只能选择intenumJava5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。

 

  10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。

 

   真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。

 

注:原文见TSS http://www.theserverside.com/news/thread.tss?thread_id=55185,感觉作者说的还是有些道理的。 

                             

 

来自: liuu.javaeye
66
91
评论 共 129 条 请登录后发表评论
29 楼 wiflish 2009-07-16 09:31
标题党。。。
本来世界上就不存在十分完美的东西。。。
够用就行。。。不行就换个呗。。为啥要整篇这样的文章哇。。
28 楼 advantech 2009-07-16 09:27
我还觉得Java 1.4最好呢,简单明了。
27 楼 witcheryne 2009-07-16 09:24
说的挺有道理...
   每个人都有每个人的见解, 创建这些语言的目的都是给了能够更高效的处理问题,解决问题,提高工作效率..
   至于选择什么语言,基本属于个人喜好和项目需求问题..
26 楼 BearRui 2009-07-16 09:21
JAVA确实存在很多问题,也很想换到其他语言,比如Scala。

但问题是换了后去哪找工作了?
25 楼 HenryYu 2009-07-16 09:21
1,是的java在多核编程方面目前没有很好解决方案,但不代表java不能编写并行的多核的应用。我写过一个原型,比用erlang性能还要好。另外,函数式语言也不是万能的,例如erlang的语法绝对让你脑瘫。函数语言出现几十年了,都流行不起来,已经证明它是小众语言,只能作为解决特定领域问题也存在。Scala没有研究过,不作评论,若其是函数语言,鼓吹其代替java这样大众语言的位置,实在笑话。
2,4,5,6,8,9,不痛不痒。
3,7,不知说云
10,java异常处理机制是OK的。用checked还是unchecked,或者异常处理用的乱挤八糟,那是你设计能力的问题与java没有关系。
24 楼 cosina 2009-07-16 09:14
引用
为什么是Scala?为什么不是Ruby?
  很简单,因为scala是NG(3G)java
23 楼 wuyou 2009-07-16 09:12
回头请作者写一篇《离开C,寻找更佳语言的10大理由》

这种文章真是无聊,不管是多么完美的语言都会有坑,看见坑你还要往里跳,Java也没有办法  
22 楼 wenjixiao 2009-07-16 09:11
java还是很优秀的,我看现在没有好到超过java的替代语言。
scala好像不错,不过,它显得过于复杂。
ruby是动态的,我还是觉得静态的好一些。
python很实用,也是动态的,但是,你能说python比java好吗?还是不能。
21 楼 andrew913 2009-07-16 09:04
C语言还能在很长一段时间内继续成为编程语言的主流
20 楼 hengheng 2009-07-16 09:02
qingfengxia 写道
我们就很难理解,变量test为什么是false:

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

    boolean test = a < b || a == b || a > b;

这个test是false没错啊?大家说是不是?


a<b a>b 都会自动拆箱用来比较.而==同样作为比较运算符,却有不同的表现.所以作者可能觉得这样有点奇怪...干脆都不要拆箱好了..
19 楼 pure 2009-07-16 08:57
qingfengxia 写道
我们就很难理解,变量test为什么是false:

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

    boolean test = a < b || a == b || a > b;

这个test是false没错啊?大家说是不是?


作者的意思可能是显而易见的,就是说从表面上看他们应该相等,鬼管它对象引用比较还是值比较,我要的是结果,而这种写法的确会让人混淆,清晰的表达意思不是很好?

上面的Intger拼错了,应该是Integer,这里也就是要区分Integer和int的不同,所以显得罗嗦。
18 楼 manmoon 2009-07-16 08:50
又是一个搞技术死脑筋的人,java是否继续成功来源于开源的力量和众多大厂家的支持。所以与语言层次无关。
17 楼 javaeyebird 2009-07-16 08:49
引用

1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。

并行?哈哈,并行和闭包没啥特别的关系,要说并行,还得纯函数式,这才是天生的优势
16 楼 pangyi 2009-07-16 08:47
696960m 写道
为什么是Scala?为什么不是Ruby?


或许还是Python呢。

单一语言编程模式终将必淘汰,混合编程才是王道。

试想下采用Python来胶合各种用c、c++、java,甚至.net开发的组件,那多令人振奋啊。
15 楼 showgo1306 2009-07-16 08:43
有些道理,不过貌似Java只是一个工具,用不了这么多复杂的东东吧。
西方老儿就是喜欢搞些新板眼然后前者中国人的鼻子走。。。
14 楼 qingfengxia 2009-07-16 08:28
我们就很难理解,变量test为什么是false:

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

    boolean test = a < b || a == b || a > b;

这个test是false没错啊?大家说是不是?
13 楼 hlylove 2009-07-16 08:12
bubill 写道
有些鸟人就是喜欢误导,干。。

所以,鸟人一般一开始就先澄清。
12 楼 bubill 2009-07-16 01:17
有些鸟人就是喜欢误导,干。。
11 楼 firefly.li 2009-07-16 00:54
作者提到的这些问题确实存在,但感觉对实际编程的影响不大。很多问题都可以避免或者灵活的解决,虽然可能多写几行代码,但熟悉之后,也就无所谓了,不就是几个ctrl+C和ctrl+V嘛。写了几年java代码(也写过C#),乐在其中,没有作者所说的痛苦的要离开的感觉。
    设计语言时,要清楚语言的目标和使用场景,根据目标来设计各种特性,没有必要面面俱到。上面说到的闭包等等,可能确是会使编码异常的灵活,但过分灵活通常会带来混乱以及可读性的降低,结果是得不偿失。
    因此,就因为这些问题和原因就抛弃java,确有哗众取宠,危言耸听的感觉。
10 楼 gakaki 2009-07-16 00:45
scala ioke 把 都是类ruby语言 后出的超不过先出的才是可耻

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • script encoder对ASP脚本源代码进行加密工具

    script encoder对ASP脚本源代码进行加密

  • Script Encoder:screnc.exe加密解密

    从Microsoft那下载到这个小工具screnc.exe,这是命令行下的 Script Encoder(脚本加密)。它可以加密asp文件、html文件、js,vbs,sct,wsh文件,非常的方便。具体使用方法在命令行下输入 screnc /?即可查看,并且它自带有帮助说明书,我就不多介绍了。 下面介绍其简单的加密以及结合前面提到的一些解密方法来进行解密(以下的文件都保存在C:\下):...

  • 加密你的ASP页面——Script Encoder

    一、概述    一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不被客户端轻易获取(当然MS的BUG不断那是另一回事了。^_^)。但是另一个普遍存在的问题是: 由于ASP页面是纯文本的形式存放,在服务器端可以轻易看到全部编程逻辑。这样给

  • Script Encoder

    Script Encoder 是一个简单的命令行工具,脚本设计者可使用此工具对他们的最终脚本进行编码,从而使 Web 主机和 Web 客户端无法查看或更改其源代码。注意,这种编码只能防止对您代码的一般性浏览,而无法防止专业黑客查看您的代码和实现方式。

  • 加密你的ASP页面——Script Encoder初探(转)

    一、概述   一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不...

  • 加密你的ASP页面—Script Encoder初探

    一、概述 一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不被客户端轻易获取(当然MS的BUG不断那是另一回事了。^_^)。但是另一个普遍存在的问题是:由于ASP页面是纯文本的形式存放,在服务器端可以轻易看到全部编程逻辑。这样给ASP

  • Microsoft Script Encoder解密代码,oask加密文件解密

    Microsoft Script Encoder解密代码,oask加密文件解密 oask中有几个文件被加了密,找了几天终于找了完整的解密程序,在这里共享给大家 可完全解密文件oask_Main.asp,oask_qfunc.asp,oask_function.asp C#版的Microsoft Script Encoder解密代码 ...

  • Asp EnCoder Ver2.0

    国人自己编写的软件,持MicroSoft Script Encoder加密解密,移位、逆位加密解密算法 窗口操作 非常傻瓜化,360可能要报毒,别的杀软没试过。

  • Expression Encoder 4专业版

    微软的Expression Encoder 4专业版,可以支持平滑流,如果需要支持264,还需要下载Encoder 4 SP1

  • 用Script Encoder加密你的ASP页面

    用Script Encoder加密你的ASP页面    一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不被客户端轻易获取。但是另一个普遍存在的问题是:由于ASP页面是纯文本的形式存放,在服务器端可以轻易看到全部编程逻辑。这样给AS...

  • 解密经过Windows Script Encoder加密的VBS代码

    1. 把加密的代码保存为a.vbe 2. 使用第三方命令工具scrdec18.exe进行解密 注意编译时的扩展名问题一定要用XX.C 在VC++下通过 DEV通过 scrdec18源代码下载: http://www.virtualconspiracy.com/download/scrdec18.c 命令:scrdec18.exe a.vbe b.txt -cp...

  • 一片全面介绍Script Encoding加密的文章,很全面可惜是E文的(那位个哥们e文好翻译一下)

    2000年08月31日 09:55:00 Script Encoding with the Microsoft Script Engine Version 5.0 Andrew Clinick Tired of exposing your Web scripting code to prying eyes? With version 5.0 of the Microsoft Script

  • 微软ASP加密软件 sce10chs

    微软ASP加密软件Script_Encoder 用法如下: SCRDECO.EXE 加密文件 输出文件 下载地址:[url]http://download.microsoft.com/download/winscript56/Install/1.0/WIN98MeXP/CN/sce10chs.exe[/url] 一、概述 一直以来,ASP技术受到了越...

  • 关于使用微软的Script Encoder 加密JavaScript代码出错的研究!

    最近一直用Script Encoder加密一段JavaScript程序,一直还不错! 突然有一天,报错了! 类似“Scripting   encoder   object   ( "Scripting.Encoder ")   failed。。。。 本来以为是JavaScript程序出错了, 反复试,还是不行!  好在G还有一个虚拟机, 打开,可以正常加密了。 后来嫌虚拟机上网麻烦, 下了一

Global site tag (gtag.js) - Google Analytics