108

Mono 的库比 Java 少多少?

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

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

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

我的主要目标平台是 Linux。

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


仅供参考,此后我为这个项目选择了 Java,因为它在可移植性方面似乎更加经久不衰,而且它在旧系统上也已经存在了一段时间。我有点难过,因为我对 C# 很好奇,我很想在里面做一些大项目,但也许下次吧。感谢所有的建议。

4

15 回答 15

112

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

我在以下平台上共享 C# 代码: - iOS (iPhone/iPad) - Android - 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 视为 Microsoft 在 Windows 上的 Mono 实现。这意味着我首先在 Mono 上进行开发和测试。这非常有效。

如果 Java 和 .NET(比如说 Mono)都是没有任何公司支持的开源项目,那么我每次都会选择 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 库一样使用它。不过,我只需要在一个 .NET 应用程序中使用 Java 库。.NET/Mono 生态系统通常提供比我需要的更多的东西。

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

答:不在 Windows 上。否则我同意。MonoDevelop 还是不错的。

我想向MonoDevelop大喊一声;它是一颗宝石。MonoDevelop 集成了我想要使用的大多数工具,包括代码完成(智能感知)、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 版本。其他编译器在两个平台上都是相同的(其他 .NET 语言如 Nemerle、Boo 和 Phalanger (PHP) 也是如此)。

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 规范,甚至 Microsoft 也不支持(如 64 位数组)。.NET 世界中最令人兴奋的新技术之一是Rosylyn。Mono 多年来一直将 C# 编译器作为服务提供。Rosylyn 提供的一些东西也可以通过NRefractory获得。Mono 仍然领先的一个例子是用于加速游戏性能的 SIMD 指令。

Microsoft 确实提供了许多基于 .NET 的产品,这些产品在 Mono 中不可用,这是对 Mono 滞后的误解的来源。Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) 是在 Mono 上无法运行或支持不佳的产品示例。显而易见的解决方案是使用 GTK#、NHibernate 和 ServiceStack 等跨平台替代方案。

问题:微软是邪恶的。

答:没错。所以呢。

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

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

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

对我来说,很明显这些陈述是不相容的。我拒绝第一个陈述,但将在此处跳过该论点。第二个陈述适用于所有 .NET 替代方案。

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

于 2012-01-28T22:01:03.830 回答
96

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

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

2014 年更新

我在 2014 年仍然持有这种观点。但是,我会说我现在才开始关注 Mono 在很长一段时间没有真正关心之后,所以我可能会在 Mono 运行时(或生态系统)中有所改进。 ) 我没有被告知。AFAIK,仍然不支持 WIF、WCF、WF、WIF。Mono 可以在 iOS 上运行,但据我所知,Java 运行时仍然可以在比 Mono 更多的平台上运行。此外,Mono 开始看到一些改进的工具(Xamarin),微软似乎有更多跨平台的态度和愿意与合作伙伴合作,使他们成为互补,而不是竞争(例如,Mono 将即将到来的 OWIN/Helios ASP.NET 领域的一个非常重要的部分)。我怀疑在未来几年,便携性的差异会迅速缩小,

2018 年更新

我对此的看法开始转向另一种方式。我认为广泛的 .NET,尤其是 .NET Core,已经开始实现与 Java 的“可移植性平等”。正在努力将 WPF 引入某些平台的 .NET Core,而 .NET Core 本身现在可以在许多平台上运行。Mono(由 Xamarin 所有,现在归 Microsoft 所有)是比以往任何时候都更加成熟和完善的产品,编写可在多个平台上运行的应用程序不再是 .NET 黑客的深入了解领域,而是一项相对简单的工作. 当然,有一些库、服务和应用程序仅适用于 Windows 或只能针对特定平台 - 但 Java(广义上)也可以这样说。

如果此时我站在 OP 的立场上,我想不出语言或技术堆栈本身固有的任何原因会阻止我从这一点开始为任何应用程序选择 .NET。

于 2008-09-14T19:05:57.647 回答
54

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

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

请记住,这显然有很多怪癖,但其中大部分来自确保您正在编写可移植代码。虽然框架在抽象出您正在运行的操作系统方面做得很好,但像 Linux 在路径和文件名中区分大小写这样的小事情需要一些时间来适应,就像权限这样的事情。

根据我迄今为止的经验,由于 Mono,.NET 绝对是非常跨平台的。

于 2008-09-14T19:13:08.720 回答
26

Java 实际上正如大家所说的那样是跨平台的。几乎所有主流操作系统都有一个 JVM 实现(最后甚至是 Mac OS X),而且它们都运行得非常好。并且有大量的开源工具可以跨平台。

