108

Mono のライブラリは Java のライブラリよりどれくらい少ないのですか?

両方の選択肢についての概要はありませんが、次のプロジェクトではかなり自由に選択できます。の分野で難しい技術的事実を探しています

  • パフォーマンス (たとえば、Java はスレッド化に適していると言われています。また、最近ではランタイム コードの最適化が .NET に対して非常に優れていると聞いています)
  • 現実世界での移植性 (両方とも移植可能であることを意図しています。それぞれの Catch-22 とは何ですか?)
  • ツールの可用性 ( CI、ビルドの自動化、デバッグ、IDE)

私がググって得たものよりも、あなた自身の仕事で実際に経験したことを特に探しています。私のアプリケーションは、時系列の大量のデータを処理するバックエンド サービスです。

私の主なターゲット プラットフォームは Linux です。

編集: 私の質問をより適切に表現するために、言語だけでなく、パッケージ全体(サードパーティのライブラリなど)に興味があります。ライブラリの場合、それはおそらく「Mono のライブラリは Java のライブラリよりどれだけ少ないか」という質問に要約されますか?


参考までに、このプロジェクトに Java を選択したのは、移植性の面で使い古されたように見え、古いシステムでもしばらく使用されていたためです。私は C# に非常に興味があり、C# で大規模なプロジェクトをやりたいと思っていたので、少し残念ですが、次回はそうするかもしれません。すべてのアドバイスをありがとう。

4

15 に答える 15

112

Mono は、私がサポートしたいプラットフォームをターゲットにするのに適しています。それ以外はすべて主観です。

次のプラットフォームで C# コードを共有しています: - iOS (iPhone/iPad) - Android - Web (HTML5) - Mac (OS X) - Linux - Windows

さらに多くの場所で共有できます: - Windows Phone 7 - Wii - XBox - PS3 - など。

MonoTouchは素晴らしく機能するので、大物は iOSです。Java で iOS をターゲットにする良い方法がわかりません。Java で Windows Phone 7 をターゲットにすることはできないため、Java がモバイルにとってより優れている時代は過ぎ去ったと言えます。

私にとって最大の要因は、個人の生産性 (および幸福度) です。言語としての C# は Java IMHO よりも何年も先を行っており、.NET フレームワークは楽しく使用できます。Java 7 と Java 8 で追加されたもののほとんどは、何年もの間 C# にありました。ただし、Scala や Clojure (どちらも CLR で利用可能) などの JVM 言語は非常に優れています。

私は、Mono を独自のプラットフォーム (素晴らしいプラットフォーム) と見なしており、.NET を Windows 上の Mono の Microsoft 実装として扱っています。これは、最初に Mono で開発およびテストすることを意味します。これは素晴らしく機能します。

Java と .NET (Mono としましょう) の両方が企業の支援を受けていないオープン ソース プロジェクトである場合、私は Java よりも常に Mono を選択します。私はそれがより良いプラットフォームだと信じています.

.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 ライブラリをネイティブのように使用できます。ただし、1 つの .NET アプリで Java ライブラリを使用するだけで済みました。.NET/Mono エコシステムは一般に、必要以上のものを提供します。

問題: Java はより優れた (より広範な) ツールをサポートしています

回答: Windows ではありません。そうでなければ私は同意します。しかし、MonoDevelop は素晴らしいです。

私はMonoDevelopに感謝したいと思います。それは宝石です。MonoDevelop は、コード補完 (intellisense)、Git/Subversion 統合、単体テストのサポート、SQL 統合、デバッグ、簡単なリファクタリング、オンザフライ逆コンパイルによるアセンブリ ブラウジングなど、私が使用したいツールのほとんどを統合しています。サーバーサイドのWebからモバイルアプリまで、同じ環境を利用できるのは素晴らしいことです。

問題: プラットフォーム間の互換性。

回答: Mono は、Windows を含むすべてのプラットフォームで単一のコード ベースです。

最初に Mono 用に開発し、必要に応じて Windows 上の .NET にデプロイします。MS の .NET と Java を比較すると、Java はプラットフォーム間の一貫性という点で優れています。次の回答を参照してください...

問題: Mono は .NET に遅れます。

回答: いいえ、ありません。私見、これはよく言われますが、間違った声明です。

Xamarin の Mono ディストリビューションには、C#、VB.NET、F#、IronPython、IronRuby が同梱されています。Mono C# コンパイラは、MS で完全に最新の状態になっています。Mono VB.NET コンパイラは、MS バージョンより遅れています。他のコンパイラは、両方のプラットフォームで同じです (Nemerle、Boo、および Phalanger (PHP) などの他の .NET 言語も同様です)。

Mono には、Dynamic Language Runtime (DLR)、Managed Extensibility Framework (MEF)、F#、ASP.NET MVC など、Microsoft が記述した実際のコードが多数付属しています。Razor はオープン ソースではないため、Mono は現在 MVC2 に同梱されていますが、MVC3 は Mono でも問題なく動作します。

