Est-ce que .NET / Mono ou Java est le meilleur choix pour le développement multiplateforme? [fermé]

StackOverflow https://stackoverflow.com/questions/61559

Question

Combien y a-t-il moins de bibliothèques pour Mono que pour Java?

Je manque d’aperçu des deux alternatives, mais j’ai assez de liberté de choix pour mon prochain projet. Je recherche des faits techniques difficiles dans les domaines de

  • performances (par exemple, on me dit que Java est bon pour le threading, et j'entends dire que l'optimisation du code d'exécution est devenue très bonne récemment pour .NET)
  • portabilité dans le monde réel (les deux sont conçus pour être portables, que signifie Catch-22 pour chacun?)
  • disponibilité de l'outil ( CI , automatisation de la construction, débogage, IDE)

Je recherche particulièrement ce que vous avez réellement expérimenté dans votre propre travail plutôt que ce que je pourrais rechercher sur Google. Mon application serait un service d'arrière-plan traitant de grandes quantités de données à partir de séries chronologiques.

Ma principale plateforme cible serait Linux.

Modifier: Pour formuler ma question plus correctement, je suis intéressé par l'ensemble du package (bibliothèques tierces, etc.), et pas seulement par la langue. Pour les bibliothèques, cela revient probablement à la question "combien y a-t-il moins de bibliothèques pour Mono que pour Java"?

Pour info, j'ai choisi Java pour ce projet depuis, car il me semblait que la portabilité était encore plus fatiguée et que cela faisait déjà longtemps sur des systèmes plus anciens. Je suis un peu un peu triste à ce sujet, parce que je suis très curieux à propos de C # et j'aimerais avoir fait un gros projet, mais peut-être la prochaine fois. Merci pour tous les conseils.

Était-ce utile?

La solution

Eh bien ... Java est en réalité plus portable. Mono n'est pas implémenté partout, et il est nettement en retard par rapport à Microsoft. Le SDK Java semble rester mieux synchronisé sur toutes les plates-formes (et fonctionne sur davantage de plates-formes).

Je dirais également que Java offre une plus grande disponibilité des outils sur toutes ces plates-formes, bien que de nombreux outils soient disponibles pour .NET sur les plates-formes Windows.

Mise à jour pour 2014

Je maintiens toujours cet avis en 2014. Toutefois, je nuancerai ceci en disant que je commence tout juste à faire attention à Mono après un long moment d'inquiétude. Il pourrait donc y avoir des améliorations dans l'exécution de Mono. (ou écosystème) que je n'ai pas été mis au courant. Autant que je sache, WPF, WCF, WF et WIF ne sont toujours pas pris en charge. Mono peut fonctionner sur iOS, mais à ma connaissance, le runtime Java fonctionne toujours sur beaucoup plus de plates-formes que Mono. En outre, Mono commence à voir des outils nettement améliorés (Xamarin), et Microsoft semble avoir une attitude beaucoup plus transversale et une volonté de travailler avec des partenaires pour les rendre complémentaires plutôt que compétitifs (par exemple, Mono une partie très importante du paysage ASP.NET OWIN / Helios à venir). Je pense que, dans les années à venir, les différences de portabilité s’atténueront rapidement, en particulier après que .NET est devenu un logiciel à source ouverte.

Mise à jour pour 2018

Mon opinion à ce sujet commence à aller dans l'autre sens. Je pense que .NET en général, en particulier avec .NET Core, a commencé à atteindre la "parité de portabilité". avec Java. Des efforts sont en cours pour amener WPF vers .NET Core pour certaines plates-formes, et .NET Core lui-même fonctionne désormais sur de très nombreuses plates-formes. Mono (propriété de Xamarin, qui appartient maintenant à Microsoft) est un produit plus abouti et perfectionné que jamais, et les applications d'écriture fonctionnant sur de multiples plates-formes ne sont plus le domaine de la gnose profonde du hackery .NET, mais une tâche relativement simple. . Il existe bien sûr des bibliothèques, des services et des applications qui ne concernent que Windows ou ne peuvent cibler que des plates-formes spécifiques - mais on peut en dire autant de Java (au sens large).

Si j’étais à la place du PO à ce stade, je ne peux penser à aucune raison inhérente aux langages ou aux piles de technologies eux-mêmes qui m’empêcherait de choisir .NET pour toute application à partir de ce moment.

Autres conseils

Mono parvient mieux à cibler les plates-formes que je souhaite prendre en charge. À part cela, tout est subjectif.

Je partage le code C # sur les plates-formes suivantes: - iOS (iPhone / iPad) - Android - Le Web (HTML5) - Mac OS X) - Linux - Windows

Je pourrais partager encore plus de lieux: - Windows Phone 7 - Wii - XBox - PS3 - etc.

Le gros problème est iOS, car MonoTouch fonctionne à merveille. Je ne connais aucun bon moyen de cibler iOS avec Java. Vous ne pouvez pas cibler Windows Phone 7 avec Java, je dirais donc que les jours où Java était préférable pour les téléphones mobiles sont derrière nous.

Cependant, le facteur le plus important pour moi est la productivité personnelle (et le bonheur). C # comme langage a des années d’avance sur Java IMHO et le framework .NET est un plaisir à utiliser. La plupart des éléments ajoutés dans Java 7 et Java 8 sont en C # depuis des années. Les langages JVM tels que Scala et Clojure (tous deux disponibles sur le CLR) sont plutôt sympas.

Je considère Mono comme une plate-forme à part entière (une excellente) et considère .NET comme la mise en œuvre Microsoft de Mono sous Windows. Cela signifie que je développe et teste d'abord sur Mono. Cela fonctionne à merveille.

Si Java et .NET (Mono, par exemple) étaient des projets Open Source sans aucun support d'entreprise, je choisirais Mono plutôt que Java à chaque fois. Je crois que c'est juste une meilleure plate-forme.

.NET / Mono et la machine virtuelle Java sont d'excellents choix, bien que j'utiliserais personnellement un autre langage que Java sur la machine virtuelle.

Mon point de vue sur certains des autres commentaires:

Problème: performances.

** Réponse: La JVM et le CLR fonctionnent mieux que ne le prétendent leurs détracteurs. Je dirais que la JVM fonctionne mieux. Mono est généralement plus lent que .NET (bien que pas toujours).

Personnellement, je prendrais ASP.NET MVC sur J2EE tous les jours en tant que développeur et utilisateur final. La prise en charge de Google Native Client est également très intéressante. De plus, je sais que les mauvaises performances de l'interface graphique pour les applications Java de bureau sont censées appartenir au passé, mais je continue à en trouver de lentes. Là encore, je pourrais dire la même chose pour WPF. GTK # est très rapide, donc il n’ya aucune raison qu’ils soient lents.

Problème: Java dispose d'un écosystème plus étendu de bibliothèques.

Réponse: Probablement vrai, mais il n’ya pas de problème dans la pratique.

Pratiquement toutes les bibliothèques Java (y compris le JDK) fonctionnent sans problème sur .NET / Mono grâce à IKVM.NET . Cette technologie est une vraie merveille. L'intégration est incroyable. vous pouvez utiliser une bibliothèque Java comme si elle était native. Je n'ai cependant eu à utiliser que des bibliothèques Java dans une application .NET. L’écosystème .NET / Mono offre généralement plus que ce dont j'ai besoin.

Problème: Java supporte mieux les outils (plus larges)

Réponse: pas sous Windows. Sinon je suis d'accord. MonoDevelop est agréable cependant.

Je souhaite saluer MonoDevelop ; c'est un bijou. MonoDevelop intègre la plupart des outils que je souhaite utiliser, notamment l’achèvement du code (intellisense), l’intégration Git / Subversion, la prise en charge des tests unitaires, l’intégration SQL, le débogage, le refactoring facile et la navigation par assemblage avec décompilation à la volée. Il est merveilleux d’utiliser le même environnement pour tout, des applications Web côté serveur aux applications mobiles.

Problème: compatibilité entre plates-formes.

Réponse: Mono est une base de code unique pour toutes les plateformes, y compris Windows.

Développez d’abord pour Mono et déployez-le sur .NET sous Windows si vous le souhaitez. Si vous comparez .NET de MS à Java, Java a l'avantage en termes de cohérence sur toutes les plateformes. Voir la réponse suivante ...

Problème: Mono est à la traîne .NET.

Réponse: Non, pas du tout. À mon humble avis, il s’agit là d’une déclaration souvent formulée mais incorrecte.

La distribution Mono de Xamarin est livrée avec C #, VB.NET, F #, IronPython, IronRuby et je pense que Boo est peut-être une solution originale. Le compilateur Mono C # est complètement à jour avec MS. Le compilateur Mono VB.NET retarde la version MS. Les autres compilateurs sont les mêmes sur les deux plates-formes (tout comme d’autres langages .NET comme Nemerle, Boo et Phalanger (PHP)).

Mono est livré avec une grande partie du code écrit réel de Microsoft, y compris le DLR (Dynamic Language Runtime), le MEF (Managed Extensibility Framework), F # et ASP.NET MVC. Étant donné que Razor n’est pas un logiciel Open Source, Mono est actuellement livré avec MVC2, mais MVC3 fonctionne parfaitement avec Mono.

La plate-forme principale Mono a suivi le rythme de .NET depuis de nombreuses années et la compatibilité est impressionnante. Vous pouvez utiliser la totalité du langage C # 4.0 et même certaines fonctionnalités de C # 5.0 aujourd'hui. En fait, Mono est souvent en tête du .NET à bien des égards.

Mono implémente des parties de la spécification CLR que même Microsoft ne prend pas en charge (comme les tableaux 64 bits). Rosylyn est l’un des éléments technologiques les plus intéressants du monde .NET. Mono propose le compilateur C # en tant que service depuis de nombreuses années. Une partie de l'offre de Rosylyn est également disponible via NRefractory . Les instructions SIMD visant à accélérer les performances de jeu sont un exemple de ce que Mono est toujours devant.

Microsoft propose, outre le .NET, un certain nombre de produits qui ne sont pas disponibles dans Mono. C’est de là que vient l’idée fausse concernant le retard de Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) sont des exemples de produits qui ne fonctionnent pas ou sont mal pris en charge sur Mono. La solution évidente consiste à utiliser à la place des alternatives multiplates-formes telles que GTK #, NHibernate et ServiceStack.

