Ist .NET / Mono oder Java die bessere Wahl für die plattformübergreifende Entwicklung? [geschlossen]


108

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.


3
Gute Frage. Wir prüfen auch eine Evaluierung für die plattformübergreifende Entwicklung.
Mat Nadrofsky

Ich würde das "welche Sprache" -Tag hinzufügen, aber es gibt bereits 5, also kein Glück.
Daniel Daranas

Kommt stark darauf an, auf welche Plattformen du zielst ...
Thorbjørn Ravn Andersen

1
Jetzt wäre ein guter Zeitpunkt sein , dass Sie bei golang suchen ...
StartupGuy

Xojo könnte auch eine Überlegung wert sein. Es kompiliert native Apps mit LLVM für Windows, Mac Linux. Es verfügt über eine IDE-Build-Automatisierung, ein Debugging usw. Die Bibliothek verfügt über viele Funktionen und kann bei Bedarf erweitert werden. www / xojo.com
Paul Lefebvre

Antworten:


96

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.


2
Ich bin wirklich froh, dies zu lesen und freue mich über die Stimmen in einer Microsoft-Welt. .NET ist wirklich gut, aber Java hat eine Legitimität, wie ich immer versucht habe, als .NET-Entwickler und als alten Java-
Entwickler

+1 dafür. Ich habe festgestellt, dass die Java-Portabilität (für nicht triviale Anwendungen, z. B. Webserver, komplexe GUIs, Analyse-Engines) besser ist als jede andere Alternative. Es ist nicht ganz perfekt, aber es ist das Beste, was Sie jetzt bekommen können.
Mikera

1
@ Ben, hast du diese Meinung auch 2013 noch? Wenn ja, würde es Ihnen etwas ausmachen, dies zu erwähnen, und wenn Sie diese Antwort nicht aktualisieren? Oft ist es schwer zu sagen, wenn man 4 Jahre alte Antworten liest.
Benjamin Gruenbaum

1
@BenjaminGruenbaum ja, obwohl ich meine Meinung an dieser Stelle begründen würde, indem ich sage, dass ich Mono schon lange nicht mehr viel Aufmerksamkeit geschenkt habe, so dass es möglicherweise Verbesserungen in der Mono-Laufzeit (oder im Ökosystem) gibt, die ich nicht war darauf aufmerksam gemacht. AFAIK, es gibt immer noch keine Unterstützung für WPF, WCF oder WF. Mono kann unter iOS ausgeführt werden, aber meines Wissens läuft die Java-Laufzeit immer noch auf weit mehr Plattformen als Mono. Also ja. Qualifiziert, aber ja.
Ben Collins

@HighCore das Argument ist nicht per se gegen Mono. Es ist nur eine Tatsache: Wenn Sie Code schreiben, der von WPF abhängig ist, können Sie Mono nicht verwenden. Ergo ist es auf diese Weise nicht portierbar. Javas UI-Frameworks mögen scheiße sein, aber soweit ich weiß, funktionieren sie überall dort, wo Java funktioniert (und die Hardware unterstützt diese Art von UI). Das macht Java nicht besser , es macht es auf diese spezielle Weise portabler.
Ben Collins

112

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.


3
Vielen Dank für eine so ausführliche Antwort, die so spät im Spiel ist. Ich habe Mono / .Net / C # noch nie verwendet, aber Ihr Beitrag scheint einige der jüngsten Entwicklungen in diesem Universum widerzuspiegeln. Ich erinnere mich zum Beispiel nicht, dass MonoTouch vor 3,5 Jahren so bedeutend war.
Hanno Fietz

3
Ich bin verwirrt von Ihrer Antwort "Mono bleibt nicht hinter .NET zurück". Sie behaupten, dass Sie dann ein halbes Dutzend Möglichkeiten angeben, wie es tatsächlich .NET (Entity Framework usw.) hinterherhinkt. Man kann mit Sicherheit sagen, dass es nicht hinter dem C # -Compiler von Microsoft zurückbleibt, aber das .NET-Ökosystem ist in Mono bestenfalls fragmentarisch. Das scheint für Ihre Zwecke in Ordnung zu sein, aber nicht für alle, und es gibt dort ein berechtigtes Anliegen.
Samkass

1
@samkass: Ich denke, der Punkt hier ist der Unterschied zwischen 'Verzögerungen' und 'implementiert diese Bibliothek nicht'. In der Java-Welt finden Sie dies analog zu Android, das die Swing-Bibliothek nicht implementiert. Bitte beachten Sie auch, dass die plattformübergreifenden (und übrigens Open Source) Äquivalente angegeben wurden. Ich benutze Mono jeden Tag und "bestenfalls fragmentarisch" war definitiv nicht meine Erfahrung.
konrad.kruczynski

