Domanda

Quante meno librerie ci sono per Mono che per Java?

Mi manca la visione d'insieme su entrambe le alternative, ma ho praticamente molta libertà di scelta per il mio prossimo progetto.Sto cercando fatti tecnici concreti nelle aree di

  • prestazioni (ad esempio, mi è stato detto che Java è utile per il threading e ho sentito che l'ottimizzazione del codice runtime è diventata molto buona recentemente per .NET)
  • mondo reale portabilità (entrambi sono pensati per essere portatili, qual è il Catch-22 per ciascuno?)
  • disponibilità degli strumenti (CI, automazione della creazione, debug, IDE)

Cerco soprattutto ciò che hai effettivamente sperimentato nel tuo lavoro piuttosto che le cose che potrei cercare su Google.La mia applicazione sarebbe un servizio back-end che elabora grandi quantità di dati da serie temporali.

La mia piattaforma di destinazione principale sarebbe Linux.

Modificare: Per formulare la mia domanda in modo più adeguato, sono interessato all'intero pacchetto (librerie di terze parti ecc.), non solo alla lingua.Per le librerie, ciò probabilmente si riduce alla domanda "quante meno librerie ci sono per Mono che per Java"?


Per tua informazione, da allora ho scelto Java per questo progetto, perché sembrava semplicemente più logoro dal punto di vista della portabilità ed è in circolazione da un po' anche sui sistemi più vecchi.Sono un po' triste per questo, perché sono molto curioso riguardo al C# e mi piacerebbe aver realizzato qualche grande progetto al suo interno, ma forse la prossima volta.Grazie per tutti i consigli.

È stato utile?

Soluzione

Bene....Java è in realtà più portabile.Mono non è implementato ovunque e presenta un notevole ritardo rispetto all'implementazione di Microsoft.L'SDK Java sembra rimanere meglio sincronizzato su tutte le piattaforme (e funziona su più piattaforme).

Direi anche che Java ha una maggiore disponibilità di strumenti su tutte queste piattaforme, sebbene ci siano molti strumenti disponibili per .NET su piattaforme Windows.

Aggiornamento per il 2014

Nel 2014 sono ancora di questa opinione.Tuttavia, lo qualificherò dicendo che sto iniziando solo ora a prestare una certa attenzione a Mono dopo un lungo periodo in cui non mi importava davvero, quindi potrebbero esserci miglioramenti nel runtime (o nell'ecosistema) di Mono che non sono stati apportati consapevole di.Per quanto ne so, non c'è ancora supporto per WPF, WCF, WF e WIF.Mono può essere eseguito su iOS ma, per quanto ne so, il runtime Java funziona ancora su molte più piattaforme rispetto a Mono.Inoltre, Mono sta iniziando a vedere alcuni strumenti molto migliorati (Xamarin) e Microsoft sembra avere un atteggiamento molto più multipiattaforma e la volontà di lavorare con i partner per renderli complementari, piuttosto che competitivi (ad esempio, Mono sarà una parte piuttosto importante del prossimo panorama OWIN/Helios ASP.NET).Ho il sospetto che nei prossimi anni le differenze in termini di portabilità diminuiranno rapidamente, soprattutto dopo che .NET sarà diventato open source.

Aggiornamento per il 2018

La mia opinione su questo sta iniziando ad andare nella direzione opposta.Penso che .NET, in generale, in particolare con .NET Core, abbia iniziato a raggiungere la "parità di portabilità" con Java.Sono in corso sforzi per portare WPF in .NET Core per alcune piattaforme e .NET Core stesso ora viene eseguito su un gran numero di piattaforme.Mono (di proprietà di Xamarin, che ora è di proprietà di Microsoft) è un prodotto più maturo e raffinato che mai e scrivere applicazioni che funzionino su più piattaforme non è più il dominio della profonda conoscenza dell'hacking .NET, ma è un'impresa relativamente semplice. .Esistono, ovviamente, librerie, servizi e applicazioni solo per Windows o che possono essere destinati solo a piattaforme specifiche, ma lo stesso si può dire di Java (in generale).

Se fossi nei panni dell'OP a questo punto, non riesco a pensare a nessun motivo inerente ai linguaggi o agli stack tecnologici stessi che mi impedirebbe di scegliere .NET per qualsiasi applicazione da questo momento in poi.

Altri suggerimenti

Mono fa un lavoro migliore nel prendere di mira le piattaforme che voglio supportare.A parte questo è tutto soggettivo.

Condivido il codice C# sulle seguenti piattaforme:- iOS (iPhone/iPad) - Android - The Web (HTML5) - Mac (OS X) - Linux - Windows

Potrei condividerlo in ancora più posti:- Windows Phone 7 - Wii - Xbox - PS3 - ecc.

Il problema è iOS da allora MonoTouch funziona in modo fantastico.Non conosco alcun buon modo per indirizzare iOS con Java.Non è possibile scegliere come target Windows Phone 7 con Java, quindi direi che i giorni in cui Java era migliore per i dispositivi mobili sono ormai alle nostre spalle.

Il fattore più importante per me però è la produttività personale (e la felicità).C# come linguaggio è anni avanti rispetto a Java IMHO e il framework .NET è un piacere da usare.La maggior parte di ciò che viene aggiunto in Java 7 e Java 8 è presente in C# da anni.I linguaggi JVM come Scala e Clojure (entrambi disponibili su CLR) sono piuttosto carini.

Vedo Mono come una piattaforma a sé stante (ottima) e considero .NET come l'implementazione Microsoft di Mono su Windows.Ciò significa che sviluppo e provo prima su Mono.Funziona meravigliosamente.

Se sia Java che .NET (diciamo Mono) fossero progetti Open Source senza alcun supporto aziendale, sceglierei ogni volta Mono invece di Java.Credo che sia semplicemente una piattaforma migliore.

Sia .NET/Mono che JVM sono ottime scelte, anche se personalmente utilizzerei un linguaggio diverso da Java sulla JVM.

La mia opinione su alcuni degli altri commenti:

Problema:Prestazione.

**Risposta:Sia la JVM che la CLR ottengono risultati migliori di quanto affermano i detrattori.Direi che la JVM funziona meglio.Mono è generalmente più lento di .NET (anche se non sempre).

Personalmente prenderei ASP.NET MVC su J2EE ogni giorno sia come sviluppatore che come utente finale.Supporto per Client nativo di Google è anche piuttosto bello.Inoltre, so che le scarse prestazioni della GUI per le app Java desktop dovrebbero essere una cosa del passato, ma continuo a trovarne di lente.Poi di nuovo, potrei dire lo stesso per WPF.GTK# è molto veloce, quindi non c'è motivo per cui debbano essere lenti.

Problema:Java ha un ecosistema più ampio di librerie disponibili.

Risposta:Probabilmente è vero, ma nella pratica non è un problema.

Praticamente ogni libreria Java (incluso JDK) funziona perfettamente su .NET/Mono grazie a IKVM.NET.Questo pezzo di tecnologia è una vera meraviglia.L'integrazione è sorprendente;puoi utilizzare una libreria Java proprio come se fosse nativa.Tuttavia, ho dovuto utilizzare solo le librerie Java in un'app .NET.L'ecosistema .NET/Mono generalmente offre più di quello di cui ho bisogno.

Problema:Java offre un supporto migliore (più ampio) per gli strumenti

Risposta:Non su Windows.Altrimenti sono d'accordo.MonoDevelop è carino però.

Voglio ringraziare MonoDevelop;è un gioiello.MonoDevelop integra la maggior parte degli strumenti che desidero utilizzare, incluso il completamento del codice (intellisense), l'integrazione Git/Subversion, il supporto per test unitari, integrazione SQL, debug, refactoring semplice e navigazione in assembly con decompilazione al volo.È meraviglioso utilizzare lo stesso ambiente per qualsiasi cosa, dal Web lato server alle app mobili.

Problema:Compatibilità tra piattaforme.

Risposta:Mono è un'unica base di codice su tutte le piattaforme, incluso Windows.

Sviluppa prima per Mono e distribuiscilo su .NET su Windows, se lo desideri.Se si confronta .NET da MS a Java, Java ha un vantaggio in termini di coerenza tra le piattaforme.Vedi la risposta successiva...

Problema:Mono ritardi .NET.

Risposta:No non lo fa. IMHO, questa è un'affermazione spesso affermata ma errata.

La distribuzione Mono di Xamarin viene fornita con C#, VB.NET, F#, IronPython, IronRuby e penso che forse Boo sia pronto all'uso.Il compilatore Mono C# è completamente aggiornato con MS.Il compilatore Mono VB.NET è in ritardo rispetto alla versione MS.Gli altri compilatori sono gli stessi su entrambe le piattaforme (così come altri linguaggi .NET come Nemerle, Boo e Phalanger (PHP)).

Mono viene fornito con gran parte del codice scritto da Microsoft, tra cui Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F# e ASP.NET MVC.Poiché Razor non è Open Source, Mono attualmente viene fornito con MVC2 ma MVC3 funziona perfettamente su Mono.

La piattaforma principale Mono ha tenuto il passo con .NET per molti anni e la compatibilità è impressionante.Oggi puoi usare il linguaggio C# 4.0 completo e anche alcune funzionalità di C# 5.0.In effetti, Mono spesso guida .NET in molti modi.

Mono implementa parti delle specifiche CLR che nemmeno Microsoft supporta (come gli array a 64 bit).Uno dei nuovi elementi tecnologici più entusiasmanti nel mondo .NET è Rosylyn.Mono offre il compilatore C# come servizio da molti anni.Parte di ciò che Rosylyn offre è disponibile tramite NRefrattario anche.Un esempio di dove Mono è ancora in vantaggio sarebbero le istruzioni SIMD per accelerare le prestazioni di gioco.

Microsoft offre una serie di prodotti su .NET che non sono disponibili in Mono, da cui deriva l'idea sbagliata sul ritardo di Mono.Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) sono esempi di prodotti che non funzionano o sono scarsamente supportati su Mono.La soluzione ovvia è utilizzare invece alternative multipiattaforma come GTK#, NHibernate e ServiceStack.

Problema:Microsoft è malvagia.

Risposta:VERO.E allora.

Molte persone offrono i seguenti motivi per evitare di usare Mono:

1) Non dovresti usare Mono perché la tecnologia Microsoft dovrebbe essere evitata

2) Mono fa schifo perché non ti consente di utilizzare tutte le tecnologie offerte da Microsoft

