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