为什么Sun不用C#来编写Java字节码编译器?

Joe*_*son 46 .net c# java compiler-construction jvm

我们想在JVM上运行我们的C#代码

我的公司有一个庞大的C#代码库.超过一半的代码是我们创建,阅读,修改,计算和编写Excel工作簿的核心引擎.我们经常从客户和潜在客户那里得到问题,询问我们是否要构建我们引擎的Java版本 - 其中许多人对用户界面并不感兴趣.我们甚至有一些客户在他们的Java应用程序中使用我们的.NET库时遇到了麻烦.

因此,我们希望构建一个Java版本的核心引擎,理想情况下不需要维护单独的Java源代码库.

Eric Sink 非常好地描述了这个问题.除了我们的软件许可证包含免版税部署这一事实之外,我处于类似的位置,这使得Eric选择Mainsoft对我们来说是不可能的.

我几年每隔几个月一直在谷歌上搜索"c#to jvm"这样的喜欢,但没有任何乐趣.花了大约7年时间开发类似的Java软件,我相信我们在核心引擎中使用的.NET API可以很容易地被封装,我们可以使用Java库完成我们所需的一切.因此,如果我们只有一个C# - > JVM编译器,我们可以构建我们的Java核心引擎,我们就不再需要拒绝那些想要使用它的Java开发人员.

我不是要求Sun为什么不做C#编译器的技术原因.我认识到Java没有属性或无符号64位长等等......为了论证,假设所有这些技术问题都可以通过扩展JVM和/或其他方法来处理.

而且我并没有要求再讨论为​​什么一种语言/堆栈可能比另一种语言/堆栈更好.我们业务的现实是有很多潜在客户使用每个.

Sun为什么要编写C#编译器?(IMO当然)

在Java平台上运行C#代码更容易,这意味着更多的开发人员和更多的平台软件.对平台的成功有什么更重要的吗?乔纳森施瓦茨是一个软件家伙.我会把它留给比我更聪明的人来决定他是否担任Sun的总裁兼首席执行官,但是在他加入Sun之后不久就遇到了Jonathan,我的印象是他了解软件以及对大型软件的需求开发人员的基础.

那么为什么Sun不做C#编译器呢?

  1. NIH综合征?
  2. 斯科特麦克尼利的幽灵?
  3. 太多的Java开发人员不喜欢或不信任与微软有关的任何东西?
  4. 他们同意不参与花大价钱吗?
  5. ???

一定有充分的理由.我不能为我的生活弄清楚它是什么......

Tim*_*Tim 38

首先,Sun没有动力在JVM上实现C#编译器,因为它们具有非常相似的称为Java编程语言的东西.

它也不像实现编译器那么简单,因为Java标准类库与.net基类库不同.您最终必须将所有.NET API调用更改为Java API调用.

Micrsoft有一个名为J#的产品,用于Java到.NET的转换,但最终没有人使用它,因为API仅限于Java 2之前的API,因此它几乎没用.如果Sun实现了.NET BCL的部分内容,那将是相同的,因为只有它的核心部分是标准化的和免版税的.像ASP.NET和WPF,WCF等部分不是ECMA标准的一部分,所以Sun需要微软的许可才能实现这些API.

如果有足够多的客户希望java版本具有商业意义来将您的应用程序移植到java然后执行它,那么您将无法通过C#到JVM编译器从Sun获得任何帮助.

  • 等等...... C#是一种死胡同的语言?现在*那是一场骚乱! (19认同)
  • 在我的帖子中,我指出我们想要移植我们的核心引擎,我们可以轻松地封装我们使用的 .NET API,并在 Java 平台上使用 Java API。话虽如此,我们可能是例外,而 .NET 库的缺乏可能会使 C# 成为一种死胡同,就像您指出的 J# 一样。 (2认同)

Ran*_*pho 21

Joe Erickson写道:

在Java平台上运行C#代码更容易,这意味着更多的开发人员和更多的平台软件.

这是一个不真实的陈述.在JVM上运行C#代码不会创建Java程序员,它会创建可以在JVM上执行的C#程序员.它只扩展了C#的范围,假设JVM还将任何微软特定的调用(即win32)转换为平台中立的东西.因此,如果Sun将IL转换为Java字节码,那么它唯一可以帮助的是:Microsoft.而且,鉴于Sun在最初的C#-Java分裂/ Visual J ++诉讼中与微软的历史......

此外,无论您是否愿意,您都必须面对技术上的不可行性.字节码的执行方式存在根本区别,这些问题远比是否存在无符号长数据类型更重要.

如果您必须在非Microsoft平台上安装C#,请使用Mono

  • IMO Sun 不想创建 Java 程序员。他们希望开发人员为他们的平台编写软件,无论是 C、C++、Java、Ruby 还是 Python——但也许不是 C#? (2认同)
  • 你和我在技术可行性上存在分歧。Mainsoft 是一个小型 ISV,负责将 .NET 程序集转换为 Java jar 文件。如果一个小的 ISV 可以做到——没有能力改变 JVM——当然,如果他们愿意,Sun 可以做到。 (2认同)

Cha*_*ert 21

为什么Microsoft不对C#进行Java字节码编译?为什么不,你做了吗?每边都有开放的规格......

  • 现在,MICROSOFT没有动力这样做,因为他们从软件中赚钱(也相当多).硬件公司试图将软件商品化,软件公司试图将硬件商品化. (4认同)

Mat*_*hen 13

"因此,我们希望构建一个Java版本的核心引擎,理想情况下不需要维护单独的Java源代码库."

基本上,您希望编译未修改的C#代码,并使其在仅Java环境中运行.

IKVM 不是你想要的. IKVM 主要三个方面.

一个.ikvm - Java虚拟机的CLI实现(请注意,为Java类库使用Classpath(现为OpenJDK)).

湾 ikvmc - 将java字节码编译为CLI字节码.

C.ikvmstub - 生成调用CLI代码的java存根类.

请注意,所有这些工具都在运行时依赖于CLI.你想要的是与IKVM完全相反的东西,它当然是MVKI(最尊敬的Kompiler Intermediary):):

一个.mvki - CLI虚拟机的Java实现(可能会使用MonoDotGNU作为类库).

湾 mvkic - 将CLI字节码编译为Java字节码.

C.mvkistub - 生成调用Java的CLI存根类

请注意,这些都不需要在运行时现有的.NET Framework实现,因此它们应该让您的Java客户满意.

不幸的是,据我所知MVKI不存在,所以你最好做一个手动端口(这将不可避免地更干净,虽然更多的工作).

编辑:根据Mainsoft 的描述,它似乎与MVKI相似,虽然我不确定他们为类库做了什么,而且与IKVM不同,它不是FOSS.


mci*_*321 10

http://jsc.sourceforge.net/是ac #cross编译器,可以将.NET代码转换为Java(以及其他内容).


dav*_*nes 6

将您的.NET API公开为ASMX Web服务,您应该很高兴.

编辑:对于更多繁重的使用场景,值得研究Windows Communication Foundation(WCF).它具有内置的可配置支持,可用于安全性,流式传输,不同的传输方案(HTTP,TCP/IP,本地命名管道).您不仅限于SOAP消息编码,但这可能是与Java互操作的最简单方法.

我不太确定你的具体情况,但是如果你正在处理大文件并且.NET代码和Java代码都在本地运行,你可以使用.NET将文件保存到用户的硬盘驱动器然后获取它来自您的Java应用程序.