Per me è chiaro che queste affermazioni sono incompatibili.Respingo la prima affermazione ma salterò qui questo argomento.La seconda affermazione è vera per tutte le alternative .NET.

La JVM è un'ottima piattaforma e l'esplosione dei linguaggi JVM è fantastica.Usa ciò che ti rende felice.Per ora, per me è spesso .NET/Mono.

In realtà sviluppo in .NET, eseguo tutti i test prima su Mono e poi su Windows.In questo modo so che le mie applicazioni sono multipiattaforma.L'ho fatto con molto successo su entrambe le applicazioni ASP.NET e Winforms.

Non sono sicuro da dove alcune persone abbiano l'impressione che Mono sia così orribile, ma sicuramente ha fatto il suo lavoro nei miei casi e opinioni. È vero che avrai un po' di ritardo per le ultime e più grandi invenzioni in .NET mondo, ma finora .NET 2.0 su Windows e Linux è molto solido per me.

Tieni presente che ovviamente ci sono molte stranezze in questo, ma la maggior parte di esse deriva dall'assicurarti di scrivere codice portabile.Sebbene i framework facciano un ottimo lavoro nell'astrarre il sistema operativo su cui si sta eseguendo, piccole cose come la distinzione tra maiuscole e minuscole di Linux nei percorsi e nei nomi dei file richiedono un po' di tempo per abituarsi, così come cose come i permessi.

