为JVM实现C#

时间:2009-03-25 17:25:05

标签: c# java clr jvm

有人试图为JVM实现C#吗?作为一名Java开发人员,我一直羡慕C#,但我不愿意放弃JVM的可移植性和成熟度,更不用说为它提供各种各样的工具了。

我知道JVM和CLR之间有一些重要的区别,但是有什么东西是showstopper吗?

9 个答案:

答案 0 :(得分:89)

CLR和JVM之间存在非常显着的差异。

一些例子:

  • Java没有用户定义的值类型
  • Java泛型完全与.NET泛型不同
  • C#的许多方面都依赖于框架的元素 - 委托等。您也需要移植库,即使对于语言方面也是如此。
  • Java不支持JVM级别的属性和事件。你可以假装一些,但它不会是一样的。
  • 即使在JVM级别,我也不相信Java有任何等效的传递引用参数
  • 与不同的内存模型有关的微妙之处很可能会受到影响,尽管我不确定C#规范中有多少。
  • Java中可能无法使用不安全的代码
  • 与JNI和P / Invoke之间的本机代码的互操作性非常不同。这对你来说可能不是什么大问题。
  • 您必须伪造运营商重载和用户定义的转化

你可能会移植一个很多的C# - 但你会留下一个非常令人不满意的经历,IMO。

走另一条路,你知道IKVM吗?它允许您在.NET中运行Java代码。

答案 1 :(得分:41)

访问http://code.google.com/p/stab-language

以下代码,如果是JVM的Stab语言代码

using java.lang;
using stab.query;
public class Test {
   public static void main(String[] args) {
   // Sorts the arguments starting with "-" by length and then using the default   
        // string comparison
        var query = from s in Query.asIterable(args)
                    where s.startsWith("-")
                    orderby s.length(), s
                    select s;
        foreach (var s in query) {
            System.out.println(s);
        }
    }
}

答案 2 :(得分:11)

字节码转换器

Grasshopper可以获取CLR字节码并将其转换为JVM。主要针对网络应用,它不提供例如Windows Forms类的JVM实现。但有点过时了。该网站讨论了ASP.NET 2.0,Visual Studio 2008等。首先由@alex提及

XMLVM可以将CLR或JVM字节码作为输入,并生成输出。此外,它可以输出Javascript或Objective-C。还没有版本,只有Subversion。 "不在生产环境中使用的实验开发版本。"

IKVM走向另一个方向,而不是OP想要的。它提供了在CLR上运行的JVM实现,JVM到CLR字节码转换器以及用于Java的CLR库方法存根生成器。 http://www.ikvm.net/uses.html由@Jon Skeet提及

RPC

为什么不让CLR和JVM同时运行并使通信尽可能无摩擦?这不是OP想要的,但是其他一些答案已经以不同的方式完全脱离主题,所以让我们覆盖它。

RabbitMQ,有一个免费选项,它是用Erlang编写的RPC服务器,带有用于C#,Java等的API库。

jnBridge,对于某些潜在用户而言,许可证可能过于昂贵。

gRPC,类似的现代RPC库提供广泛的语言支持,这些语言的客户端库代码生成,数据的语言无关的有线格式,级联调用取消等高级功能。

编程语言

写一次,到处运行;)

Haxe,编译为C#/ CLR,Java / JVM,Javascript,Flash,Python,...为每种目标语言提供互操作机制。可以在某种程度上将其视为ActionScript3的后继者。看起来非常可靠,至少有一家公司实际依赖它。比Stab更值得信赖,接下来会提到。

Stab带来了一些C#功能和Java互操作性。不太有用,你得到一些C#功能,但你与之交互的是不使用它们的Java代码。 https://softwareengineering.stackexchange.com/a/132080/45826这种语言相对模糊,可能被遗弃,几乎没有希望变得更好。这是@Vns首先提到的。

JVM平台的新鲜空气;)

ScalaKotlin,其他,是在JVM之上运行的相当不错的语言,它带来了C#程序员可能在Java中遗漏的功能。特别是Kotlin在JVM世界中感觉像是C#的合理替代品。 Scala可能是一个太大的语言,让程序员在短时间内感到舒适。

这当然也是一种选择。如果Mono可以按原样运行它,为什么要转换到JVM。首先由@ferhrosa提及

  

纽约 - 2014年11月12日 - 周三,微软公司通过开放整个服务器端.NET堆栈并将.NET扩展到.NET,加强了对跨平台开发人员体验的承诺在Linux和Mac OS平台上运行。

根据引用的this press release,Visual Studio 2015将添加Linux / Mono作为支持的平台。

这是由Mono项目人员撰写的关于它的博客,来自另一方:.NET Source Code Integration(2014年11月)。

.NET Core

由Microsoft管理的(某些).Net的Windows / Linux多平台版本。 ' nuff说https://github.com/dotnet/core

结论

现在需要尝试这些工具/框架,看看有多少摩擦。 OP希望用C#编写JVM,使用Grasshopper实际上可以很好地工作。

这样做的目的是在单个代码库中混合C#和Java世界库可能效果不佳。

来源

http://blog.pluralsight.com/new-course-making-java-and-c-work-together-jvm-and-net-clr-interop

答案 3 :(得分:9)

将转换器从IL写入字节码可能更简单。这样,您就可以自动获得对JVM上任何.NET语言的支持。

然而,这是一个显而易见的想法,如果还没有这样做,那可能会非常困难,或者很难做得很好/有用。

答案 4 :(得分:7)

看看Grasshopper。它是基于Visual Studio的SDK和获得专利的.NET到Java转换器,使您能够在Linux®和其他支持Java的平台上运行.NET Web和服务器应用程序。

答案 5 :(得分:2)

C#中跨平台开发的选项可以是单声道:http://www.mono-project.com/

答案 6 :(得分:1)

您可以使用source-to-source compiler将C#转换为比在JVM上运行的语言。例如,有几个C# to Java converters允许C#应用程序在转换为Java后在JVM上运行。

答案 7 :(得分:0)

这个答案对你来说可能会迟到,但这个答案只是新的。您可能想要签出Kotlin编程语言。除了任何非Java JVM语言之外,它还提供C#所具有的语法糖以及最接近C#语法的语法糖。来自JetBrains

答案 8 :(得分:0)

我可以看到两个原因,为什么这不是很热情。

首先要意识到的是,当涉及到语言的实际特性时,C#和Java非常接近。不仅C#和Java接近,它们也在朝着类似的方向发展。 JVM目前支持的一些功能尚未开箱即用,但这不是真正的问题。你总能伪造丢失的东西。我认为人们更愿意等待Java获得更多的糖,而不是从头开始创建一个Almost-Java。当端口准备就绪时,Java可能已决定赶上。

其次,开发人员更喜欢C#的原因并不是语言本身,而是围绕它的工具,与C#的双向关系以及Microsoft如何支持整个事物。例如,C#-XAML组合比JavaFX更友好,因为C#和XAML被相互攻击(例如,C#中的部分类,XAML中的绑定等)。在JavaFX上使用C#并没有太大改进。要获得JVM上的C#体验,您还需要移植工具,这是一个更大的项目。甚至Mono都不会打扰。

因此,我向一位希望在熟悉的工具上使用更高级语言的Java开发人员的建议是查看现有的JVM languages

单声道也是一种选择,但我一直对它持怀疑态度。即使它是C# - .NET和跨平台,使用Microsoft工具构建的东西通常不会在Mono上运行。它本质上是它自己的东西。我们现在看到微软表示他们正在合作时会发生什么。