当前位置:  开发笔记 > 编程语言 > 正文

为JVM实现C#

如何解决《为JVM实现C#》经验,为你挑选了5个好方法。

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

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



1> Jon Skeet..:

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

几个例子:

Java没有用户定义的值类型

Java泛型与.NET泛型完全不同

C#的许多方面都依赖于框架的元素 - 委托等.您也需要移植库,即使是语言方面也是如此.

Java不支持JVM级别的属性和事件.你可以假装一些,但它不会是一样的.

即使在JVM级别,我也不相信Java有任何等价于传递引用的参数

虽然我不确定C#规范中有多少,但是与不同内存模型相关的细微差别很可能会受到影响.

一般来说,不安全的代码在Java中是不可能的

JNI和P/Invoke之间的本机代码互操作性非常不同.这对你来说可能不是什么大问题.

您必须伪造运算符重载和用户定义的转换

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

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


@Jon Skeet:这给你带来了两个世界中最糟糕的:Java在微软的专有平台上有点过时的语言.
Java有终结器,.NET终结也不是确定性的.两者之间可能存在一些微妙的差异,但我无法想到任何副手.我怀疑Java的可达性测试比.NET更强:没有完成,而另一个线程仍在运行实例方法
我认为泛型也是可以解决的.您必须生成一个带有额外字段的java类来保存类型参数的Class对象,因此它会增加一些开销,但是新的T()和typeof(T)将可用.
我认为你可以将值类型映射到引用类型.只需让每个作业都做一个浅薄的克隆!
@Earwicker:...并更改数组分配,以及语义有所不同的其他各种地方?我怀疑它很难让它工作,*如果*它是可能的,结果将不是你想要使用的东西.
@JaredPar:他们自Java 1.0以来一直在使用.您重写finalize()方法.
@Jon,哇.我从来没有在Java中使用本机资源做太多的事情,所以我不会感到非常惊讶,我错过了,但震惊了.每天学习新东西(希望如此)
Re:价值类型 - 我不太确定.需要映射的东西是非常有限的,事实是struct与class的性能差异通常非常小; 毫无疑问,它会伤害一些应用程序,但可能不是最多.

2> 小智..:

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


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

3> user7610..:
字节码转换器

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



4> Daniel Earwi..:

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

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


这正是Grasshopper所做的(参见上面的@ alex的回答)确实很难做好(我曾经在Grasshopper上工作).
你会遇到我列出的大多数问题 - 不同的泛型等.

5> alex..:

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


当你说"专利"这个词时,你就失去了兴趣.叹.
你有实际经验吗?另请注意,免费版本的许可证是严苛的.
只是一些消息:Grasshopper现在[免费](http://dev.mainsoft.com/Default.aspx?tabid=29#top_Licensing),没有支持和保修(像大多数开源产品一样).
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有