.NET è sicuramente molto multipiattaforma grazie a Mono in base alle mie esperienze finora.

Java in realtà è multipiattaforma come tutti dicono che sia.Esiste un'implementazione JVM per quasi tutti i sistemi operativi tradizionali (anche Mac OS X, finalmente) e funzionano tutti molto bene.E ci sono tantissimi strumenti open source là fuori che sono altrettanto multipiattaforma.

L'unico problema è che ci sono alcune operazioni native che non puoi eseguire in Java senza scrivere alcune DLL o SO.È molto raro che questi si presentino nella pratica.In tutti questi casi, però, sono riuscito a aggirare il problema generando processi nativi ed eseguendo lo screen-scraping dei risultati.

Penso che la domanda sia formulata in modo errato.C# controJava è molto meno interessante in termini di utilizzo multipiattaforma rispetto a (a) quali piattaforme è necessario supportare e (b) considerando le librerie principali e le librerie di terze parti disponibili.La lingua è quasi la parte meno importante del processo decisionale.

Java è una scelta migliore per lo sviluppo multipiattaforma.

  • Prestazione.Java e .Net hanno un livello di prestazioni simile grazie alla macchina virtuale, ma JVM normalmente ha prestazioni migliori grazie ad anni e anni di ottimizzazione.

  • Biblioteca.Anche se questo dipende dal tuo compito, Java ha molte più librerie open source o di terze parti disponibili lì.Per app server, J2EE, Spring, Struts, ecc.Per la GUI, sebbene .Net fornisca API di livello Win32, ciò causa problemi di compatibilità.Java ha Swing, SWT, AWT, ecc.Funziona nella maggior parte dei casi.

  • Compatibilità.Queste sono le questioni chiave che devono essere prese in considerazione quando si sviluppa il programma multipiattaforma.Due questioni:in primo luogo, la compatibilità della piattaforma.Java vince ancora poiché JDK è ben gestito dall'unica e originale società Sun.Mono non è gestito da MS, quindi non hai ancora alcuna garanzia per la compatibilità degli aggiornamenti.2.Retrocompatibilità.Sun mantiene una buona reputazione per quanto riguarda la compatibilità con le versioni precedenti, anche se a volte questa sembra troppo rigida e rallenta il ritmo.

  • Utensili.Java ha buoni IDE multipiattaforma.Netbeans, Eclipse, ecc.La maggior parte di essi sono gratuiti.VS Studio è buono ma solo su Windows e non costa niente.Entrambi forniscono buoni test unitari, debug, profili, ecc.

