.NET / Mono或Java是跨平台开发的更好选择吗?

时间:2008-09-14 19:00:24

标签: java .net linux mono cross-platform

Mono的库比Java少了多少?

我缺乏两种选择的概述,但我对下一个项目有很大的选择自由。我正在寻找

领域的技术难点
  • 性能(例如,我告诉Java有利于线程化,我听说最近.NET的运行时代码优化已经变得很好)
  • 真实世界可移植性(它们都是可移植的,每个都是Catch-22?)
  • 工具可用性(CI,构建自动化,调试,IDE)

我特别关注你在自己的工作中经历的事情,而不是我可以google的事情。我的应用程序将是一个后端服务处理来自时间序列的大量数据。

我的主要目标平台是Linux。

修改 为了更充分地说出我的问题,我对整个包(第三方库等)感兴趣,而不仅仅是语言。对于图书馆来说,这可能归结为“Mono比Java少了多少库”这个问题?


仅供参考,我已经为这个项目选择了Java,因为它似乎在可移植性方面更具战斗性,并且它在旧系统上已经存在了一段时间。我有点难过,因为我对C#非常好奇,我很乐意做一些大项目,但也许下次。感谢您的所有建议。

15 个答案:

答案 0 :(得分:111)

Mono在定位我想支持的平台方面做得更好。除此之外,它都是主观的。

我在以下平台上共享C#代码: - iOS(iPhone / iPad) - Android - 网络(HTML5) - Mac(OS X) - Linux - Windows

我可以分享更多地方: - Windows Phone 7 - Wii - XBox - PS3 - 等等。

biggie是iOS,因为MonoTouch非常有效。我不知道用Java定位iOS的好方法。你不能用Java定位Windows Phone 7,所以我想说Java对于移动设备更好的日子已经过去了。

对我而言,最重要的因素是个人生产力(和幸福感)。 C#作为一种语言比Java IMHO领先多年,.NET框架使用起来非常愉快。 Java 7和Java 8中添加的大部分内容已经在C#中使用了多年。像Scala和Clojure这样的JVM语言(都可以在CLR上使用)非常好。

我认为Mono是一个独立的平台(一个伟大的平台),并将.NET视为Windows上Mono的Microsoft实现。这意味着我首先在Mono上开发和测试。这很有效。

如果Java和.NET(Mono let's say)都是开源项目而没有任何企业支持,我会每次都选择Mono而不是Java。我相信这只是一个更好的平台。

.NET / Mono和JVM都是很好的选择,尽管我个人会在JVM上使用除Java以外的其他语言。

我对其他一些评论的看法:

问题:效果。

**答案:JVM和CLR的表现都比批评者说的好。我会说JVM表现更好。 Mono通常比.NET慢(但并不总是如此)。

作为开发人员和最终用户,我个人每天都会将ASP.NET MVC作为J2EE。对Google Native Client的支持也非常酷。此外,我知道桌面Java应用程序的GUI性能不佳应该是过去的事情,但我一直在寻找缓慢的。再说一遍,我可以对WPF说同样的话。 GTK#速度很快,所以他们没有理由放慢速度。

问题:Java拥有更大的库生态系统。

答:可能是真的,但实际上这不是问题。

由于IKVM.NET,实际上每个Java库(包括JDK)都在.NET / Mono上运行。这项技术是一个真正的奇迹。整合是惊人的;您可以像使用原生Java一样使用Java库。我只需要在一个.NET应用程序中使用Java库。 .NET / Mono生态系统通常提供的不仅仅是我需要的。

问题:Java有更好(更广泛)的工具支持

答:不在Windows上。否则我同意。 MonoDevelop很不错。

我想对MonoDevelop大声疾呼;它是一颗宝石。 MonoDevelop集成了我想要使用的大多数工具,包括代码完成(intellisense),Git / Subversion集成,对单元测试的支持,SQL集成,调试,轻松重构以及使用动态反编译的程序集浏览。从服务器端Web到移动应用程序,使用相同的环境非常棒。

问题:跨平台的兼容性。

答:Mono是所有平台(包括Windows)的单一代码库。

首先开发Mono,然后根据需要在Windows上部署到.NET。如果将.NET从MS与Java进行比较,那么Java在跨平台的一致性方面具有优势。见下一个答案......

问题:Mono滞后于.NET。

答案:不,不。恕我直言,这是一个经常陈述但不正确的陈述。

Xamarin的Mono发行版附带了C#,VB.NET,F#,IronPython,IronRuby,我认为Boo可能是开箱即用的。 Mono C#编译器与MS完全一致。 Mono VB.NET编译器确实落后于MS版本。其他编译器在两个平台上都是相同的(与Nemerle,Boo和Phalanger(PHP)等其他.NET语言一样)。

Mono附带了许多实际的Microsoft编写代码,包括动态语言运行时(DLR),托管扩展性框架(MEF),F#和ASP.NET MVC。因为Razor不是开源的,所以Mono目前附带MVC2,但MVC3在Mono上工作就好了。

核心Mono平台与.NET保持同步或多年,兼容性令人印象深刻。您现在可以使用完整的C#4.0语言甚至一些C#5.0功能。实际上,Mono经常以多种方式领导.NET。

Mono实现了微软不支持的CLR规范的部分内容(如64位数组)。 .NET世界中最激动人心的新技术之一是Rosylyn。 Mono多年来一直将C#编译器作为服务提供。 Rosylyn提供的一些内容也可通过NRefractory获得。 Mono仍然领先的一个例子是加速游戏性能的SIMD指令。

微软确实提供了许多基于.NET的产品,这些产品在Mono中是不可用的,这是对Mono lagging的误解。 Windows Presentation Foundation(WPF),实体框架(EF),WCF(Windows Communication Foundation)是Mono上不起作用或支持不足的产品示例。显而易见的解决方案是使用跨平台的替代方案,如GTK#,NHibernate和ServiceStack。

问题:微软是邪恶的。

答:是的。那是什么。

许多人提供以下理由避免使用Mono:

1)您不应该使用Mono,因为应该避免使用Microsoft技术