Problème: Microsoft est méchant.

Réponse: vrai. Alors quoi.

De nombreuses personnes proposent les raisons suivantes pour éviter d'utiliser Mono:

1) Vous ne devez pas utiliser Mono, car il faut éviter les technologies Microsoft

.

2) Mono est nul car il ne vous permet pas d'utiliser toutes les technologies proposées par Microsoft

Pour moi, il est clair que ces déclarations sont incompatibles. Je rejette la première déclaration, mais je vais sauter cet argument ici. La deuxième déclaration est vraie pour toutes les alternatives .NET.

La machine virtuelle Java est une excellente plate-forme et l'explosion des langages de la machine virtuelle Java est impressionnante. Utilisez ce qui vous rend heureux. Pour le moment, c’est souvent .NET / Mono pour moi.

Je développe actuellement en .NET et exécute tous mes tests d'abord sur Mono, puis sur Windows. De cette façon, je sais que mes applications sont multi-plateformes. Je l'ai fait avec beaucoup de succès sur les applications ASP.NET et Winforms.

Je ne sais pas vraiment où certaines personnes ont l’impression que Mono est si horrible, mais il a certainement fait son travail dans mes cas et mes opinions.Il est vrai que vous aurez un peu de retard pour les dernières et plus grandes inventions de Le monde .NET, mais jusqu'à présent, .NET 2.0 sous Windows et Linux est très solide pour moi.

