为什么有那么多新编程语言是为Java虚拟机而写的?

34

现在有越来越多的编程语言(如Scala、Clojure等)是基于Java虚拟机(Java VM)开发的,并且可以与Java字节码兼容。

我开始思考:为什么要选择Java虚拟机呢?

  • Java虚拟机有何特别之处或者优势,以至于会有新的编程语言针对它进行开发并逐渐受到欢迎?

  • 为什么不为一种新语言编写一个新的虚拟机呢?


2
最后一个问题中的“they”是指谁? - matt b
8
因为这是一个主观性问题,所以我认为这应该是一个社区维基页面。 - Tarka
3
Slokun,我不同意这是一个主观问题:“流行度”在这个上下文中是技术和其他属性的广泛功能:将它们明确化(问题的重点)可以让人们更好地做出与软件开发相关的决策。 - Tomislav Nakic-Alfirevic
2
@fuzzy lollipop:因为IBM在过去做了一个非常糟糕的交易?而且自那时起,微软已被正式认定为滥用垄断地位来保持并试图扩大垄断地位的垄断企业?Java和JVM凭借技术优势从无到有赢得了极其庞大的用户群和大公司的青睐(谷歌、联邦快递、沃尔玛、全球每一家银行等)?换句话说,正是因为相反的原因... - SyntaxT3rr0r
3
为什么沙滩车爱好者不为每种新型沙滩车设计和建造一个新的发动机? - dmckee --- ex-moderator kitten
显示剩余6条评论
10个回答

54
为什么不为新语言编写一款新的虚拟机?
很简单:
- 编写一个好的虚拟机很难。 - 编写一个快速的虚拟机也很难。 - 让一个虚拟机在多个架构上运行也很难。 - 现有的库适用于现有的虚拟机。 - 现有的工具(调试器、分析器、编译器等)适用于现有的虚拟机。 - 让人们安装新的虚拟机很难。 - 可以与针对相同虚拟机的其他语言进行即时互操作。 - 现有的虚拟机已经在生产环境中经过了充分的测试。

19
此外,让人们安装虚拟机很困难。大多数人已经安装了Java虚拟机。 - David Thornley
6
你可以立即与针对同一虚拟机的其他语言实现互操作性。 - Daniel Earwicker
请随意添加任何内容,因为这是社区维基的原因;-)我尝试使其与虚拟机无关,因为大多数原因适用于使用任何大型现有VM,而不仅仅是Java VM。 - Joachim Sauer

26

性能和库

  • JVM是世界上最为优化的软件之一。
  • 利用Java类库的广泛阵列可以获得更多优势。
  • Java与JVM内的非Java语言之间的交互可以正常工作。

3
“JVM是世界上经过最精密优化的软件之一。” <-- 除了启动时间:P - Billy ONeal
4
@Bruno Rothgiesser: +1... 在一些基准测试中,由于JIT“编译器”的帮助,算法能够击败C语言,这表明JVM已经非常优秀和成熟。参见我的答案,还有另一个原因:JVM也非常安全(不会出现缓冲区溢出)。 - SyntaxT3rr0r
2
@BillyONeal:是的,但是a)这个问题正在不断得到解决(如果已经有JVM在运行,您可以设置类共享.jsa类型存档以加快启动时间),并且随着每个版本的发布变得越来越好(就像现在Java在某些基准测试中可以击败C语言),b)这只是一个问题,如果您正在编写像“grep”或“wc”这样的命令行工具,您想要链接。在服务器端,这一点无关紧要,而且老实说,在桌面端也是如此(我们正在销售用Java编写的商业软件)。但是,同意,当我需要快速的命令行工具时,我会用Bash编写它。 - SyntaxT3rr0r
(就像现在Java在某些基准测试中能够打败C语言一样)这通常是因为Java的字符串实现比C语言更好。然而,作为用户可能会感到恼火,需要等待JVM自己加载——这与特定程序发生的事情无关,而是要加载来自磁盘的JVM本身。对于服务器端来说并不重要,我同意这一点——但出于这个原因,我以前曾经对一些Java应用感到沮丧。 - Billy ONeal
1
如果有足够强烈的需求,就会有人编写基于Java的Shell,该Shell在其自己的类加载器下加载程序。也就是说,该Shell具有其类加载器,并创建一个子类加载器用于加载应用程序本身。您仍然需要一些启动时间,但不必每次启动新的JVM。非Java应用程序只需在System.exec()下运行。我认为有人曾经尝试过这个 - 也许是jsh(用于Java Shell)?提示:如果有人受到启发,请支持Groovy作为您的脚本语言! - bgiles