Quindi suggerirei che Java sia una scelta migliore.Come esempio, ci sono alcune famose app desktop multipiattaforma sviluppate da Java:Vuze, Limewire, BlogBridge, CrossFTP, per non parlare di questi IDE.Per quanto riguarda .Net, ho una conoscenza limitata di app di questo tipo.

Ho posto la stessa domanda tardi e IMHO, .NET/Mono sembra essere un'opzione migliore semplicemente perché Mono ha un ottimo track record per le applicazioni desktop multipiattaforma (al contrario di Java) e, naturalmente, Mono sta migliorando a passi da gigante in questi giorni.

Dirò anche Java.Se lo guardi in termini di maturità, Sun (e altri) hanno impiegato molto più tempo e sforzi per far funzionare la JVM su piattaforme non Windows.

Al contrario, Mono è sicuramente un cittadino di seconda classe nell'ecosistema .NET.

A seconda di chi sono i tuoi clienti target, potresti anche scoprire che ci sono reali resistenze all'uso di Mono: Novell offre lo stesso tipo di supporto del fornitore per Mono che otterresti per Java o .NET su Windows?

Se ti rivolgessi principalmente all'hosting del tuo servizio su Windows, avrebbe senso prendere in considerazione questa scelta, ma dal momento che ti rivolgi principalmente a Linux, mi sembra un gioco da ragazzi.