N'oubliez pas qu'il existe évidemment de nombreuses bizarreries à cet égard, mais la plupart d'entre elles proviennent du fait que vous écrivez du code portable. Bien que les frameworks fassent un excellent travail pour résumer le système d'exploitation sur lequel vous travaillez, de petites choses comme la sensibilité à la casse de Linux dans les chemins et les noms de fichiers demandent un peu de temps pour s'y habituer, tout comme les choses comme les autorisations.

.NET est définitivement très multi-plateforme grâce à Mono, basé sur mes expériences jusqu'à présent.

Java est aussi multi-plateforme que tout le monde le dit. Il existe une implémentation JVM pour presque tous les systèmes d’exploitation traditionnels (même Mac OS X, enfin), et ils fonctionnent tous très bien. Et il existe des tonnes d'outils open source qui sont tout aussi multi-plateformes.

La seule difficulté est que certaines opérations natives ne peuvent pas être exécutées en Java sans écrire des DLL ou des SO. Il est très rare que ceux-ci apparaissent dans la pratique. Dans tous ces cas, cependant, j’ai pu contourner le problème en créant des processus natifs et en analysant les résultats.

Je pense que la question est mal formulée. C # vs. Java est beaucoup moins intéressant en termes d’utilisation multi-plateforme que (a) les plateformes que vous devez prendre en charge, et (b) en considérant les bibliothèques principales et les bibliothèques tierces disponibles. La langue est presque la partie la moins importante du processus décisionnel.

