Mono的库比Java少了多少?
我缺乏两种选择的概述,但我对下一个项目有很大的选择自由.我正在寻找有关技术领域的经验
性能(例如,我被告知Java有利于线程化,我听说运行时代码优化最近已经变得非常好用于.NET)
真实世界的可移植性(它既可以是便携式的,也可以是每个Catch-22的?)
工具可用性(CI,构建自动化,调试,IDE)
我特别关注你在自己的工作中经历的事情而不是我可以google的事情.我的应用程序将是一个后端服务处理来自时间序列的大量数据.
我的主要目标平台是Linux.
编辑: 为了更充分地说出我的问题,我对整个包(第三方库等)感兴趣,而不仅仅是语言.对于图书馆来说,这可能归结为"Mono比Java更少的库"这个问题?
仅供参考,我已经为这个项目选择了Java,因为它似乎在可移植性方面更具战斗性,并且它在旧系统上已经存在了一段时间.我有点难过,因为我对C#非常好奇,我很乐意做一些大项目,但也许下次.感谢所有的建议.
Mono在定位我想支持的平台方面做得更好.除此之外,这都是主观的.
我在以下平台上共享C#代码: - iOS(iPhone/iPad) - Android - Web(HTML5) - Mac(OS X) - Linux - Windows
我可以分享更多的地方: - Windows Phone 7 - Wii - XBox - PS3 - 等
由于MonoTouch的运作非常出色,所以biggie是iOS .我不知道用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让我们说)都是开源项目而没有任何企业支持,我会每次都选择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位数组).Rosylyn是.NET世界中最令人兴奋的新技术之一.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很糟糕,因为它不允许您使用Microsoft提供的所有技术
对我而言,很明显这些陈述是不相容的.我拒绝第一个声明,但会在这里跳过这个论点.第二种说法适用于所有.NET替代方案.
JVM是一个很棒的平台,JVM语言的爆炸式增长非常棒.用什么让你开心.现在,对我来说,这通常是.NET/Mono.
嗯...... 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环境中非常重要的一部分.我怀疑在未来几年中,便携性的差异会迅速减少,
2018年更新
我对此的看法开始走向另一条道路.我认为.NET,特别是.NET Core,已经开始实现与Java的"可移植性平等".正在努力为某些平台将WPF引入.NET Core,而.NET Core本身现在可以在很多平台上运行.Mono(由Xamarin拥有,现在由微软拥有)是一个比以往更加成熟和优雅的产品,编写在多个平台上工作的应用程序不再是.NET hackery的深层领域,而是一个相对简单的努力.当然,存在仅限Windows或仅能够针对特定平台的库和服务以及应用程序 - 但Java(广义地说)也是如此.
如果我现在处于OP的位置,我可以认为语言或技术堆栈本身没有任何固有的原因会妨碍我从这一点开始为任何应用程序选择.NET.
我实际上在.NET中开发,首先在Mono上运行我的所有测试,然后在Windows上运行.这样我知道我的应用程序是跨平台的.我在ASP.NET和Winforms应用程序上都做得非常成功.
我不确定某些人会在哪里得到Mono如此可怕的印象,但它确实在我的案例和意见中完成了它的工作.对于.NET中最新和最伟大的发明,你会有一点滞后.世界,但到目前为止,Windows和Linux上的.NET 2.0对我来说非常可靠.
请记住,显然有许多怪癖,但大多数都来自确保您编写可移植代码.虽然框架很好地抽象出你正在运行的操作系统,但是像路径和文件名中的Linux区分大小写这样的东西需要一些习惯,就像权限这样的东西.
由于Mono基于我迄今为止的经验,.NET绝对是非常跨平台的.
Java实际上就像每个人都说的那样跨平台.几乎所有的主流操作系统都有JVM实现(最后甚至是Mac OS X),它们都能很好地工作.还有大量的开源工具,就像跨平台一样.
唯一的问题是,如果没有编写一些DLL或SO,就有一些Java无法完成的本机操作.在实践中出现这些非常罕见.但是,在所有这些情况下,我已经能够通过生成本机进程和屏幕抓取结果来绕过它.
我认为问题的措辞不正确.对于跨平台使用而言,C#与Java的关注性要小于(a)您需要支持的平台,以及(b)考虑核心库和可用的第三方库.语言几乎是决策过程中最不重要的部分.
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,我对这些成功应用的知识有限.
我一直在问同样的问题,恕我直言,.NET/Mono似乎是一个更好的选择,因为Mono有跨平台桌面应用程序(而不是Java)的良好记录,当然,Mono是这些天突飞猛进.
我也会说Java.如果从成熟度的角度来看,Sun(和其他人)花费了大量的时间和精力来使JVM在非Windows平台上运行.
相比之下,Mono绝对是.NET生态系统中的二等公民.
根据您的目标客户是谁,您可能还会发现使用Mono存在真正的阻力 - Novell是否为您在Windows上为Java或.NET提供的Mono提供相同类型的供应商支持?
如果您的主要目标是在Windows上托管您的服务,那么考虑这个选择是有意义的,但是因为您主要针对Linux,所以对我来说这似乎是不费吹灰之力.
Java被设计为跨平台; C#/ .Net不是.如有疑问,请使用专为您的目的而设计的工具.
编辑:公平地说,.NET被设计用于嵌入式/ PC /服务器环境,因此是跨平台的SORT.但它不是为Linux而设计的.
我认为答案是"这取决于".Java几乎可以运行,但.NET/Mono(恕我直言)是一个更好的桌面框架.所以我想答案实际上取决于您计划定位的平台.
为了给对话添加更多内容,如果你只保留一个版本,Java就更具可移植性 - Java 5仍然有许多优秀的功能,所以你可以等待Java 6,并且仍然有很多语言和库的范围来开发用.Mac是主要平台,可能需要一些时间才能赶上最新的Java版本.
Java还有一个优秀的标准体,可以根据许多不同公司的输入智能地发展平台.这是一个经常被忽视的功能,但它甚至可以使新功能在多个平台上运行良好,并为一些深奥的东西(作为可选扩展)提供了大量的库支持.
我会投票支持Java比C#更便携.Java肯定也有一套非常丰富的标准库.还有一组广泛的开源第三方库,例如Jakarta项目(http://jakarta.apache.org/)提供的库.
所有常见的嫌疑人都存在CI,单元测试等.Eclipse,Netbeans,IntelliJ IDEA等跨平台IDE支持也非常好.