Java è stato progettato per essere multipiattaforma;C#/.Net non lo era.In caso di dubbi, utilizza lo strumento progettato per il tuo scopo.

MODIFICARE:in tutta onestà, .NET è stato progettato per funzionare su ambienti embedded/PC/server, quindi è una sorta di multipiattaforma.Ma non è stato progettato per Linux.

Penso che la risposta sia "dipende". Java funziona su qualsiasi cosa, ma .NET/Mono sono (IMHO) un framework migliore per il desktop.Quindi immagino che la risposta dipenda davvero da quali piattaforme prevedi di prendere di mira.

Per aggiungere qualcosa in più alla conversazione, Java è più portabile se rimani indietro di circa una versione: Java 5 ha ancora molte funzionalità eccellenti, quindi puoi aspettare Java 6 e avere ancora molta gamma in termini di linguaggio e librerie da sviluppare con.Il Mac è la piattaforma principale che può richiedere del tempo per aggiornarsi all'ultima versione Java.

Java ha anche un eccellente organismo degli standard che fa crescere in modo intelligente la piattaforma in base al contributo di molte aziende diverse.Questa è una funzionalità spesso trascurata, ma mantiene anche le nuove funzionalità funzionanti su più piattaforme e fornisce un'ampia gamma di supporto della libreria per alcune cose esoteriche (come estensioni opzionali).

Voterei affinché Java sia più portabile di C#.Java ha sicuramente anche un set molto ricco di librerie standard.Esiste anche un'ampia gamma di librerie open source di terze parti, come quelle fornite dal progetto Jakarta (http://jakarta.apache.org/).

Esistono anche tutti i soliti sospetti per CI, test unitari, ecc.Anche il supporto IDE multipiattaforma è molto buono con prodotti come Eclipse, Netbeans, IntelliJ IDEA ecc.

Ci sono anche altre scelte linguistiche.Mi sono appassionato molto a Python, che funziona bene su Windows, Linux e Mac e dispone di un ricco set di librerie.

Mentre Mono ha il suo parte dei problemi Penso che abbia una storia di compatibilità multipiattaforma migliore, soprattutto SE fai affidamento sull'invocazione della piattaforma nativa.

Non ci sono abbastanza parole su Stack Overflow per sottolineare quanto sia più agevole ottenere qualcosa di nativo chiamato ed eseguito in .NET/Mono su (almeno nella mia esperienza 3...) più piattaforme rispetto alo sforzo Java equivalente.

Gatorhall hai qualche dato per confermarlo?

Prestazione.Java e .Net hanno un livello di prestazioni simile grazie alla macchina virtuale, ma JVM normalmente ha prestazioni migliori grazie ad anni e anni di ottimizzazione.

Sfondo:Sono un utente Windows da Windows 3.1 e attualmente un utente Linux (eseguo ancora Windows 7, ottimo sistema operativo, su una macchina virtuale per Visual Studio 2010 e altri strumenti).

Il punto:io e molti utenti (Windows, Linux, ecc.) lo so, potremmo non essere d'accordo con te.Java tende a funzionare più lentamente anche su un'applicazione desktop Linux, ASP.NET è più veloce delle pagine del server Java molte volte.Alcuni potrebbero concordare sul fatto che anche il PHP non compilato funziona meglio in diversi scenari.

Java è più multipiattaforma?Non ho dubbi su questo (la storia lo sostiene), ma più veloce (non dico che .NET lo sia) non è così sicuro e mi piacerebbe vedere dei veri benchmark.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top