2)Mono很糟糕,因为它不允许你使用微软提供的所有技术

对我而言,很明显这些陈述是不相容的。我拒绝第一个声明,但会在这里跳过这个论点。第二种说法适用于所有.NET替代方案。

JVM是一个很棒的平台,JVM语言的爆炸式增长非常棒。用什么让你开心。现在,对我来说,这通常是.NET / Mono。

答案 1 :(得分:96)

嗯...... Java实际上更便携。 Mono并未在任何地方实施,并且显着落后于Microsoft实施。 Java SDK似乎可以跨平台保持更好的同步(并且它可以在更多平台上运行)。

我还说Java在所有这些平台上都有更多的工具可用性,尽管在Windows平台上有很多可用于.NET的工具。

2014年更新

我仍然在2014年持有这种观点。但是,我将通过说我刚刚开始关注Mono很长一段时间没有真正关心来证明这一点,所以Mono运行时可能会有所改进(或生态系统)我还没有意识到。 AFAIK,仍然不支持WIF的WPF,WCF,WF。 Mono可以在iOS上运行,但据我所知,Java运行时仍然运行在比Mono更多的平台上。此外,Mono开始看到一些改进的工具(Xamarin),微软似乎有更多的跨平台态度和愿意与合作伙伴合作,使他们互补,而不是竞争(例如,Mono将是即将推出的OWIN / Helios ASP.NET环境中非常重要的一部分。我怀疑在未来几年中,可移植性的差异会迅速减少,特别是在.NET开源之后。

2018年更新

我对此的看法开始走向另一条道路。我认为.NET,特别是.NET Core,已经开始实现与Java的“可移植性平等”。正在努力为某些平台将WPF引入.NET Core,而.NET Core本身现在可以在很多平台上运行。 Mono(由Xamarin拥有,现在由微软拥有)是一个比以往更加成熟和优雅的产品,编写在多个平台上工作的应用程序不再是.NET hackery的深层领域,而是一个相对简单的努力。当然,存在仅限Windows或仅能够针对特定平台的库和服务以及应用程序 - 但Java(广义地说)也是如此。

如果我现在处于OP的位置,我可以认为语言或技术堆栈中没有任何固有的原因会妨碍我从这一点开始为任何应用程序选择.NET。

答案 2 :(得分:54)

我实际上是在.NET中开发的,首先在Mono上运行我的所有测试,然后在Windows上运行。这样我知道我的应用程序是跨平台的。我在ASP.NET和Winforms应用程序上都做得非常成功。

我不确定某些人会在哪里得到Mono如此可怕的印象,但它确实在我的案例和意见中完成了它的工作。对于最新和最伟大的发明,你会有一点滞后。 .NET世界,但到目前为止,Windows和Linux上的.NET 2.0对我来说非常可靠。

请记住,显然有许多怪癖,但大多数都来自确保您正在编写可移植代码。虽然框架很好地抽象出你正在运行的操作系统,但是像路径和文件名中的Linux区分大小写这样的东西需要一些时间来习惯,就像权限这样。

根据我迄今为止的经验,

.NET绝对是非常跨平台的。

答案 3 :(得分:26)

Java实际上就像每个人都说的那样跨平台。几乎所有的主流操作系统都有JVM实现(最后甚至是Mac OS X),它们都能很好地工作。还有大量的开源工具,就像跨平台一样。

唯一的问题是,如果没有编写一些DLL或SO,就不能用Java做某些本机操作。在实践中出现这些非常罕见。但是,在所有这些情况下,我已经能够通过生成本机进程和屏幕抓取结果来绕过它。

答案 4 :(得分:18)

我认为问题的措辞不正确。对于跨平台使用而言,C#与Java的关注性要小于(a)您需要支持的平台,以及(b)考虑核心库和可用的第三方库。这种语言几乎是决策过程中最不重要的部分。

答案 5 :(得分:15)

Java是跨平台开发的更好选择。

  • 性能。由于虚拟机,Java和.Net具有相似的性能水平,但由于多年和年的优化,JVM通常具有更好的性能。

  • 库。虽然这取决于您的任务,但Java有更多的开源或第三方库可用。对于服务器App,J2EE,Spring,Struts等。对于GUI,尽管.Net提供了Win32层API,但这会导致兼容性问题。 Java有Swing,SWT,AWT等。它适用于大多数情况。

  • 兼容性。这是开发跨平台计划时需要考虑的关键问题。两个问题:第一,平台兼容性。自从JDK由单一和原始公司Sun维护良好以来,Java仍然获胜。 Mono不由MS维护,因此您无法保证更新兼容性。 2.向后兼容性。 Sun在向后兼容方面保持着良好的声誉,尽管有时这似乎过于僵化并且放慢了速度。

  • 工具。 Java具有良好的跨平台IDE。 Netbeans,Eclipse等大多数都是免费的。 VS Studio虽然很好,但仅适用于Windows,而且价格不贵。它们都提供了良好的单元测试,调试,配置文件等。

因此我建议Java是更好的选择。作为展示案例,Java开发了一些着名的桌面跨平台应用程序:Vuze,Limewire,BlogBridge,CrossFTP,更不用说那些IDE。至于.Net,我对这些成功应用的了解有限。

答案 6 :(得分:9)

我一直在问同样的问题,恕我直言,.NET / Mono似乎是一个更好的选择,因为Mono has a great track record for cross-platform desktop applications(而不是Java),当然,Mono is improving by leaps and bounds这些天。

答案 7 :(得分:8)

我也会说Java。如果从成熟度的角度来看,Sun(和其他人)花费了大量的时间和精力来使JVM在非Windows平台上运行。

相比之下,Mono绝对是.NET生态系统中的二等公民。

根据您的目标客户是谁,您可能还会发现使用Mono有真正的阻力 - Novell是否为您在Windows上为Java或.NET提供的Mono提供相同类型的供应商支持?

如果您的主要目标是在Windows上托管您的服务,那么考虑这个选择是有意义的,但是因为您主要针对Linux,所以对我来说这似乎是不费吹灰之力。

答案 8 :(得分:7)

Java被设计为跨平台; C#/ .Net不是。如有疑问,请使用专为您的目的而设计的工具。

编辑:公平地说,.NET被设计用于嵌入式/ PC /服务器环境,因此是跨平台的SORT。但它不是为Linux设计的。

答案 9 :(得分:7)

我认为答案是“这取决于”。 Java几乎可以运行,但.NET / Mono(恕我直言)是一个更好的桌面框架。所以我想答案实际上取决于您计划定位的平台。

答案 10 :(得分:6)

为了给对话添加更多内容,如果你只保留一个版本,那么Java更具可移植性 - Java 5仍然具有许多出色的功能,因此你可以等待Java 6并且在语言和语言方面仍有很多范围图书馆与...发展。 Mac是主要平台,可能需要一些时间才能赶上最新的Java版本。

Java还有一个优秀的standards body,可以根据许多不同公司的输入智能地发展平台。这是一个经常被忽视的功能,但它甚至可以保持新功能在多个平台上运行良好,并为一些深奥的东西(作为可选扩展)提供了大量的库支持范围。

答案 11 :(得分:5)

我会投票支持Java比C#更便携。 Java肯定也有一套非常丰富的标准库。还有一套广泛的开源第三方库,例如雅加达项目提供的那些(http://jakarta.apache.org/)。

所有常见的嫌疑人也存在CI,单元测试等。对于Eclipse,Netbeans,IntelliJ IDEA等,跨平台IDE支持也非常好。

答案 12 :(得分:4)

还有其他语言选择。我非常喜欢Python,它在Windows,Linux和Mac上运行良好,并且拥有丰富的库。

答案 13 :(得分:3)

虽然Mono有share of problems,但我认为它有更好的跨平台兼容性故事,特别是如果您依赖本机平台调用。

Stack Overflow上没有足够的词语来强调在.NET / Mono中获取本地调用和执行的东西(至少在我的经验3 ...中)多个平台与等效的Java工作量相比更加平滑

答案 14 :(得分:2)

Gatorhall 你有一些数据支持吗?

  

性能。由于虚拟机,Java和.Net具有相似的性能水平,但由于多年和多年的优化,JVM通常具有更好的性能。

背景:自从Windows 3.1以来,我就是Windows用户,目前是Linux用户(仍然运行Windows 7,操作系统很棒,适用于Visual Studio 2010和其他工具的VM)。

关键点:我和很多用户(windows,linux等)我知道,可能不同意你的看法。即使在Linux桌面应用程序上,Java往往执行速度较慢,但​​ASP.NET执行的速度比java服务器很多时候要快。有些人可能会同意,即使是非编译的PHP在几种情况下也能表现得更好。

Java更跨平台?我对此毫无疑问(历史背后的这个),但更快(不是说.NET)不太确定,我希望看到一些真正的基准。