コアの Mono プラットフォームは、.NET または長年にわたって歩調を合わせており、互換性は印象的です。現在、完全な C# 4.0 言語と一部の C# 5.0 機能を使用できます。実際、Mono は多くの点で .NET をリードしています。

Mono は、Microsoft でさえサポートしていない CLR 仕様の一部 (64 ビット配列など) を実装しています。.NET の世界で最もエキサイティングな新しいテクノロジの 1 つがRosylynです。Mono は、長年にわたって C# コンパイラをサービスとして提供してきました。Rosylyn が提供するものの一部は、 NRefractoryからも入手できます。Mono がまだ先行している例としては、ゲームのパフォーマンスを加速する SIMD 命令があります。

Microsoft は、Mono で利用できない .NET 上に多数の製品を提供していますが、これが Mono の遅延に関する誤解の元になっています。Windows Presentation Foundation (WPF)、Entity Framework (EF)、WCF (Windows Communication Foundation) は、Mono で動作しない、または十分にサポートされていない製品の例です。明らかな解決策は、代わりに GTK#、NHibernate、ServiceStack などのクロスプラットフォームの代替手段を使用することです。

問題: Microsoft は悪です。

答え: そうです。だから何。

多くの人が、Mono の使用を避ける次の理由を挙げています。

1) Microsoft の技術は避けるべきなので、Mono を使用しないでください。

2) Mono は、Microsoft が提供するすべてのテクノロジを使用できるわけではないため、最悪です

私には、これらのステートメントが相容れないことは明らかです。最初のステートメントは却下しますが、ここではその議論をスキップします。2 番目のステートメントは、すべての .NET 代替案に当てはまります。

JVM は優れたプラットフォームであり、JVM 言語の急増は素晴らしいものです。あなたが幸せになるものを使ってください。今のところ、それは多くの場合、.NET/Mono です。

于 2012-01-28T22:01:03.830 に答える
96

まあ....Javaは実際にはより移植性があります。Mono はどこでも実装されているわけではなく、Microsoft の実装に大きく遅れをとっています。Java SDK は、プラットフォーム間でよりよく同期しているようです (そして、より多くのプラットフォームで動作します)。

また、Windows プラットフォーム上の .NET で利用できるツールはたくさんありますが、Java はこれらすべてのプラットフォームでより多くのツールを利用できるとも言えます。

2014 年の更新

私は 2014 年もこの意見を保持しています。ただし、Mono ランタイム (またはエコシステム) が改善される可能性があります。 ) 知らされていませんでした。私の知る限り、WPF、WCF、WF、WIF はまだサポートされていません。Mono は iOS で実行できますが、私の知る限り、Java ランタイムは引き続き Mono よりもはるかに多くのプラットフォームで実行されます。また、Mono には大幅に改善されたツール (Xamarin) が見られるようになり始めており、Microsoft はパートナーと協力して競争ではなく補完的なものにするためのクロスプラットフォームの態度と意欲を持っているようです (たとえば、Mono は今後の OWIN/Helios ASP.NET ランドスケープの非常に重要な部分です)。今後数年間で、移植性の違いは急速に減少すると思いますが、

2018年のアップデート

これに対する私の見解は、逆方向に進み始めています。.NET は、広く、特に .NET Core を使用して、Java との "移植性パリティ" を達成し始めていると思います。一部のプラットフォームの .NET Core に WPF を導入する取り組みが進行中であり、.NET Core 自体は現在、非常に多くのプラットフォームで実行されています。Mono (Xamarin が所有し、現在は Microsoft が所有) はこれまで以上に成熟した洗練された製品であり、複数のプラットフォームで動作するアプリケーションを作成することは、もはや .NET ハッカーの深い知識の領域ではなく、比較的単純な試みです。 . もちろん、ライブラリ、サービス、およびアプリケーションは、Windows 専用であるか、特定のプラットフォームのみをターゲットにすることができますが、Java についても (広く) 同じことが言えます。

この時点で私が OP の立場にあった場合、この時点からアプリケーションに .NET を選択することを妨げる、言語または技術スタック自体に固有の理由は考えられません。

于 2008-09-14T19:05:57.647 に答える
54

私は実際に .NET で開発し、すべてのテストを最初に Mono で実行し、次に Windows で実行します。そうすれば、自分のアプリケーションがクロス プラットフォームであることがわかります。私は、ASP.NET と Winforms アプリケーションの両方でこれを成功させました。

一部の人々がどこから Mono がそれほど恐ろしいという印象を持っているのかはよくわかりませんが、私のケースや意見では確かにその役割を果たしています.しかし、これまでのところ、Windows と Linux の .NET 2.0 は私にとって非常に安定しています。

これには明らかに多くの癖があることを覚えておいてください。しかし、それらのほとんどは、移植可能なコードを書いていることを確認することから来ています。フレームワークは、実行している OS を抽象化するという素晴らしい仕事をしますが、Linux のパスやファイル名の大文字と小文字の区別などの小さなことは、パーミッションなどと同様、少し慣れる必要があります。

