有人试图为JVM实现C#吗?作为一名Java开发人员,我一直羡慕C#,但我不愿意放弃JVM的可移植性和成熟度,更不用说为它提供各种各样的工具了。
我知道JVM和CLR之间有一些重要的区别,但是有什么东西是showstopper吗?
答案 0 :(得分:89)
CLR和JVM之间存在非常显着的差异。
一些例子:
你可能会移植一个很多的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提及
为什么不让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扩展到.NET,加强了对跨平台开发人员体验的承诺在Linux和Mac OS平台上运行。
根据引用的this press release,Visual Studio 2015将添加Linux / Mono作为支持的平台。
这是由Mono项目人员撰写的关于它的博客,来自另一方:.NET Source Code Integration(2014年11月)。
由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)
答案 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上运行。它本质上是它自己的东西。我们现在看到微软表示他们正在合作时会发生什么。