9
Das Fehlen einer vollständigen und robusten WCF- und EF-Unterstützung und kein WPF ist für Mono ein Killer für fast alles, woran ich seit .NET 3.0 gearbeitet habe. Ja, es gibt Alternativen, aber ein großer Teil der Leistungsfähigkeit von .NET sind diese zusätzlichen Frameworks. Ohne diese kann man Mono meiner Meinung nach überhaupt nicht als mit .NET kompatibel bezeichnen. Es ist bestenfalls eine teilweise Implementierung. Ich habe auch NHibernate verwendet und ehrlich gesagt ist EF eine viel bessere Technologie. Nie ServiceStack verwendet. IMO Mono ist ein viel zu großes Risiko.
MrLane

1
Jeder, der WCF vermisst, sollte sich den Servicestack ansehen. Im Ernst, WCF nicht zu implementieren war eine gute Sache!
unwirklich

54

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.


Nennen Sie mich unwissend, aber müssen Sie ASP.NET überhaupt mit Mono testen? Alles, was .NET wäre, ist serverseitig. Ist es also egal, auf welchem ​​Betriebssystem es angezeigt wird?
Ethan Gunderson

9
Ethan, mit Mono können Sie ASP.net-Apps unter Linux hosten.
Eric Haskins

2
Nicht jeder möchte seine App unter Windows ausführen, aus welchem ​​Grund auch immer.
Bernard

2
@Rich B: Wenn ein Client keine MS-Produkte möchte, ist .NET eindeutig die falsche Wahl.
Kjetil Ødegaard

21
@Kjetil: Mono ist kein MS-Produkt.
GEOCHET

26

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.


1
In nahezu allen Fällen, in denen Java eine native Operation nicht plattformübergreifend ausführen kann, gilt dies auch für .NET
Eli Courtwright,

Schließlich? Mac OS X hat seit 10.0 eine JVM-Implementierung. :)
Mipadi

3
@ Eli - Wahrscheinlich wahr. Die Integration in native Funktionen in .NET / Mono ist sicherlich viel einfacher als in Java. Wenn Sie also nur versuchen, sich gut in die native Plattform zu integrieren, bietet .NET / Mono einen echten Vorteil.
Justin

"Spawning nativer Prozesse und Screen-Scraping der Ergebnisse" Schauder
Basic

Ich würde mit "fast jedem Mainstream-Betriebssystem" streiten, da es weder für Android noch für iOS eine sofort einsatzbereite JVM gibt. Mit den neuen tragbaren Klassenbibliotheken in .NET können Sie kompilierten Code (wenn auch praktisch keinen UI-Code) plattformübergreifend, einschließlich mobiler, gemeinsam nutzen.
Mathieson

18

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.


Einverstanden. Es kommt darauf an, wie gut die virtuellen Maschinen auf verschiedenen Architekturen unterstützt werden.
Allain Lalonde

Einverstanden. Es macht keinen Spaß, eine vollständige Entwicklung durchzuführen, wenn der Kunde sie nicht ausführen kann.
Thorbjørn Ravn Andersen

15

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.


Die Arbeit mit Mono unter "anderem" Linux ist schwierig geworden. Dies spiegelt das Hauptproblem von Mono wider: Die Zukunft von Mono hängt zu stark von der Diktatur von Miguel de Icaza ab. Beispiel: Die schwindende Unterstützung für "other ... (nicht unterstützt)" [ mono-project.com/Other_Downloads] Linux scheint ( IMHO ) mit Miguel de Icazas Desillusionierung von Linux zu korrelieren ( tirania.org/blog/archive/). 2013 / Mar-05.html ). Java leidet nicht unter diesem Diktaturproblem. C # kann auf mehr Plattformen ausgeführt werden, dies bringt jedoch mehr Kosten, Risiken, Kompromisse und Abhängigkeit von Herrn de Icaza mit sich. Nein Danke.
StartupGuy

