Chr*_*ung 29
Java是一个更加成熟的平台,有许多现有的类库可以"插入"并使用,比如Ruby或Python(甚至是Perl).因此,对于喜欢使用现有代码而不是自己编写所有内容的人来说,Java是一个巨大的胜利.
例如,最近我一直在寻找类似JAXB for Python或Ruby的东西.最后,我最终使用JRuby只是因为我没有找到任何成熟的,广泛使用的XML绑定库.
Mic*_*rdt 14
为JVM编写代码(使用任何语言)的巨大优势在于,如果有必要,通常可以很容易地利用大量成熟的Java库.
而且我不知道你在哪里得到了一个"笨重"的JVM,其资源开销很大.JIT倾向于生成非常快的代码,而核心JVM在今天的标准中是巨大的.它在运行时往往会占用大量内存,但这是因为现代机器具有大量RAM,并且当GC具有大量RAM时,GC效果最佳.如果需要,GC可以微调到地狱,然后更加保守.
正如别人所说的那样:"关于Groovy的最好的事情是,我没有要.使用Java关于Groovy的第二个最好的事情是,我可以使用Java".
似乎在问题中建立的假设是新项目是新建项目.在过去十年中,许多组织已经对Java进行了大量投资,并要求任何新项目在现有(内部)代码生态系统中工作.正如所指出的,在所有公开的Java库(无论是免费/ OSS还是商业)中都有巨大的优势,但是使用现有代码甚至作为现有系统中的组件的需求至少同样重要(如果不是更多)所以)到大型组织.
很多事情也归结为平台的成熟度和功能,也就是说JVM及其随附的所有内容(整个Java生态系统).我头顶的几个例子:
您可以将远程调试器插入到正在运行的JVM中,并获取有关正在运行的应用程序的各种信息,这些信息对于Python,Ruby等来说根本不可能.更进一步,JMX是一种编写代码的标准方法,以便对象可以是在实时应用程序中监控甚至调整.看看JConsole,看看你是否只是流口水(尽管界面很丑陋).
在这方面更进一步,还有OSGi,这是一种编写高度模块化代码的标准,可以在实时应用程序中进行部署,启动,停止甚至升级.使用OSGi,您可以将大型应用程序分解为许多较小的"捆绑包",然后可以单独维护(部署,启动/停止,升级).这对于大型应用程序或任何需要始终保持运行的应用程序来说都是非常重要的.
该平台非常好地支持异步,可靠的消息传递.您可以将JMS作为基准,并在其上构建许多优秀且功能强大的库,用于使用非常少的代码执行复杂的操作(参见Apache Camel,ServiceMix,Mule和许多其他代码).这是另一个在大型应用程序或必须在更大代码范围内运行的应用程序中极具价值的功能.
JVM具有真实(OS级)线程,而Python等.是非常在这方面(出了名左右)的限制.(话虽如此,共享状态并发 - 线程 - 是错误的方法;参见Erlang,Alice,Mozart/Oz等)
除了标准的Sun实现之外,还有许多JVM选择,如JRockit,IBM的JVM等.这是一个包含其他语言的开发领域 - Python有Jython,Iron Python,甚至PyPy和Stackless; Ruby拥有JRuby,Rubinius和其他产品 - 但是这些产品无法与各种JVM产品中的成熟度相媲美.
所有这一切,我真的不喜欢Java 语言,并尽可能地避免它.这些天,我不需要JVM的所有优秀替代语言.Groovy对其可访问性和与平台(甚至是语言)的紧密集成进行了投票,并且因为Grails,我有时将其称为"Rails for grownups".我更喜欢其他JVM语言,特别是Clojure和Scala,但普通程序员无法访问这些语言.Scala最近出现了很多,特别是由于它在Twitter上的高调使用,因此希望有更有趣和真正优秀的语言在更大的环境中使用.但这是另一个话题.
为什么要把笨重的JVM和你一起带来?
JVM并不臃肿,也不慢.相反,它是一个精简,快速,深度优化的虚拟机.不幸的是,它针对静态OOP语言进行了优化.
不过,针对JVM的优秀编译器确实可以创建性能良好的程序.我不知道JRuby; 但是Jython的目标是比普通的C Python更全面,并且它们越来越接近(在几个重要的用例中它已经更快).
请记住,一个好的JIT(比如JVM的JIT)可以应用静态C编译器上不可用的一些优化,从它们获得更快的代码并不是一个白日梦.当然,针对您的语言优化的VM 应该比像JVM这样的"非真正通用"VM更快; 但是存在成熟问题:JVM 在那里完成了大量的工作,而Ruby和Python的JIT并没有接近.
不幸的是,似乎没有更好的通用字节码VM.微软的CLI受到与JVM类似的限制(ironPython比JPython慢得多,重得多).最好的候选人似乎是LLVM.有人知道为什么没有比LLVM更多的动态语言?我见过几个Scheme编译器,但似乎有几个问题.