Java est un meilleur choix pour le développement multiplate-forme.

  • Performance. Java et .Net ont des niveaux de performances similaires en raison de la machine virtuelle, mais JVM a normalement de meilleures performances en raison de l'optimisation d'années en années.

  • Bibliothèque. Bien que cela dépende de votre tâche, Java dispose de beaucoup plus de bibliothèques open source ou tierces. Pour les applications serveur, J2EE, Spring, Struts, etc. Pour l'interface graphique, bien que .Net fournisse une API de couche Win32, mais cela entraîne des problèmes de compatibilité. Java a Swing, SWT, AWT, etc. Cela fonctionne dans la plupart des cas.

  • Compatibilité. Telles sont les questions clés à prendre en compte lors de l’élaboration du programme multiplate-forme. Deux problèmes: premièrement, la compatibilité de la plate-forme. Java gagne toujours puisque JDK est bien maintenu par la société unique et originale Sun. Mono n’est pas mis à jour par MS, vous n’avez donc aucune garantie quant à la compatibilité des mises à jour. 2. Compatibilité descendante. Sun maintient une bonne réputation en ce qui concerne la compatibilité avec les versions antérieures, bien que cela semble parfois trop rigide et ralentit le rythme.

  • Outils. Java a de bons IDE multi-plateformes. Netbeans, Eclipse, etc. La plupart d'entre eux sont gratuits. VS Studio est bon, mais uniquement sous Windows, et ne coûte pas un peu. Les deux offrent de bons tests unitaires, débogages, profils, etc.

Par conséquent, je dirais que Java est un meilleur choix. En guise de vitrine, il existe quelques applications inter-plates-formes de bureau célèbres développées par Java: Vuze, Limewire, BlogBridge, CrossFTP, sans oublier ces IDE. En ce qui concerne .Net, mes connaissances sur ces applications à succès sont limitées.

Je pose la même question tardivement et à mon humble avis, .NET / Mono semble être une meilleure option tout simplement parce que Mono a fait ses preuves en matière d'applications de bureau multiplates-formes (contrairement à Java) et, bien sûr, Mono s'améliore à pas de géant ces jours-ci.

Je vais aussi dire Java. En termes de maturité, Sun (entre autres) a consacré beaucoup plus de temps et d’efforts à faire en sorte que la JVM fonctionne sur des plates-formes autres que Windows.

En revanche, Mono est définitivement un citoyen de seconde classe dans l’écosystème .NET.

En fonction de vos clients cibles, vous constaterez peut-être également que l'utilisation de Mono est un problème majeur. Novell offre-t-il le même type de support fournisseur pour Mono que celui que vous obtiendriez pour Java ou .NET sous Windows?