19

JVM 非常稳定,从最小的Java智能卡(好吧,是一个微型虚拟机 ;))到你能想象到的最大集群超级计算机都可以使用。

由于其稳定性,在一些国家中:

  • 人们用Java智能卡作为他们的国民身份证或医疗保健系统卡(或两者兼备)放在钱包里
  • 手机上有JVM(或Dalvik VM,基本上是谷歌重新命名的Java VM)。 嘿,iPhone 拥有 ARM CPU,经过优化以运行Java字节码(但出于商业原因,苹果决定不在 iPhone/iPad 上提供Java)。
  • 蓝光播放器当然带有Java(因为它是蓝光规范的一部分)。

我正在开发商业软件,我们在 Windows 和 OS X 上销售,但我们都在 Linux 上进行开发。 它只需要工作,而且它也适用于 Solaris 等等。 这是因为我们的目标是 JVM:再见可移植性问题。 只要平台有 VM,软件就应该能够工作。

然后,我无法相信还没有人提到它:从安全角度来看,这是一个非常好的开始。

Java VM 是通过设计免疫缓冲区溢出的。 这是巨大的。 事实上,这比大多数人意识到的要更重要

我在 Linux 上唯一记得的“Java”缓冲区溢出(促使我升级以解决安全问题)实际上是在一个 C 写的库中(如果我没记错的话,那时候 Linux 上的 Java 仍然默认使用该库)导致任意代码执行的缓冲区溢出。

当然,对于 Web 应用程序,导致任意代码执行的缓冲区溢出已经不再是最重要的攻击向量(现在 XSS 和 SQL 注入偷走了风头)。 但在所有其他情况下,缓冲区溢出/溢出是最常见的安全问题源头

JVM 对此是免疫的。

除此之外,由于其设计,它很容易在其上插入各种工具,例如探查器和调试器。

这是一种非常稳定和安全(正确使用时)的技术。这就是为什么它被技术精英和不那么懂技术的公司广泛使用,例如谷歌,从GMail到他们的Android和GWT等,Java在谷歌非常流行。

事实上,可以争论Java的成功来自JVM,“Java虚拟机”比“Java语言”更重要。

JVM是过去20年中最大的“语言”成功故事。这是应得的,并且它会一直存在 :)


