Quanto menos bibliotecas existem para Mono do que para Java?
Não tenho uma visão geral de ambas as alternativas, mas tenho bastante liberdade de escolha para meu próximo projeto. Estou procurando fatos técnicos concretos nas áreas de
- desempenho (por exemplo, ouvi que o Java é bom para encadeamento e ouvi que a otimização do código em tempo de execução se tornou muito boa recentemente para .NET)
- portabilidade no mundo real (ambos devem ser portáteis, o que é Catch-22 para cada um?)
- disponibilidade da ferramenta ( CI , automação de compilação, depuração, IDE)
Estou especialmente procurando o que você realmente experimentou em seu próprio trabalho, em vez das coisas que eu poderia pesquisar no Google. Meu aplicativo seria um serviço de back-end que processa grandes quantidades de dados de séries temporais.
Minha plataforma de destino principal seria o Linux.
Edit: Para expressar minha pergunta de forma mais adequada, estou interessado em todo o pacote (bibliotecas de terceiros, etc.), não apenas no idioma. Para bibliotecas, isso provavelmente se resume à questão "quanto menos bibliotecas existem para Mono do que para Java"?
Para sua informação, escolhi Java para este projeto, porque parecia mais desgastado pela batalha no lado da portabilidade e já existe há algum tempo em sistemas mais antigos também. Estou um pouco triste com isso, porque estou muito curioso sobre C # e adoraria ter feito algum grande projeto nele, mas talvez na próxima vez. Obrigado por todos os conselhos.
Respostas:
Bem .... Java é realmente mais portátil. O Mono não é implementado em todos os lugares e fica muito atrás da implementação da Microsoft. O Java SDK parece estar em melhor sincronia entre as plataformas (e funciona em mais plataformas).
Eu também diria que Java tem mais disponibilidade de ferramentas em todas essas plataformas, embora existam muitas ferramentas disponíveis para .NET nas plataformas Windows.
Atualização para 2014
Ainda tenho essa opinião em 2014. No entanto, vou qualificar isso dizendo que só agora estou começando a prestar atenção ao Mono depois de um longo tempo sem me importar realmente, então pode haver melhorias no tempo de execução do Mono (ou ecossistema ) sobre os quais não fui informado. AFAIK, ainda não há suporte para WPF, WCF, WF, ou WIF. O Mono pode ser executado no iOS, mas até onde sei, o Java runtime ainda roda em muito mais plataformas do que o Mono. Além disso, o Mono está começando a ver algumas ferramentas muito melhoradas (Xamarin), e a Microsoft parece ter um tipo de atitude muito mais multiplataforma e disposição de trabalhar com parceiros para torná-los complementares, em vez de competitivos (por exemplo, o Mono será uma parte muito importante do futuro cenário OWIN / Helios ASP.NET). Suspeito que nos próximos anos as diferenças na portabilidade diminuirão rapidamente,
Atualização para 2018
Minha opinião sobre isso está começando a ir para o outro lado. Acho que o .NET, de modo geral, particularmente com o .NET Core, começou a atingir "paridade de portabilidade" com o Java. Existem esforços em andamento para trazer o WPF ao .NET Core para algumas plataformas, e o .NET Core é executado em muitas plataformas agora. Mono (de propriedade da Xamarin, que agora é propriedade da Microsoft) é um produto mais maduro e polido do que nunca, e escrever aplicativos que funcionem em várias plataformas não é mais o domínio da gnose profunda do hackeamento .NET, mas é um empreendimento relativamente simples . Existem, é claro, bibliotecas, serviços e aplicativos que são somente para Windows ou podem ter como alvo plataformas específicas - mas o mesmo pode ser dito de Java (amplamente).
Se eu estivesse no lugar do OP neste ponto, não consigo pensar em nenhuma razão inerente às linguagens ou pilhas de tecnologia em si que me impediria de escolher o .NET para qualquer aplicativo daqui para frente.
fonte
O Mono faz um trabalho melhor ao direcionar as plataformas que desejo oferecer suporte. Fora isso, é tudo subjetivo.
Compartilho o código C # nas seguintes plataformas: - iOS (iPhone / iPad) - Android - A Web (HTML5) - Mac (OS X) - Linux - Windows
Eu poderia compartilhar ainda mais lugares: - Windows Phone 7 - Wii - XBox - PS3 - etc.
O mais importante é o iOS, já que o MonoTouch funciona de maneira fantástica. Não conheço nenhuma boa maneira de direcionar o iOS com Java. Você não pode direcionar o Windows Phone 7 com Java, então eu diria que os dias em que o Java era melhor para dispositivos móveis já passou.
O maior fator para mim é a produtividade pessoal (e felicidade). C # como linguagem está anos à frente do Java IMHO e o .NET framework é uma alegria de usar. A maior parte do que está sendo adicionado no Java 7 e Java 8 está em C # há anos. Linguagens JVM como Scala e Clojure (ambas disponíveis no CLR) são muito boas.
Vejo o Mono como uma plataforma por si só (uma ótima) e trato o .NET como a implementação do Mono da Microsoft no Windows. Isso significa que eu desenvolvo e testo no Mono primeiro. Isso funciona maravilhosamente bem.
Se Java e .NET (Mono, digamos) fossem projetos de código aberto sem nenhum apoio corporativo, eu sempre escolheria Mono em vez de Java. Eu acredito que é apenas uma plataforma melhor.
.NET / Mono e JVM são ótimas escolhas, embora eu pessoalmente usasse alguma outra linguagem que não Java na JVM.
Minha opinião sobre alguns dos outros comentários:
Questão: Desempenho.
** Resposta: Tanto o JVM quanto o CLR têm um desempenho melhor do que os detratores dizem. Eu diria que o JVM tem melhor desempenho. Mono é geralmente mais lento do que .NET (embora nem sempre).
Eu pessoalmente escolheria ASP.NET MVC em vez de J2EE qualquer dia, tanto como desenvolvedor quanto como usuário final. O suporte para o cliente nativo do Google também é muito bom. Além disso, sei que o baixo desempenho da GUI para aplicativos Java de desktop deve ser uma coisa do passado, mas continuo encontrando alguns lentos. Então, novamente, eu poderia dizer o mesmo para WPF. GTK # é muito rápido, então não há razão para que sejam lentos.
Problema: Java tem um ecossistema maior de bibliotecas disponíveis.
Resposta: Provavelmente verdade, mas não é um problema na prática.
Praticamente todas as bibliotecas Java (incluindo o JDK) funcionam perfeitamente em .NET / Mono graças ao IKVM.NET . Esta tecnologia é uma verdadeira maravilha. A integração é incrível; você pode usar uma biblioteca Java como se fosse nativa. No entanto, só precisei usar bibliotecas Java em um aplicativo .NET. O ecossistema .NET / Mono geralmente oferece mais do que eu preciso.
Problema: Java tem um suporte melhor (mais amplo) a ferramentas
Resposta: Não no Windows. Caso contrário, eu concordo. MonoDevelop é bom.
Quero agradecer ao MonoDevelop ; é uma joia. O MonoDevelop integra a maioria das ferramentas que desejo usar, incluindo autocompletar código (intellisense), integração Git / Subversion, suporte para testes de unidade, integração SQL, depuração, refatoração fácil e navegação de montagem com descompilação instantânea. É maravilhoso usar o mesmo ambiente para tudo, desde a web do lado do servidor até aplicativos móveis.
Problema: compatibilidade entre plataformas.
Resposta: Mono é uma única base de código em todas as plataformas, incluindo Windows.
Desenvolva primeiro para Mono e implante em .NET no Windows, se desejar. Se você comparar o .NET do MS ao Java, então o Java tem a vantagem em termos de consistência entre plataformas. Veja a próxima resposta ...
Problema: Mono lags .NET.
Resposta: Não, não. IMHO, esta é uma afirmação frequentemente afirmada, mas incorreta.
A distribuição Mono do Xamarin vem com C #, VB.NET, F #, IronPython, IronRuby e acho que talvez Boo fora da caixa. O compilador Mono C # está totalmente atualizado com o MS. O compilador Mono VB.NET atrasa a versão MS. Os outros compiladores são iguais em ambas as plataformas (assim como outras linguagens .NET como Nemerle, Boo e Phalanger (PHP)).
O Mono vem com muito do código real escrito pela Microsoft, incluindo o Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # e ASP.NET MVC. Como o Razor não é Open Source, o Mono atualmente vem com o MVC2, mas o MVC3 funciona perfeitamente no Mono.
A plataforma Mono central acompanhou o ritmo do .NET por muitos anos e a compatibilidade é impressionante. Você pode usar a linguagem C # 4.0 completa e até mesmo alguns recursos do C # 5.0 hoje. Na verdade, o Mono costuma liderar o .NET de várias maneiras.
Mono implementa partes da especificação CLR que nem mesmo a Microsoft oferece suporte (como matrizes de 64 bits). Uma das novas tecnologias mais interessantes do mundo .NET é Rosylyn . Mono oferece o compilador C # como um serviço há muitos anos. Algumas das ofertas de Rosylyn também estão disponíveis via NRefractory . Um exemplo de onde o Mono ainda está à frente seriam as instruções SIMD para acelerar o desempenho dos jogos.
A Microsoft oferece vários produtos além do .NET que não estão disponíveis no Mono, de onde vem o equívoco sobre o atraso do Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) são exemplos de produtos que não funcionam ou têm suporte insuficiente no Mono. A solução óbvia é usar alternativas de plataforma cruzada como GTK #, NHibernate e ServiceStack.
Problema: a Microsoft é má.
Resposta: Verdade. E daí.
Muitas pessoas oferecem os seguintes motivos para evitar o uso do Mono:
1) Você não deve usar Mono porque a tecnologia da Microsoft deve ser evitada
2) Mono é uma merda porque não permite que você use todas as tecnologias que a Microsoft oferece
Para mim, está claro que essas afirmações são incompatíveis. Eu rejeito a primeira afirmação, mas vou pular esse argumento aqui. A segunda afirmação é verdadeira para todas as alternativas .NET.
A JVM é uma ótima plataforma e a explosão de linguagens JVM é incrível. Use o que te faz feliz. Por enquanto, geralmente é .NET / Mono para mim.
fonte
Na verdade, eu desenvolvo em .NET, executo todos os meus testes primeiro no Mono e depois no Windows. Assim, sei que meus aplicativos são multiplataforma. Eu fiz isso com muito sucesso em aplicativos ASP.NET e WinForms.
Não tenho certeza de onde algumas pessoas têm a impressão de que Mono é tão horrível, mas certamente funcionou em meus casos e opiniões. É verdade que você terá um pouco de atraso para as maiores e mais recentes invenções no .NET mundo, mas até agora, .NET 2.0 no Windows e Linux é muito sólido para mim.
Lembre-se de que há muitas peculiaridades nisso, mas a maioria delas vem de ter certeza de que você está escrevendo um código portátil. Embora as estruturas façam um ótimo trabalho em abstrair o sistema operacional em que você está executando, pequenas coisas como a diferenciação de maiúsculas e minúsculas do Linux em caminhos e nomes de arquivos leva um pouco de tempo para se acostumar, assim como coisas como permissões.
.NET é definitivamente muito multiplataforma devido ao Mono com base em minhas experiências até agora.
fonte
Java, na verdade, é tão multiplataforma quanto todo mundo diz que é. Existe uma implementação JVM para praticamente qualquer sistema operacional convencional (até mesmo o Mac OS X, finalmente), e todos eles funcionam muito bem. E há toneladas de ferramentas de código aberto por aí que são igualmente multiplataforma.
O único problema é que existem certas operações nativas que você não pode fazer em Java sem escrever algumas DLLs ou SOs. É muito raro que isso surja na prática. Em todos esses casos, porém, fui capaz de contornar isso gerando processos nativos e raspando a tela dos resultados.
fonte
Acho que a pergunta foi formulada incorretamente. C # vs. Java é muito menos interessante em termos de uso de plataforma cruzada do que (a) quais plataformas você precisa oferecer suporte e (b) considerando as bibliotecas centrais e bibliotecas de terceiros disponíveis. A linguagem é quase a parte menos importante do processo de tomada de decisão.
fonte
Java é a melhor escolha para desenvolvimento de plataforma cruzada.
Atuação. Java e .Net têm nível de desempenho semelhante devido à máquina virtual, mas JVM normalmente tem melhor desempenho devido a anos e anos de otimização.
Biblioteca. Embora isso dependa da sua tarefa, o Java tem muito mais código aberto ou bibliotecas de terceiros disponíveis. Para aplicativo de servidor, J2EE, Spring, Struts, etc. Para GUI, embora .Net forneça API de camada Win32, mas isso causa problemas de compatibilidade. Java tem Swing, SWT, AWT, etc. Funciona na maioria dos casos.
Compatibilidade. Essas são as questões-chave que precisam ser consideradas ao desenvolver o programa de plataforma cruzada. Dois problemas: primeiro, compatibilidade de plataforma. O Java ainda vence, pois o JDK é bem mantido pela empresa Sun única e original. O Mono não é mantido pela MS, então você ainda não tem garantia de compatibilidade de atualização. 2. Compatibilidade com versões anteriores. A Sun mantém uma boa reputação em sua compatibilidade com versões anteriores, embora às vezes isso pareça muito rígido e reduza o ritmo.
Ferramentas. Java tem bons IDEs de plataforma cruzada. Netbeans, Eclipse, etc. A maioria deles é gratuita. O VS Studio é bom, mas apenas no Windows, e não custa um pouco. Ambos fornecem bons testes de unidade, depuração, perfis, etc.
Portanto, sugiro que Java é uma escolha melhor. Como um exemplo, existem alguns aplicativos de plataforma cruzada de desktop famosos desenvolvidos por Java: Vuze, Limewire, BlogBridge, CrossFTP, sem mencionar esses IDEs. Quanto ao .Net, tenho conhecimento limitado sobre esses aplicativos de sucesso.
fonte
Tenho feito a mesma pergunta recentemente e, IMHO, .NET / Mono parece ser uma opção melhor simplesmente porque o Mono tem um ótimo histórico de aplicativos de plataforma cruzada para desktop (ao contrário do Java) e, claro, o Mono é melhorando aos trancos e barrancos nos dias de hoje.
fonte
Vou dizer Java também. Se você olhar para isso em termos de maturidade, muito mais tempo e esforço foram gastos pela Sun (e outros) para fazer a JVM funcionar em plataformas não Windows.
Em contraste, Mono é definitivamente um cidadão de segunda classe no ecossistema .NET.
Dependendo de quem são seus clientes-alvo, você também pode descobrir que há uma resistência real ao uso do Mono - a Novell oferece o mesmo tipo de suporte de fornecedor para o Mono que você obteria para Java ou .NET no Windows?
Se seu objetivo principal era hospedar seu serviço no Windows, faria sentido considerar essa escolha, mas, como seu objetivo principal é o Linux, parece-me meio óbvio.
fonte
Java foi projetado para ser multiplataforma; C # / .Net não era. Em caso de dúvida, use a ferramenta projetada para o seu propósito.
EDIT: para ser justo, o .NET foi projetado para funcionar em ambientes embarcados / PC / Server, de modo que é um tipo de plataforma cruzada. Mas não foi projetado para Linux.
fonte
Acho que a resposta é "depende". Java roda em quase tudo, mas .NET / Mono são (IMHO) uma estrutura melhor para a área de trabalho. Portanto, acho que a resposta realmente depende das plataformas que você planeja almejar.
fonte
Para adicionar um pouco mais à conversa, o Java é mais portátil se você permanecer cerca de uma versão atrás - o Java 5 ainda tem muitos recursos excelentes, então você pode esperar pelo Java 6 e ainda ter muito alcance em termos de linguagem e bibliotecas para desenvolver com. O Mac é a plataforma principal que pode levar algum tempo para se atualizar até a versão mais recente do Java.
Java também tem um excelente corpo de padrões que desenvolve a plataforma de forma inteligente com base em informações de muitas empresas diferentes. Este é um recurso frequentemente esquecido, mas mantém até mesmo os novos recursos funcionando bem em várias plataformas e fornece uma grande variedade de suporte de biblioteca para algumas coisas esotéricas (como extensões opcionais).
fonte
Eu votaria para que Java seja mais portátil do que C #. Java definitivamente também possui um conjunto muito rico de bibliotecas padrão. Também existe um amplo conjunto de bibliotecas de terceiros de código aberto, como as fornecidas pelo projeto Jakarta ( http://jakarta.apache.org/ ).
Todos os suspeitos usuais existem para CI, teste de unidade, etc. também. O suporte IDE de plataforma cruzada também é muito bom com produtos como Eclipse, Netbeans, IntelliJ IDEA etc.
fonte
Existem outras opções de idioma também. Eu gostei bastante do Python, que funciona bem no Windows, Linux e Mac, e tem um rico conjunto de bibliotecas.
fonte
Embora Mono tenha sua cota de problemas , acho que ele tem uma história de compatibilidade entre plataformas melhor, especialmente SE você depender da invocação de plataforma nativa.
Não há palavras suficientes no Stack Overflow para enfatizar o quanto é mais suave ter algo nativo chamado e executado em .NET / Mono em (pelo menos na minha experiência 3 ...) várias plataformas versus o esforço Java equivalente.
fonte
Gatorhall , você tem alguns dados para fazer backup disso?
Histórico: Sou um cara do Windows desde o Windows 3.1 e atualmente um usuário Linux (ainda executando o Windows 7, ótimo sistema operacional, em uma VM para Visual Studio 2010 e outras ferramentas).
O ponto: eu e muitos usuários (windows, linux, etc) eu sei, posso discordar de você. O Java tende a ter um desempenho mais lento, mesmo em um aplicativo de desktop linux; o ASP.NET tem um desempenho mais rápido que as páginas do servidor Java muitas vezes. Alguns podem concordar que mesmo o PHP não compilado tem um desempenho melhor em vários cenários.
Java é mais multiplataforma? Não tenho dúvidas sobre isso (a história volta isso), mas mais rápido (não dizendo que o .NET é) não é tão certo e gostaria de ver alguns benchmarks reais.
fonte