.NET/Mono 或 Java 是跨平台开发的更好选择吗?[已关闭]我对其他一些评论的看法:

2022-08-31 09:40:11

Mono 的库比 Java 的库少多少?

我缺乏对这两种选择的概述,但我对下一个项目的选择几乎有很大的自由。我正在寻找以下领域的硬技术事实

  • 性能(例如,我被告知Java对线程很好,我听说运行时代码优化最近对.NET来说非常好)
  • 现实世界的便携性(它都是便携式的,每个Catch-22是什么?
  • 工具可用性(CI、构建自动化、调试、IDE)

我特别在寻找你在自己的工作中实际体验到的东西,而不是我可以谷歌的东西。我的应用程序将是一个后端服务,处理时间序列中的大量数据。

我的主要目标平台是Linux。

编辑:为了更充分地表达我的问题,我对整个软件包(第三方库等)感兴趣,而不仅仅是语言。对于库来说,这可能归结为一个问题:“Mono的库比Java的库少多少”?


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


答案 1

Mono在针对我想要支持的平台方面做得更好。除此之外,这都是主观的。

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

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

最大的问题是iOS,因为MonoTouch工作得非常好。我不知道有什么好的方法可以用Java来定位iOS。你不能用Java来定位Windows Phone 7,所以我想说Java更适合移动的日子已经过去了。

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

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

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

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

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

问题:性能。

回答:JVM 和 CLR 都比批评者所说的表现得更好。我会说JVM表现得更好。Mono通常比.NET慢(尽管并非总是如此)。

我个人认为,作为开发人员和最终用户,任何一天都会在 J2EE 上 ASP.NET MVC。对Google Native Client的支持也非常酷。另外,我知道桌面Java应用程序的GUI性能差应该是过去的事情,但我一直在寻找缓慢的。话又说回来,我可以对WPF说同样的话。GTK#的速度非常快,所以没有理由它们必须很慢。

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

答:也许是真的,但在实践中这不是问题。

实际上,由于 IKVM.NET,每个Java库(包括JDK)都可以在.NET/Mono上运行。这项技术是一个真正的奇迹。集成是惊人的;你可以使用Java库,就像它是原生的一样。不过,我只需要在一个.NET应用程序中使用Java库。.NET/Mono生态系统通常提供的功能超出了我的需求。

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

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

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

问题:跨平台兼容性。

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

首先为Mono开发,如果您愿意,可以部署到Windows上的.NET。如果你将.NET从MS比作Java,那么Java在跨平台的一致性方面具有优势。查看下一个答案...

问题:单色滞后 .NET。

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

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

Mono 附带了许多实际的 Microsoft 编写代码,包括 Dynamic Language Runtime (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滞后的误解。Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) 是在 Mono 上不起作用或受支持不力的产品示例。显而易见的解决方案是使用跨平台的替代方案,如GTK#,NHibernate和ServiceStack。

问题:微软是邪恶的。

答:是的。那又怎样。

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

1)你不应该使用Mono,因为微软的技术应该避免

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

在我看来,这些说法显然是不相容的。我拒绝第一种说法,但在这里将跳过这个论点。第二种说法适用于所有 .NET 替代项。

JVM是一个很棒的平台,JVM语言的爆炸式增长非常棒。使用让你快乐的东西。目前,对我来说通常是.NET/Mono。


答案 2

井。。。。Java实际上更具可移植性。Mono并不是到处都实现了,它远远落后于微软的实现。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拥有,现在由Microsoft拥有)是一个比以往任何时候都更成熟和完善的产品,编写在多个平台上工作的应用程序不再是.NET黑客的深度gnosis领域,而是一个相对简单的努力。当然,有些库、服务和应用程序是仅限 Windows 的,或者只能面向特定平台 - 但 Java 也是如此(广义上)。

如果我在这一点上站在OP的立场上,我想不出语言或技术堆栈本身固有的任何理由会阻止我为今后的任何应用程序选择.NET。


推荐