Java虚拟机在设计上可以免疫缓冲区溢出。这是非常重要的,也比大多数人意识到的更为重要。一个充满缓冲区溢出漏洞的操作系统永远不会安全。实际上,在JRE实现中有相当多的漏洞(http://osvdb.org/search?search[vuln_title]=jre&search[text_type]=titles),但如果有人制作纯硬件JVM并像英特尔那样进行严格测试,那么就应该是没问题的。无论如何,用Java编写东西比用C语言更加安全了一个数量级 :)。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@Longpoke:这正是我写的...看看这些漏洞:GIF和PNG C语言库缓冲区溢出等,就像我记得唯一影响我的那个zlib(我在+11票的回答中提到过)一样。事实是:你没写过会触发缓冲区溢出的Java代码,因此攻击者很难攻击你的代码,因为他无法通过构造输入来攻击你的代码,他必须找到一种方法,在Java程序中攻击JVM的某个C编写部分。祝你好运,因为这很实际;) - SyntaxT3rr0r

15
  • 经过15年的改进、性能提升等不断完善
  • 免费且开源
  • 可在多种平台上运行
  • 支持在单个虚拟机上使用多种语言
  • 主要语言Java是最广泛使用的语言之一,因此Java + JVM是相对安全的入门点
  • 相对安全可靠

5

因为其他人已经确保它可以在所有主要平台上运行良好。

如果您编写自己的虚拟机,您需要为Linux/Unix/BSD编写一个,为Mac编写一个,为Windows编写一个,并且您还需要支持所有这些平台上的虚拟机以及支持您的语言编译器和运行时库。 如果您使用Java虚拟机,则Oracle、IBM和Apple已经为您处理了第一部分。


5
什么让它如此强大或受欢迎,以至于为其创建了新的编程语言,这些语言似乎也越来越受欢迎?
它是免费和开放的,成熟(稳定,完整),周围的生态系统非常庞大。
为什么他们不为新语言编写一个新的虚拟机?
编写像JVM一样好的虚拟机很难。 JVM的规范及其实现已经由业界最优秀的人才改进了十多年。

行业中最优秀的头脑? :-) - Ken
嗯,话说得有点奇怪 :-) 有几个JVM实现,但例如Sun的HotSpot是Cliff Click等人的杰作。当然,JVM规范非常重要;它是Java社区流程的结果,由大量专家参与。尽管是由委员会设计的,但它确实起作用 :-) - Joonas Pulakka

5

因为经过将近20年的努力,Java虚拟机具有以下特点:

  • 可移植性
  • 效率足够高,虽然不及C或C++,但在VM方面表现良好
  • 易于集成
  • 有广泛的API或库支持

我的意思是,如果我计划发布一种新语言,为什么不使用JVM呢?好吧,还有其他虚拟机(如llvm、parrot),但JVM受到广泛支持、知名度和经过测试。

而且它也运作得相当好!缺少invokeDynamic问题将在Java7发布时得到解决,所以更好的选择。


4
首先回答第二个问题:为什么要重新发明轮子?Java虚拟机已经有多个实现,包括高度优化的实现,几乎在任何平台上都可以找到至少一个可用的实现。
其次回答第一个问题:对于编译为Java字节码并在虚拟机上运行的代码,存在大量的第三方库和工具支持。当你创建一种新语言时,一个重要的问题是你必须创建所有人都可以使用的东西,或者使它兼容某些其他东西(例如与现有的静态C库、.Net、COM或Java虚拟机链接)。Java虚拟机的开放规范(目前还是这样),深厚的历史和广泛的适用性使它成为新语言的一个不错的目标。

4

因为它不是微软技术。正如其他人所提到的,使用JVM有许多很好的理由,但我认为如果微软的CLR像JVM一样自由、可移植和开放,它可能会稍微不那么受欢迎。


6
当然,你所写的有矛盾之处:微软一直以来都在提供“制造厂商锁定”的服务,因此他们不会制作出“没有条款限制的免费、可移植和开放”的产品。此外,还有性能和安全问题:JVM具有出色的安全记录(请参考我的答案),而微软技术却很难达到这一点。此外,“大佬们”(手机行业、电视/媒体)不希望他们的行业出现与个人电脑行业类似的情况,这就是为什么蓝光播放器规格要求使用Java而不是CLR的原因。 - SyntaxT3rr0r
2
这引出了一个问题,既然CLR在精神上与JVM相似,人们可以简单地问一下,“好的,为什么人们(Iron(Python | Ruby)/ Boo /(Unity | Linden)Script)要为CLR编写新语言而不是实现自己的VM”同样的现象发生了。 - Jimmy
1
@WizardOf Odds,没有矛盾,如果你认为开放性和平台支持不是采用JAVA而不是.NET的决策因素,那么你就太天真了。我不明白为什么我会被踩。@Jimmy,人们之所以选择CLR,很多原因与选择JVM相同。 - mikerobi

3

明显的原因:

  1. 有大量现有的类库。
  2. 有多个虚拟机实现,被广泛部署。
  3. 这些语言在语义上与Java更相似,比你想象的要更接近。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接