为JVM实现C#


91

是否有人在尝试为JVM实现C#?作为Java开发人员,我一直羡慕C#,但不愿放弃JVM的可移植性和成熟度,更不用说针对它的各种工具了。

我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最流行的?


3
我还用Java编写了许多很多完全跨平台的应用程序-这对我和我的团队来说都是日常工作。我们通常会在我们正式“合格”的每个平台上运行测试计划,但我认为将测试错误归因于平台差异已有多年了。
贾里德(Jared)2009年

1
我们的主要产品可以在Windows,OS X和Linux上不变运行。确实并不难。
托尔比约恩Ravn的安德森

1
我在Windows中使用Java,其他人则在OSX中发挥作用,CI负责Linux下的所有测试,并且我们已将该软件部署到各种Windows和Linux服务器,甚至Solaris。所以我想我可以说我已经写了一段时间真正的,完整的,多平台的Java程序。
艾斯科(Esko)2010年

1
在.NET中实现的JavaVM;.NET Java LIBS实现;两全其美的互操作性-> IKVM.NET(ikvm.net
gsscoder 2012

1
在我看来,如果您可以将.NET转换为JavaScript(例如JSIL进行此操作),则应该可以将其转换为Java ...
BrainSlugs83 2014年

Answers:


93

CLR和JVM之间有很大的不同。

一些例子:

  • Java没有用户定义的值类型
  • Java泛型与.NET泛型完全不同
  • C#的许多方面取决于框架的元素-委托等。您甚至还需要就语言方面移植库。
  • Java不支持JVM级别的属性和事件。您可以伪造其中的一些,但事实并非如此。
  • 我不相信Java即使在JVM级别也没有等效于按引用传递参数的方法
  • 尽管我不确定C#规范中包含多少内容,但是与不同的内存模型有关的微妙之处可能会咬人。
  • 通常,Java中不可能出现不安全的代码
  • JNI和P / Invoke之间与本机代码的互操作性非常不同。对您来说,这可能不是什么大问题。
  • 您必须伪造运算符重载和用户定义的转换

您可能会移植很多 C#,但是IMO会让您感到非常不满意。

换句话说,您知道IKVM吗?它允许您在.NET中运行Java代码。


7
Java具有终结器,.NET终结器也不是确定性的。两者之间可能会有细微的差别,但我想不到任何有用的东西。我怀疑Java的可及性测试比.NET还要强:没有终结,而另一个线程仍在运行实例方法
Jon Skeet 2009年

3
我认为您可以将值类型映射到引用类型。只需让每项作业做一个浅表克隆即可!
Daniel Earwicker 2009年

3
@Earwicker:...并更改数组分配,以及其他在语义上有所作为的地方?我怀疑,如果可能的话,要使其工作起来将非常困难,并且结果将不是您要使用的东西。
乔恩·斯基特

4
我认为仿制药也可以解决。您必须生成一个带有额外字段的Java类来容纳类型参数的Class对象,这样会增加一些开销,但是新的T()和typeof(T)将可用。
Daniel Earwicker 09年

30
@Jon Skeet:这让您两全其美:Java在微软专有平台上有些过时的语言。
Bart van Heukelom'7

43

访问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);
        }
    }
}

7
stab在JVM上提供了C#语言的大部分功能,但这样做的方式非常易于Java互操作。因此,它不是严格地与为.NET CLR编写的C#代码兼容的源代码,但是它确实使Java程序员能够享受与C#类似的语言,同时获得相同质量的字节代码,并且与Java库和框架具有无阻互操作性。这是在JVM上获取C#的正确方法。
RogerV

好的语言,好的平台上的语言……希望我几年前偶然发现。
杰弗里·凯夫2014年

14

字节码转译器

Grasshopper可以获取CLR字节码并将其转换为JVM。它主要用于Web应用程序,不提供Windows窗体类的JVM实现。似乎有些过时了。Web讨论了ASP.NET 2.0,Visual Studio 2008等。首先由@alex提及

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

IKVM朝OP所不希望的方向发展。它提供了在CLR上运行的JVM实现,从Java到CLR字节码的JVM的JVM和CLR库方法存根生成器(用于Java)。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日 -星期三,微软公司(Microsoft Corp.)通过开放源代码完整的服务器端.NET堆栈并扩展.NET以在Linux和Mac OS平台上运行来增强其对跨平台开发人员体验的承诺。

根据引用此新闻稿的新闻稿,Visual Studio 2015将添加Linux / Mono作为受支持的平台。

这是一个由Mono项目人员撰写的博客,来自另一个方面:.NET源代码集成(2014年11月)。

.NET核心

.NET(某些)的Windows / Linux多平台版本,由Microsoft管理。纳夫说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


好答案!作为一个C#开发人员,他对必须过渡到Java感到不满意(您怎么能没有属性?!),并且对Scala表示怀疑,所以这确实为您提供了很多选择。
Gilthans 2015年

9

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

但是,这是一个显而易见的想法,如果尚未完成,可能会非常困难,或者很难做好/有用。


6
你会遇到的大部分我所列出的问题-不同的仿制药等等
乔恩斯基特

8
这正是Grasshopper所做的事情(请参阅上面的@alex答案),确实很难做到很好(我以前在Grasshopper上工作)。
Motti 2010年

7

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


2
你有实践经验吗?另请注意,免费版本的许可证为dragonic。
托尔比约恩Ravn的安德森

13
当您说“专利”一词时,您就失去了兴趣。叹。
Stephen C

2
只是一些新闻:Grasshopper现在是免费的,没有支持和保修(就像大多数开源产品一样)。
fernacolo 2012年

1
Mainsoft似乎已经完全失效,并且Grasshopper链接不再起作用。
大卫·

1
显然,这只是一个净摆动。这两个链接现在都可以使用。不幸的是,现在我不记得自己为什么想要它了
David Given



0

这个答案可能对您来说太迟了,但这只是一个新的答案。您可能想签出Kotlin编程语言。除了任何非Java JVM语言外,它还提供C#具有的语法糖,并且它也最接近C#语法。它来自JetBrains


0

我可以看到两个原因为什么热情不高。

首先要意识到的是,就该语言的实际功能而言,C#和Java非常接近。C#和Java不仅在关闭,而且也在朝着相似的方向发展。JVM当前尚不支持某些功能,但这并不是真正的问题。您总是可以伪造所缺少的东西。我认为人们宁愿等待Java获得更多的糖,而不是从头开始创建Almost-Java。在端口准备就绪时,Java可能已经决定赶上。

其次,开发人员偏爱C#的原因不是语言本身,而是其周围的工具,他们与C#的双向关系以及Microsoft如何支持整个过程。例如,C#-XAML组合比JavaFX友好,因为C#和XAML彼此被黑了(例如C#中的部分类,XAML中的绑定等等)。在JavaFX上使用C#并没有太大改善。要在JVM上获得C#经验,还需要移植工具,这是一个更大的项目。连单声道都没有都不会打扰。

因此,对于给Java开发人员(我希望在熟悉的工具上使用更高级的语言)的建议,是检查现有的JVM语言。

Mono也可以选择,但是我一直对此持怀疑态度。即使是C#-。NET和跨平台的,使用Microsoft的工具构建的内容通常也无法在Mono上运行。它本质上是它自己的事情。微软表示,他们将继续合作,现在我们将看到发生了什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.