Si vous visiez principalement l'hébergement de votre service sous Windows, il serait logique d'envisager ce choix, mais comme vous ciblez principalement Linux, cela me semble être une évidence.

Java a été conçu pour être multi-plateforme. C # /. Net n'était pas. En cas de doute, utilisez l’outil conçu à cet effet.

EDIT: en toute justice, .NET a été conçu pour fonctionner sur des environnements embarqués / PC / Serveur, il s’agit donc d’un SORT multi-plateforme. Mais cela n’a pas été conçu pour Linux.

Je pense que la réponse est "cela dépend". Java fonctionne sur à peu près n'importe quoi, mais .NET / Mono est (IMHO) un meilleur framework pour le bureau. Donc, je suppose que la réponse dépend vraiment des plateformes sur lesquelles vous prévoyez de cibler.

Pour ajouter un peu plus à la conversation, Java est plus portable si vous avez encore une version en retard. Java 5 possède encore de nombreuses fonctionnalités excellentes. Vous pouvez donc attendre Java 6 tout en conservant une grande étendue en termes de langage et de fonctionnalités. bibliothèques à développer avec. Le Mac est la principale plate-forme qui peut prendre un certain temps pour rattraper la dernière version de Java.

Java possède également un excellent organisme de normalisation qui optimise intelligemment la plate-forme grâce aux informations fournies par de nombreuses entreprises différentes. Cette fonctionnalité est souvent négligée, mais elle permet même aux nouvelles fonctionnalités de fonctionner correctement sur plusieurs plates-formes et offre de nombreuses possibilités de prise en charge des bibliothèques pour certaines tâches ésotériques (en tant qu'extensions facultatives).

Je voterais pour que Java soit plus portable que C #. Java possède également un ensemble très riche de bibliothèques standard. Il existe également un large éventail de bibliothèques tierces open source, telles que celles fournies par le projet Jakarta ( http: // jakarta .apache.org / ).

Tous les suspects habituels existent également pour les CI, les tests unitaires, etc. La prise en charge inter-plates-formes IDE est également très utile, notamment avec Eclipse, Netbeans, IntelliJ IDEA, etc.

Il existe aussi d'autres choix de langue. Je suis devenu un passionné de Python, qui fonctionne bien sous Windows, Linux et Mac, et qui possède un riche ensemble de bibliothèques.

Alors que Mono a sa part de problèmes , je pense que c'est le cas un meilleur récit de compatibilité entre plates-formes, en particulier SI vous vous fiez à l'invocation de plate-forme native.

Il n'y a pas assez de mots sur Stack Overflow pour souligner à quel point il est plus facile d'obtenir quelque chose de natif appelé et exécuté dans .NET / Mono sur (du moins dans mon expérience 3 ...) de multiples plates-formes par rapport à l'effort de Java équivalent. .

Gatorhall avez-vous des données à sauvegarder?

  

Performance. Java et .Net ont un niveau de performance similaire en raison de la machine virtuelle, mais JVM a normalement de meilleures performances en raison de l'optimisation d'années en années.

Arrière-plan: Je suis un gars sous Windows depuis Windows 3.1 et je suis un utilisateur de Linux (qui exécute encore Windows 7, un excellent système d’exploitation, sur un ordinateur virtuel pour Visual Studio 2010 et d’autres outils).

Le problème: beaucoup d’utilisateurs (windows, linux, etc.) et moi-même ne sommes peut-être pas d’accord avec vous. Java a tendance à fonctionner plus lentement, même sur une application de bureau Linux, ASP.NET est plus rapide que les pages de serveur java souvent. Certains peuvent convenir que même PHP non compilé fonctionne mieux dans plusieurs scénarios.

Java est plus multi-plateforme? Je n’ai aucun doute à ce sujet (l’histoire revient à ce sujet), mais plus rapide (ne dis pas que .NET n’est pas certain) et j’aimerais voir de véritables points de repère.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top