Wie viel weniger Bibliotheken gibt es für Mono als für Java?
Mir fehlt der Überblick über beide Alternativen, aber ich habe ziemlich viel Wahlfreiheit für mein nächstes Projekt. Ich suche nach harten technischen Fakten in den Bereichen
- Leistung (zum Beispiel wurde mir gesagt, dass Java gut für das Threading ist, und ich höre, dass die Laufzeitcode-Optimierung für .NET in letzter Zeit sehr gut geworden ist)
- Portabilität in der realen Welt (beide sollen portabel sein, was ist Catch-22 für jeden?)
- Verfügbarkeit von Tools ( CI , Build-Automatisierung, Debugging, IDE)
Ich bin besonders auf der Suche nach dem, was Sie tatsächlich in Ihrer eigenen Arbeit erlebt haben, und nicht nach den Dingen, die ich googeln könnte. Meine Anwendung wäre ein Back-End-Dienst, der große Datenmengen aus Zeitreihen verarbeitet.
Meine Hauptzielplattform wäre Linux.
Bearbeiten: Um meine Frage angemessener zu formulieren, interessiert mich das gesamte Paket (Bibliotheken von Drittanbietern usw.), nicht nur die Sprache. Für Bibliotheken läuft das wahrscheinlich auf die Frage hinaus, "wie viel weniger Bibliotheken gibt es für Mono als für Java"?
Zu Ihrer Information, ich habe mich seitdem für Java für dieses Projekt entschieden, weil es auf der Portabilitätsseite eher kampferprobt zu sein schien und es auch auf älteren Systemen schon eine Weile gibt. Ich bin ein bisschen traurig darüber, weil ich sehr neugierig auf C # bin und gerne ein großes Projekt darin gemacht hätte, aber vielleicht beim nächsten Mal. Vielen Dank für alle Ratschläge.
Antworten:
Nun ... Java ist eigentlich portabler. Mono ist nicht überall implementiert und liegt erheblich hinter der Microsoft-Implementierung zurück. Das Java SDK scheint plattformübergreifend besser synchron zu bleiben (und es funktioniert auf mehr Plattformen).
Ich würde auch sagen, dass Java auf all diesen Plattformen mehr Tools zur Verfügung hat, obwohl für .NET auf Windows-Plattformen zahlreiche Tools verfügbar sind.
Update für 2014
Ich bin 2014 immer noch der Meinung, aber ich werde dies qualifizieren, indem ich sage, dass ich gerade erst anfange, Mono etwas Aufmerksamkeit zu schenken, nachdem ich mich lange nicht wirklich darum gekümmert habe, so dass es möglicherweise Verbesserungen in der Mono-Laufzeit (oder im Ökosystem) gibt ), auf die ich nicht aufmerksam gemacht wurde. AFAIK, es gibt immer noch keine Unterstützung für WPF, WCF, WF, von WIF. Mono kann unter iOS ausgeführt werden, aber meines Wissens läuft die Java-Laufzeit immer noch auf weit mehr Plattformen als Mono. Außerdem sieht Mono einige deutlich verbesserte Tools (Xamarin), und Microsoft scheint eine viel plattformübergreifendere Haltung und Bereitschaft zu haben, mit Partnern zusammenzuarbeiten, um sie komplementär zu machen, anstatt wettbewerbsfähig zu sein (zum Beispiel wird Mono dies tun) ein ziemlich wichtiger Teil der kommenden OWIN / Helios ASP.NET-Landschaft). Ich vermute, dass sich die Unterschiede in der Portabilität in den kommenden Jahren rapide verringern werden.
Update für 2018
Mein Blick darauf beginnt in die andere Richtung zu gehen. Ich denke, .NET hat im Großen und Ganzen, insbesondere mit .NET Core, begonnen, mit Java eine "Portabilitätsparität" zu erreichen. Es werden Anstrengungen unternommen, um WPF für einige Plattformen auf .NET Core zu bringen, und .NET Core selbst läuft derzeit auf sehr vielen Plattformen. Mono (im Besitz von Xamarin, das jetzt Microsoft gehört) ist ein ausgereifteres und ausgefeilteres Produkt als je zuvor, und das Schreiben von Anwendungen, die auf mehreren Plattformen funktionieren, ist nicht länger die Domäne der tiefen Gnosis von .NET-Hackery, sondern ein relativ einfaches Unterfangen . Es gibt natürlich Bibliotheken, Dienste und Anwendungen, die nur für Windows bestimmt sind oder nur auf bestimmte Plattformen abzielen können - aber das Gleiche gilt für Java (im Großen und Ganzen).
Wenn ich zu diesem Zeitpunkt in den Händen des OP wäre, könnte ich mir keinen Grund vorstellen, der den Sprachen oder technischen Stacks selbst innewohnt, der mich daran hindern würde, .NET für eine Anwendung zu wählen, die von diesem Punkt an ausgeführt wird.
quelle
Mono kann besser auf die Plattformen abzielen, die ich unterstützen möchte. Davon abgesehen ist alles subjektiv.
Ich teile C # -Code auf folgenden Plattformen: - iOS (iPhone / iPad) - Android - Das Web (HTML5) - Mac (OS X) - Linux - Windows
Ich könnte es noch mehr Orte teilen: - Windows Phone 7 - Wii - XBox - PS3 - etc.
Das große Problem ist iOS, da MonoTouch fantastisch funktioniert. Ich kenne keine gute Möglichkeit, iOS mit Java zu erreichen. Sie können Windows Phone 7 nicht mit Java als Ziel festlegen, daher würde ich sagen, dass die Tage, in denen Java für Mobilgeräte besser ist, hinter uns liegen.
Der größte Faktor für mich ist jedoch die persönliche Produktivität (und das Glück). C # als Sprache ist Java IMHO um Jahre voraus, und die Verwendung des .NET-Frameworks ist eine Freude. Das meiste, was in Java 7 und Java 8 hinzugefügt wird, ist seit Jahren in C #. JVM-Sprachen wie Scala und Clojure (beide in der CLR verfügbar) sind allerdings ziemlich nett.
Ich sehe Mono als eigenständige Plattform (eine großartige) und behandle .NET als die Microsoft-Implementierung von Mono unter Windows. Dies bedeutet, dass ich zuerst Mono entwickle und teste. Das funktioniert wunderbar.
Wenn sowohl Java als auch .NET (sagen wir Mono) Open Source-Projekte ohne Unternehmensunterstützung wären, würde ich jedes Mal Mono gegenüber Java wählen. Ich glaube, es ist nur eine bessere Plattform.
Sowohl .NET / Mono als auch die JVM sind eine gute Wahl, obwohl ich persönlich eine andere Sprache als Java für die JVM verwenden würde.
Meine Meinung zu einigen anderen Kommentaren:
Problem: Leistung.
** Antwort: Sowohl die JVM als auch die CLR schneiden besser ab als Kritiker sagen. Ich würde sagen, dass die JVM besser abschneidet. Mono ist im Allgemeinen langsamer als .NET (wenn auch nicht immer).
Ich persönlich würde ASP.NET MVC jeden Tag sowohl als Entwickler als auch als Endbenutzer über J2EE übertragen. Die Unterstützung für Google Native Client ist auch ziemlich cool. Ich weiß auch, dass eine schlechte GUI-Leistung für Desktop-Java-Apps der Vergangenheit angehören sollte, aber ich finde immer wieder langsame. Andererseits könnte ich dasselbe für WPF sagen. GTK # ist zwar schnell genug, es gibt also keinen Grund, warum sie langsam sein müssen.
Problem: Java verfügt über ein größeres Ökosystem an Bibliotheken.
Antwort: Wahrscheinlich wahr, aber in der Praxis ist dies kein Problem.
Praktisch jede Java-Bibliothek (einschließlich des JDK) läuft dank IKVM.NET nur .and / Mono . Diese Technologie ist ein wahres Wunder. Die Integration ist erstaunlich; Sie können eine Java-Bibliothek so verwenden, als wäre sie nativ. Ich musste allerdings nur Java-Bibliotheken in einer .NET-App verwenden. Das .NET / Mono-Ökosystem bietet im Allgemeinen mehr als ich brauche.
Problem: Java bietet eine bessere (umfassendere) Unterstützung für Tools
Antwort: Nicht unter Windows. Ansonsten stimme ich zu. MonoDevelop ist allerdings nett.
Ich möchte MonoDevelop einen Gruß aussprechen . Es ist ein Juwel. MonoDevelop integriert die meisten Tools, die ich verwenden möchte, einschließlich Code-Vervollständigung (Intellisense), Git / Subversion-Integration, Unterstützung für Komponententests, SQL-Integration, Debugging, einfaches Refactoring und Durchsuchen von Assemblys mit On-the-Fly-Dekompilierung. Es ist wunderbar, dieselbe Umgebung für alles zu verwenden, vom serverseitigen Web bis hin zu mobilen Apps.
Problem: Kompatibilität zwischen Plattformen.
Antwort: Mono ist eine einzige Codebasis auf allen Plattformen, einschließlich Windows.
Entwickeln Sie zuerst für Mono und stellen Sie es unter Windows in .NET bereit, wenn Sie möchten. Wenn Sie jedoch .NET von MS mit Java vergleichen, hat Java den Vorteil hinsichtlich der plattformübergreifenden Konsistenz. Siehe nächste Antwort ...
Problem: Mono bleibt hinter .NET zurück.
Antwort: Nein, tut es nicht. IMHO, dies ist eine oft angegebene, aber falsche Aussage.
Die Mono-Distribution von Xamarin wird mit C #, VB.NET, F #, IronPython, IronRuby und Boo ausgeliefert. Der Mono C # -Compiler ist mit MS vollständig auf dem neuesten Stand. Der Mono VB.NET-Compiler liegt hinter der MS-Version zurück. Die anderen Compiler sind auf beiden Plattformen gleich (wie auch andere .NET-Sprachen wie Nemerle, Boo und Phalanger (PHP)).
Mono wird mit einem Großteil des von Microsoft geschriebenen Codes geliefert, einschließlich DLR (Dynamic Language Runtime), MEF (Managed Extensibility Framework), F # und ASP.NET MVC. Da Razor nicht Open Source ist, wird Mono derzeit mit MVC2 ausgeliefert, MVC3 funktioniert jedoch einwandfrei mit Mono.
Die Kernplattform von Mono hat mit .NET oder vielen Jahren Schritt gehalten und die Kompatibilität ist beeindruckend. Sie können heute die vollständige C # 4.0-Sprache und sogar einige C # 5.0-Funktionen verwenden. Tatsächlich führt Mono .NET häufig in vielerlei Hinsicht an.
Mono implementiert Teile der CLR-Spezifikation, die selbst Microsoft nicht unterstützt (wie 64-Bit-Arrays). Eine der aufregendsten neuen Technologien in der .NET-Welt ist Rosylyn . Mono bietet den C # -Compiler seit vielen Jahren als Service an. Einige der Angebote von Rosylyn sind auch über NRefractory erhältlich . Ein Beispiel dafür, wo Mono noch vorne liegt, wären die SIMD-Anweisungen zur Beschleunigung der Spieleleistung.
Microsoft bietet zusätzlich zu .NET eine Reihe von Produkten an, die in Mono nicht verfügbar sind. Dies ist der Grund für das Missverständnis über Mono-Verzögerungen. Windows Presentation Foundation (WPF), Entity Framework (EF) und WCF (Windows Communication Foundation) sind Beispiele für Produkte, die unter Mono nicht funktionieren oder nur unzureichend unterstützt werden. Die naheliegende Lösung besteht darin, stattdessen plattformübergreifende Alternativen wie GTK #, NHibernate und ServiceStack zu verwenden.
Problem: Microsoft ist böse.
Antwort: Richtig. Na und.
Viele Menschen bieten die folgenden Gründe an, um die Verwendung von Mono zu vermeiden:
1) Sie sollten Mono nicht verwenden, da Microsoft-Technologie vermieden werden sollte
2) Mono ist zum Kotzen, weil Sie nicht jede von Microsoft angebotene Technologie verwenden können
Mir ist klar, dass diese Aussagen nicht kompatibel sind. Ich lehne die erste Aussage ab, werde dieses Argument aber hier überspringen. Die zweite Aussage gilt für alle .NET-Alternativen.
Die JVM ist eine großartige Plattform und die Explosion der JVM-Sprachen ist fantastisch. Verwenden Sie, was Sie glücklich macht. Im Moment ist das für mich oft .NET / Mono.
quelle
Ich entwickle tatsächlich in .NET, führe alle meine Tests zuerst unter Mono und dann unter Windows aus. Auf diese Weise weiß ich, dass meine Anwendungen plattformübergreifend sind. Ich habe dies sowohl in ASP.NET- als auch in Winforms-Anwendungen sehr erfolgreich durchgeführt.
Ich bin mir nicht sicher, woher manche Leute den Eindruck haben, dass Mono so schrecklich ist, aber es hat in meinen Fällen und Meinungen sicherlich seine Arbeit geleistet. Es ist wahr, dass Sie ein bisschen Verzögerung für die neuesten und besten Erfindungen in .NET haben werden Welt, aber bisher ist .NET 2.0 unter Windows und Linux für mich sehr solide.
Denken Sie daran, dass dies offensichtlich viele Macken hat, aber die meisten davon sind darauf zurückzuführen, dass Sie sicherstellen, dass Sie tragbaren Code schreiben. Während die Frameworks das Betriebssystem, auf dem Sie ausgeführt werden, hervorragend abstrahieren, sind kleine Dinge wie die Groß- und Kleinschreibung von Linux in Pfaden und Dateinamen etwas gewöhnungsbedürftig, ebenso wie Berechtigungen.
.NET ist aufgrund von Mono aufgrund meiner bisherigen Erfahrungen definitiv sehr plattformübergreifend.
quelle
Java ist tatsächlich so plattformübergreifend, wie jeder sagt. Es gibt eine JVM-Implementierung für nahezu jedes Mainstream-Betriebssystem (schließlich sogar für Mac OS X), und alle funktionieren sehr gut. Und es gibt Unmengen von Open Source-Tools, die genauso plattformübergreifend sind.
Der einzige Haken ist, dass es bestimmte native Operationen gibt, die Sie in Java nicht ausführen können, ohne einige DLLs oder SOs zu schreiben. Es ist sehr selten, dass diese in der Praxis auftauchen. In all diesen Fällen konnte ich es jedoch umgehen, indem ich native Prozesse hervorbrachte und die Ergebnisse auf dem Bildschirm abkratzte.
quelle
Ich denke, die Frage ist falsch formuliert. C # vs. Java ist im Hinblick auf die plattformübergreifende Nutzung viel weniger interessant als (a) welche Plattformen Sie unterstützen müssen und (b) die Kernbibliotheken und verfügbaren Bibliotheken von Drittanbietern berücksichtigen. Die Sprache ist fast der am wenigsten wichtige Teil des Entscheidungsprozesses.
quelle
Java ist eine bessere Wahl für die plattformübergreifende Entwicklung.
Performance. Java und .Net weisen aufgrund der virtuellen Maschine ein ähnliches Leistungsniveau auf, aber JVM weist aufgrund jahrelanger Optimierung normalerweise eine bessere Leistung auf.
Bibliothek. Obwohl dies von Ihrer Aufgabe abhängt, stehen in Java viel mehr Open Source-Bibliotheken oder Bibliotheken von Drittanbietern zur Verfügung. Für Server-App, J2EE, Spring, Struts usw. Für die GUI .Net bietet zwar eine Win32-Layer-API, dies führt jedoch zu Kompatibilitätsproblemen. Java hat Swing, SWT, AWT usw. Es funktioniert in den meisten Fällen.
Kompatibilität. Dies sind die wichtigsten Punkte, die bei der Entwicklung des plattformübergreifenden Programms berücksichtigt werden müssen. Zwei Probleme: Erstens die Plattformkompatibilität. Java gewinnt immer noch, da JDK von der einzelnen und ursprünglichen Firma Sun gut gepflegt wird. Mono wird nicht von MS verwaltet, daher haben Sie noch keine Garantie für die Update-Kompatibilität. 2. Abwärtskompatibilität. Sun hat einen guten Ruf in Bezug auf die Abwärtskompatibilität, obwohl dies manchmal zu starr erscheint und das Tempo verlangsamt.
Werkzeuge. Java hat gute plattformübergreifende IDEs. Netbeans, Eclipse usw. Die meisten von ihnen sind kostenlos. VS Studio ist gut, aber nur unter Windows und kostet kein bisschen. Beide bieten gute Unit-Tests, Debugs, Profile usw.
Daher würde ich vorschlagen, dass Java eine bessere Wahl ist. Als Beispiel gibt es einige berühmte plattformübergreifende Desktop-Apps, die von Java entwickelt wurden: Vuze, Limewire, BlogBridge, CrossFTP, ganz zu schweigen von diesen IDEs. In Bezug auf .Net habe ich nur begrenzte Kenntnisse über solche Erfolgs-Apps.
quelle
Ich habe die gleiche Frage erst spät gestellt, und meiner Meinung nach scheint .NET / Mono eine bessere Option zu sein, einfach weil Mono eine großartige Erfolgsbilanz für plattformübergreifende Desktop-Anwendungen (im Gegensatz zu Java) hat und Mono natürlich Verbesserung in diesen Tagen sprunghaft .
quelle
Ich werde auch Java sagen. Wenn Sie es in Bezug auf die Reife betrachten, haben Sun (und andere) viel mehr Zeit und Mühe aufgewendet, um die JVM auf Nicht-Windows-Plattformen zum Laufen zu bringen.
Im Gegensatz dazu ist Mono definitiv ein Bürger zweiter Klasse im .NET-Ökosystem.
Abhängig davon, wer Ihre Zielkunden sind, gibt es möglicherweise auch einen echten Rückschlag gegen die Verwendung von Mono. Bietet Novell die gleiche Art von Herstellerunterstützung für Mono, die Sie für Java oder .NET unter Windows erhalten würden?
Wenn Sie in erster Linie auf das Hosten Ihres Dienstes unter Windows abzielen, wäre es sinnvoll, diese Wahl in Betracht zu ziehen. Da Sie jedoch in erster Linie auf Linux abzielen, scheint es mir ein Kinderspiel zu sein.
quelle
Java wurde plattformübergreifend konzipiert. C # /. Net war nicht. Verwenden Sie im Zweifelsfall das für Ihren Zweck entwickelte Tool.
BEARBEITEN: Fairerweise wurde .NET so konzipiert, dass es in Embedded- / PC- / Server-Umgebungen funktioniert. Das ist also eine Art plattformübergreifende Lösung. Aber es wurde nicht für Linux entwickelt.
quelle
Ich denke, die Antwort lautet "es kommt darauf an". Java läuft auf fast allem, aber .NET / Mono ist (IMHO) ein besseres Framework für den Desktop. Ich denke, die Antwort hängt wirklich davon ab, auf welche Plattformen Sie zielen möchten.
quelle
Um der Konversation ein bisschen mehr hinzuzufügen, ist Java portabler, wenn Sie ungefähr eine Version hinter sich lassen - Java 5 verfügt immer noch über viele hervorragende Funktionen, sodass Sie auf Java 6 warten können und dennoch eine große Bandbreite an Sprach- und Bibliotheksentwicklungen haben mit. Der Mac ist die primäre Plattform, die einige Zeit in Anspruch nehmen kann, um die neueste Java-Version zu erhalten.
Java verfügt auch über einen hervorragenden Standardkörper , der die Plattform auf der Grundlage von Eingaben vieler verschiedener Unternehmen intelligent erweitert. Dies ist eine oft übersehene Funktion, aber sie sorgt dafür, dass auch neue Funktionen auf mehreren Plattformen gut funktionieren, und bietet eine große Bandbreite an Bibliotheksunterstützung für einige esoterische Dinge (als optionale Erweiterungen).
quelle
Ich würde dafür stimmen, dass Java portabler ist als C #. Java hat definitiv auch eine sehr umfangreiche Auswahl an Standardbibliotheken. Es gibt auch eine breite Palette von Open-Source-Bibliotheken von Drittanbietern, wie sie beispielsweise vom Jakarta-Projekt ( http://jakarta.apache.org/ ) bereitgestellt werden .
Alle üblichen Verdächtigen existieren auch für CI, Unit-Tests usw. Die plattformübergreifende IDE-Unterstützung ist auch bei Eclipse, Netbeans, IntelliJ IDEA usw. sehr gut.
quelle
Es gibt auch andere Sprachoptionen. Ich habe Python sehr gemocht, das unter Windows, Linux und Mac gut funktioniert und über eine Vielzahl von Bibliotheken verfügt.
quelle
Während Mono seinen Anteil an Problemen hat einige ich denke, es hat eine bessere plattformübergreifende Kompatibilitätsgeschichte, insbesondere wenn Sie sich auf den nativen Plattformaufruf verlassen.
Es gibt nicht genügend Wörter zu Stack Overflow, um zu betonen, wie reibungslos es ist, etwas Natives in .NET / Mono auf (zumindest nach meiner Erfahrung 3 ...) mehreren Plattformen aufzurufen und auszuführen, verglichen mit dem entsprechenden Java-Aufwand.
quelle
Gatorhall, haben Sie einige Daten, um das zu sichern ?
Hintergrund: Ich bin ein Windows-Typ seit Windows 3.1 und derzeit ein Linux-Benutzer (läuft immer noch unter Windows 7, einem großartigen Betriebssystem, auf einer VM für Visual Studio 2010 und anderen Tools).
Der Punkt: Ich und viele Benutzer (Windows, Linux usw.), die ich kenne, sind möglicherweise anderer Meinung als Sie. Java ist selbst unter Linux-Desktopanwendungen tendenziell langsamer. ASP.NET ist häufig schneller als Java-Serverseiten. Einige stimmen möglicherweise darin überein, dass selbst nicht kompiliertes PHP in mehreren Szenarien eine bessere Leistung erbringt.
Java ist plattformübergreifender? Ich habe keine Zweifel daran (die Geschichte hat dies wieder aufgenommen), aber schneller (ohne zu sagen, dass .NET ist) ist nicht so sicher und ich würde gerne einige echte Benchmarks sehen.
quelle