有人试图为JVM实现C#吗?作为一名Java开发人员,我一直羡慕C#,但我不愿意放弃JVM的可移植性和成熟度,更不用说为它提供各种各样的工具了.
我知道JVM和CLR之间有一些重要的区别,但是有什么东西是showstopper吗?
CLR和JVM之间存在非常显着的差异.
几个例子:
Java没有用户定义的值类型
Java泛型与.NET泛型完全不同
C#的许多方面都依赖于框架的元素 - 委托等.您也需要移植库,即使是语言方面也是如此.
Java不支持JVM级别的属性和事件.你可以假装一些,但它不会是一样的.
即使在JVM级别,我也不相信Java有任何等价于传递引用的参数
虽然我不确定C#规范中有多少,但是与不同内存模型相关的细微差别很可能会受到影响.
一般来说,不安全的代码在Java中是不可能的
JNI和P/Invoke之间的本机代码互操作性非常不同.这对你来说可能不是什么大问题.
您必须伪造运算符重载和用户定义的转换
你可以移植很多 C# - 但你会留下一个非常令人不满意的经历,IMO.
走另一条路,你知道IKVM吗?它允许您在.NET中运行Java代码.
访问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); } } }
Grasshopper可以获取CLR字节码并将其转换为JVM.主要用于Web应用程序,它不提供例如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平台的新鲜空气;)
Scala,Kotlin,其他人,是在JVM之上运行的相当不错的语言,它带来了C#程序员可能在Java中遗漏的功能.特别是Kotlin在JVM世界中感觉像是C#的合理替代品.Scala可能是一个太大的语言,程序员可以在短时间内适应.
单这当然也是一种选择.如果Mono可以按原样运行它,为什么要转换到JVM.首先由@ferhrosa提及
纽约 - 2014年11月12日 - 周三,微软公司通过开放整个服务器端.NET堆栈并扩展.NET以在Linux和Mac OS平台上运行,加强了对跨平台开发人员体验的承诺.
根据这篇引用的新闻稿,Visual Studio 2015将添加Linux/Mono作为支持平台.
这是由Mono项目人员撰写的关于它的博客,另一方面:.NET源代码集成(2014年11月).
.NET核心由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
将转换器从IL写入字节码可能更简单.这样,您就可以自动获得对JVM上任何.NET语言的支持.
然而,这是一个显而易见的想法,如果还没有这样做,那可能非常困难,或者很难做得很好/有用.
看看蚱蜢.它是基于Visual Studio的SDK和获得专利的.NET到Java转换器,使您能够在Linux®和其他支持Java的平台上运行.NET Web和服务器应用程序.