これまでの私の経験に基づくと、Mono のおかげで .NET は非常にクロス プラットフォームであることは間違いありません。

于 2008-09-14T19:13:08.720 に答える
26

Java は実際、誰もが言うようにクロスプラットフォームです。ほぼすべての主流の OS (最終的には Mac OS X も) 用の JVM 実装があり、それらはすべて非常にうまく機能します。そして、クロス プラットフォームと同じように使えるオープン ソース ツールがたくさんあります。

唯一の問題は、いくつかの 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などがあります。ほとんどの場合に機能します。

  • 互換性。これは、クロスプラットフォームプログラムを開発するときに考慮する必要がある重要な問題です。2つの問題:最初に、プラットフォームの互換性。JDKは単一の元の会社Sunによって十分に維持されているため、Javaは依然として勝っています。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とも言います。成熟度の観点から見ると、Windows 以外のプラットフォームで JVM を動作させるために、Sun (およびその他) によってさらに多くの時間と労力が費やされてきました。

対照的に、Mono は間違いなく .NET エコシステムの二流市民です。

対象となる顧客が誰であるかによっては、Mono の使用に対する反対意見もあるかもしれません。Novell は、Windows 上の Java や .NET で得られるのと同じ種類の Mono のベンダー サポートを提供していますか?

主に Windows でサービスをホストすることを目標としている場合、この選択を検討することは理にかなっていますが、主に Linux を目標にしているため、私には簡単なことのように思えます。

于 2008-09-14T23:39:06.693 に答える
7

Java はクロスプラットフォームになるように設計されています。C#/.Net はそうではありませんでした。疑わしい場合は、目的に合わせて設計されたツールを使用してください。

EDIT:公平に言えば、.NETは組み込み/ PC /サーバー環境で動作するように設計されているため、クロスプラットフォームのSORTです。しかし、これは Linux 用に設計されたものではありません。

于 2008-09-14T20:16:53.857 に答える
7

答えは「場合による」だと思います。Java はほとんど何でも実行できますが、.NET/Mono は (IMHO) デスクトップ向けのより優れたフレームワークです。したがって、答えは、ターゲットにする予定のプラットフォームに大きく依存すると思います.

于 2008-09-15T04:48:55.687 に答える
6

会話にもう少し追加すると、Java はバージョンが 1 つ遅れている場合に移植性が高くなります。Java 5 にはまだ多くの優れた機能があるため、Java 6 を待つことができ、開発する言語とライブラリに関してはまだ多くの範囲があります。と。Mac は、最新の Java バージョンに追いつくのに時間がかかる主要なプラットフォームです。

Java には、さまざまな企業からのインプットに基づいてプラットフォームをインテリジェントに成長させる優れた標準化団体もあります。これは見落とされがちな機能ですが、新しい機能でさえ複数のプラットフォームでうまく動作し続け、いくつかの難解なもの (オプションの拡張機能として) に対するライブラリ サポートの範囲を広げます。

于 2008-09-15T03:41:32.727 に答える
5

私は Java が C# よりも移植性に優れていることに投票します。Javaには、非常に豊富な標準ライブラリのセットもあります。また、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 にはいくつかの問題がありますが、ネイティブ プラットフォームの呼び出しに依存している場合は特に、クロスプラットフォームの互換性についてはより優れていると思います。

.NET/Mono でネイティブに何かを呼び出して実行する方が (少なくとも私の経験では 3...)、複数のプラットフォームと同等の Java の取り組みよりもどれだけスムーズであるかを強調するには、スタック オーバーフローに関する言葉が足りません。

于 2008-11-05T12:27:29.653 に答える
2

ゲイターホールそれを裏付けるデータはありますか?

パフォーマンス。Java と .Net は、仮想マシンにより同様のパフォーマンス レベルを持っていますが、通常、JVM は年数と年数の最適化により、より優れたパフォーマンスを発揮します。

背景: 私は Windows 3.1 から Windows を使用しており、現在は Linux ユーザーです (Visual Studio 2010 およびその他のツール用の VM で Windows 7、優れた OS をまだ実行しています)。

要点: 私と多くのユーザー (Windows、Linux など) は、あなたの意見に反対するかもしれません。Java は、Linux デスクトップ アプリケーションでもパフォーマンスが低下する傾向があります。ASP.NET は、多くの場合、Java サーバー ページよりも高速に実行されます。いくつかのシナリオでは、コンパイルされていない PHP でさえパフォーマンスが向上することに同意する人もいるかもしれません。

Java はよりクロスプラットフォームですか? 私はこれについて疑いの余地はありませんが (これまでの歴史)、より高速であること (.NET がそうであるとは言いません) は確かではなく、いくつかの実際のベンチマークを確認したいと思います。

于 2011-11-21T12:24:29.553 に答える