唯一的问题是,如果不编写一些 DLL 或 SO,您将无法在 Java 中执行某些本机操作。这些在实践中很少出现。不过,在所有这些情况下,我都能够通过生成本机进程和屏幕抓取结果来绕过它。

于 2008-09-14T19:10:14.907 回答
18

我认为这个问题的措辞不正确。就跨平台使用而言,C# 与 Java 相比 (a) 您需要支持哪些平台,以及 (b) 考虑核心库和可用的第三方库,它的意义要小得多。语言几乎是决策过程中最不重要的部分。

于 2008-09-14T19:02:46.530 回答
15

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

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

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

  • 兼容性。这是开发跨平台程序时需要考虑的关键问题。两个问题:第一,平台兼容性。Java 仍然获胜,因为 JDK 由单一的原始公司 Sun 很好地维护。Mono 不由 MS 维护,因此您无法保证更新兼容性。2. 向后兼容。Sun 在向后兼容性方面保持着良好的声誉,尽管有时这似乎过于死板并减慢了步伐。

  • 工具。Java 有很好的跨平台 IDE。Netbeans、Eclipse 等。其中大部分是免费的。VS Studio 很好,但只在 Windows 上,而且不贵。它们都提供了良好的单元测试、调试、配置文件等。

因此,我建议 Java 是一个更好的选择。举个例子,Java 开发的一些著名的桌面跨平台应用程序:Vuze、Limewire、BlogBridge、CrossFTP,更不用说那些 IDE。至于 .Net,我对此类成功应用的了解有限。

于 2009-01-15T22:45:25.990 回答
9

我一直在问同样的问题,恕我直言,.NET/Mono 似乎是一个更好的选择,仅仅是因为Mono 在跨平台桌面应用程序(而不是 Java)方面有着良好的记录,当然,Mono 是这些天来突飞猛进的进步。

于 2008-09-15T04:19:35.990 回答
8

我也会说Java。如果从成熟度的角度来看,Sun(和其他公司)已经花费了更多的时间和精力来让 JVM 在非 Windows 平台上工作。

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

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

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

于 2008-09-14T23:39:06.693 回答
7

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

编辑:公平地说,.NET 设计用于嵌入式/PC/服务器环境,所以这是跨平台的排序。但它不是为 Linux 设计的。

于 2008-09-14T20:16:53.857 回答
7

我认为答案是“视情况而定”。Java 几乎可以在任何东西上运行,但 .NET/Mono 是(恕我直言)更好的桌面框架。所以我想答案真的取决于你计划定位的平台。

于 2008-09-15T04:48:55.687 回答
6

再多说一点,如果你落后一个版本,Java 就更便携了——Java 5 仍然有许多优秀的特性,所以你可以等待 Java 6 并且在语言和库方面仍有很多范围要开发和。Mac 是主要平台,可能需要一些时间才能赶上最新的 Java 版本。

Java 还拥有一个优秀的标准机构,可以根据来自许多不同公司的输入智能地扩展平台。这是一个经常被忽视的特性,但它甚至使新特性在多个平台上都能很好地工作,并为一些深奥的东西(作为可选扩展)提供了广泛的库支持。

于 2008-09-15T03:41:32.727 回答
5

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

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

于 2008-09-15T03:03:34.177 回答
4

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

于 2008-09-15T02:48:54.570 回答
3

虽然 Mono 有一些问题,但我认为它具有更好的跨平台兼容性故事,尤其是如果您依赖本机平台调用。

Stack Overflow 上没有足够的文字来强调在 .NET/Mono 中(至少在我的经验 3...)多个平台上与等效的 Java 工作相比,在 .NET/Mono 中调用和执行本机程序有多顺畅。

于 2008-11-05T12:27:29.653 回答
2

Gatorhall你有数据支持吗?

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

背景:我从 Windows 3.1 开始就是一名 Windows 用户,目前是一名 Linux 用户(仍在为 Visual Studio 2010 和其他工具运行的虚拟机上运行 Windows 7、出色的操作系统)。

重点:我和我认识的很多用户(windows、linux 等)可能不同意你的看法。即使在 linux 桌面应用程序上,Java 的执行速度也往往较慢,而 ASP.NET 的执行速度通常比 Java 服务器页面要快很多。有些人可能会同意,即使是未编译的 PHP 在几种情况下也能表现得更好。

Java更跨平台?我对此毫无疑问(历史可以追溯到这一点),但更快(不是说 .NET 是)不是那么确定,我希望看到一些真正的基准。

于 2011-11-21T12:24:29.553 回答