@ Michael.M Also möchtest du lieber nach Lust und Laune von Oracle sein?
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen: Falsch. Lassen Sie es mich so einfach wie möglich aufschlüsseln : .Net -> MSFT- Plattform (stabiles erfolgreiches Unternehmen; begrenztes, aber ordentliches Ökosystem); Mono -> De Icaza- Framework (el dictador; nicht heiß für Linux und es zeigt: [ Kultofmac.com/218632/… - versuchen Sie, Mono auf Centos 6.4 zu installieren, es ist ein "nicht unterstützter" Albtraum); Java ist eine Spezifikation , die zur Gemeinde gehört und hat viele verschiedene Anbieter - Implementierungen (Oracle ist nur ein) [ coderanch.com/t/327542/java/java/...
StartupGuy

@ ThorbjørnRavnAndersen: .. außerdem kann ein großer Java-Community-Sponsor Oracle sogar ausschließen und trotzdem erfolgreich sein und äußerst gut unterstützt werden - Java ist keineswegs nach Lust und Laune von Oracle --- siehe: news.techworld.com/applications/3252787/ … Oracle könnte all seine Java-Beteiligung ablegen und es würde immer noch weiterleben. Welche anderen Anbieter haben eine .Net-Plattform? Wer bietet eine andere Mono-Laufzeit als Xamarin? Java ist das einzige von diesen, das keiner Diktatur unterliegt, und verfügt über echte Community-Kontrolle, Community-Unterstützung und Community-Verwaltung.
StartupGuy

1
@ Michael.M Spezifikation? Zur Gemeinschaft gehören? Ich denke, Sie liegen falsch - ich glaube auch, dass der einzige Grund, warum das OpenJDK-Projekt nach der Übernahme von Sun nicht geschlossen wurde, die GPL war. Java ist in der eisernen Faust von Oracle, einfach weil das TCK nicht frei verfügbar ist und dies erforderlich ist, um eine JVM zu erstellen, die sich wie die Oracle-JVM verhält. Ich habe kein Problem mit Mono oder De Icaza, aber ich denke nicht, dass die Java-Situation viel besser ist. Das einzige alternative JVM-Projekt mit Schwung starb, als IBM die Unterstützung einstellte.
Thorbjørn Ravn Andersen


8

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.


Ich stimme eher zu, dass Mono ein Bürger 2. Klasse ist, aber nicht mit der Schlussfolgerung. Java gibt es schon seit langer Zeit und es gibt viele Probleme mit alten Macken und Speicherverwaltung, ganz zu schweigen davon, dass es fast immer die ausführlichste Art wählt, etwas zu tun. Es ist auch seit Jahren ziemlich stagnierend (die Sprache) und hat erst vor kurzem begonnen, Funktionen zu integrieren, die seit Jahren in .Net enthalten sind. IMHO, es ist eine Wahl zwischen zwei Übeln ... Flakey-Plattform-Unterstützung mit .Net oder einem schwerfälligen Giganten, der sich nur sehr langsam entwickelt und für den man programmieren muss.
Basic

7

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.


3
Nun, das C # ist ISO-standardisiert, daher war die Idee, etwas plattformübergreifendes zu haben. Microsoft wollte keine Implementierungen für andere Plattformen entwickeln, aber es bleibt anderen Parteien überlassen, da die Sprache ein Standard ist. Das .Net-Framework ist jedoch eine kompliziertere Geschichte.
Zappan

Mono ist eine gute Implementierung und DotGNU (auch für Mac)
Andrei Rînea

1
zappan: gültiger Punkt auf C # (wusste es nicht), aber .NET ist verdammt groß. Zugegeben, ich habe hier keine persönlichen Erfahrungen.
AlexeyMK

@zappan - aus praktischer Sicht ist es irrelevant, dass C # standardisiert ist (oder dass Mono einen ziemlich guten Klon von C # macht). Bei der Plattformportabilität geht es um die gesamte Plattform (einschließlich Bibliotheken und Tool-Ökosystem), nicht nur um die Sprache selbst. In diesem Sinne ist .Net definitiv nicht vollständig plattformübergreifend.
Mikera

7

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.


Desktop ist nicht gleichbedeutend mit Windows, obwohl es den größten Teil des Desktop-Speicherplatzes ausmacht.
ZOXIS

6

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).


OS X 10.6 hat die Sun Java 6-Version jetzt vollständig eingeholt.
Thorbjørn Ravn Andersen

5

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.


4

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.


Ja, ich liebe Python und es hat Django, das ich für Web-Apps mag, aber es gab einige Dinge, die es inakzeptabel machten, das wichtigste war die GIL in der Standard-C-Implementierung des Interpreters. Ich habe eine Reihe von Vorgängen, die stark vom parallelen Rechnen auf Multicore-Computern profitieren, und ich müsste Prozesse erzeugen, um dies in cPython zu tun.
Hanno Fietz

3

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.


Ich bin damit einverstanden, dass das Aufrufen von plattformspezifischem Code aus .NET / Mono sehr einfach ist, solange er aus C aufgerufen werden kann. Mit CXXI ​​(ausgesprochen sexy) wird es zum Kinderspiel, auch C ++ - Code aufzurufen. tirania.org/blog/archive/2011/Dec-19.html
Justin

2

Gatorhall, haben Sie einige Daten, um das zu sichern ?

Performance. Java und .Net weisen aufgrund der virtuellen Maschine ein ähnliches Leistungsniveau auf, aber JVM weist aufgrund jahrelanger Optimierung normalerweise eine bessere Leistung auf.

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.


Es gibt noch eine andere Frage , die helfen kann, und natürlich gibt es das Sprach-Shoot-out . Die JVM ist möglicherweise stärker optimiert, befindet sich jedoch in der Nähe (insbesondere unter Windows). Benchmarks für ASP.NET gegenüber J2EE oder JSP sind noch verdächtiger, aber ich habe keine Probleme damit zu glauben, dass ASP.NET viel schneller ist, selbst wenn die Laufzeiten gleich sind.
Justin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.