是否有人在尝试为JVM实现C#?作为Java开发人员,我一直羡慕C#,但不愿放弃JVM的可移植性和成熟度,更不用说针对它的各种工具了。
我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最流行的?
是否有人在尝试为JVM实现C#?作为Java开发人员,我一直羡慕C#,但不愿放弃JVM的可移植性和成熟度,更不用说针对它的各种工具了。
我知道JVM和CLR之间有一些重要的区别,但是有没有什么是最流行的?
Answers:
CLR和JVM之间有很大的不同。
一些例子:
您可能会移植很多 C#,但是IMO会让您感到非常不满意。
访问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窗体类的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提及
为什么不让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日 -星期三,微软公司(Microsoft Corp.)通过开放源代码完整的服务器端.NET堆栈并扩展.NET以在Linux和Mac OS平台上运行来增强其对跨平台开发人员体验的承诺。
根据引用此新闻稿的新闻稿,Visual Studio 2015将添加Linux / Mono作为受支持的平台。
这是一个由Mono项目人员撰写的博客,来自另一个方面:.NET源代码集成(2014年11月)。
.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
从IL到字节码编写一个转换器可能更简单。这样,您将自动在JVM上获得对任何.NET语言的支持。
但是,这是一个显而易见的想法,如果尚未完成,可能会非常困难,或者很难做好/有用。
看蚱Grass。它是基于Visual Studio的SDK和获得专利的.NET至Java转换器,使您能够在Linux®和其他支持Java的平台上运行.NET Web和服务器应用程序。
C#中跨平台开发的选项可以是mono:http : //www.mono-project.com/
您可以使用源到源编译器将C#转换为比在JVM上运行的语言。例如,有几种C#到Java的转换器,它们允许C#应用程序在转换为Java后在JVM上运行。
我可以看到两个原因为什么热情不高。
首先要意识到的是,就该语言的实际功能而言,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上运行。它本质上是它自己的事情。微软表示,他们将继续合作,现在我们将看到发生了什么。