为什么公共语言运行时不能支持Java

时间:2011-12-16 06:16:06

标签: c# java .net ironpython

今天,公共语言运行时支持多种语言,包括Iron Python和Iron Ruby。我们同样可以在Java Run Time环境中使用J Ruby和J Python。如果是这样,为什么.net框架工作的公共语言运行时间不能支持Java?你只是好奇地知道,虽然你可能会认为这是一个愚蠢的问题。

5 个答案:

答案 0 :(得分:19)

CLR实际上是为可以执行运行Java所需的一切而设计的。 (实际上,定义IL的方式有一些瑕疵,特别是与Java的兼容性。)您只需要一种将字节码转换为IL,或者从Java源代码编译为IL的方法。 J#是这样做的一种方式,但使用Java 1.1.4的限制非常大。

我怀疑不进一步的原因不是将Java作为语言运行的问题,而是系统库需要移植的事实。如果您愿意编写类似Java的源代码但是目标是.NET框架库(以及 .NET框架库),那么JLS版本将java.lang.String切换为{{1等等,这是可行的。我不认为当C#在几乎所有方面都是一种更好的语言时会有很多好处。

您可能有兴趣查看IKVM.NET - 在CLI上运行的Java实现。

答案 1 :(得分:5)

首先,如果Java编译为JVM字节码并在经过认证的JVM(iirc)上运行,那么Java可能只被称为Java,这就是微软努力被命名为J ++和J#的原因。

然后仍有J#,它在Java上运行,在CLR上运行。

然后有IKVM,它是JVM的实现和CLR之上的类库。

实际上,在这种情况下,类库可能是最烦人的事情。 J#带有一个自己的库,其中包含Java核心类,仅用于此目的,并且该语言与该类库紧密相关(就像在.NET中一样)。

最后的事情可能是:为什么要打扰? Java本身将成为CLR的一种低级语言,需要仔细努力来重新创建非实际泛型等内容。由于这种与其他CLR语言的互操作性也可能受到限制。如果你有一个庞大的Java代码库并且想要使用.NET,那么有强大的从Java到C#的翻译器,但是与 Su Oracle兼容的CLR本机Java将会为你做出很多努力只是为了兼容性而且只是与CLR或其他.NET语言接口不良而需要触摸。

答案 2 :(得分:2)

CLR确实支持J#。在乌托邦世界中,CLR应该支持C#和Java,但Java是微软C#的竞争者,因此它不支持Java。

答案 3 :(得分:2)

我认为,C#是Java的超集,所以你应该在技术上能够将Java类编译为CIL。

正如其他人所指出的那样,微软无意支持他们的竞争,但是我发现有一些项目,比如Ja.NET,将Java代码编译到CLR。还有IKVM.NET,其中似乎能够将Java字节码转换为CIL,并且包括从OpenJDK编译到.NET的Java类库。

答案 4 :(得分:1)

各个虚拟机以不同的语言(CIL for .net)作用于中间代码,而.net和JVM的IL彼此不兼容。

IL和Runtime功能有时会禁用一些内容,例如C#中的Generics与.net Runtime中Generics的工作方式密切相关,而Java的实现则完全不同。

但是,技术上不应该阻止Java在.net上运行,只是还没有人做过。为了什么,这是一项巨大的努力?真的有足够的钱吗?如果有生意,有人会这样做。但是,如果您从事Java业务,那么很可能您也与其工具和环境紧密相关,例如: Eclipse和Tomcat,可能是Ant和Maven。