Czy .NET / Mono lub Java to lepszy wybór do tworzenia aplikacji na wiele platform? [Zamknięte]

108

O ile mniej bibliotek jest dostępnych dla Mono niż dla Javy?

Brakuje mi przeglądu obu alternatyw, ale mam dużą swobodę wyboru przy następnym projekcie. Szukam twardych faktów technicznych z zakresu

  • wydajność (na przykład powiedziano mi, że Java jest dobra do obsługi wątków i słyszałem, że optymalizacja kodu w czasie wykonywania stała się ostatnio bardzo dobra dla .NET)
  • przenośność w świecie rzeczywistym (oba mają być przenośne, co to jest Catch-22 dla każdego?)
  • dostępność narzędzi ( CI , automatyzacja kompilacji, debugowanie, IDE)

Szczególnie szukam tego, czego faktycznie doświadczyłeś w swojej własnej pracy, a nie rzeczy, które mógłbym znaleźć w Google. Moja aplikacja byłaby usługą zaplecza przetwarzającą duże ilości danych z szeregów czasowych.

Moją główną platformą docelową byłby Linux.

Edycja: Aby lepiej ująć moje pytanie, interesuje mnie cały pakiet (biblioteki stron trzecich itp.), A nie tylko język. W przypadku bibliotek prawdopodobnie sprowadza się to do pytania „o ile mniej bibliotek jest dla Mono niż dla Javy”?


FYI, od tego czasu wybrałem Javę do tego projektu, ponieważ wydawała się po prostu bardziej zmęczona po stronie przenośności i jest już od jakiegoś czasu na starszych systemach. Trochę mi przykro z tego powodu, bo jestem bardzo ciekawa C # i chciałbym zrobić w nim jakiś duży projekt, ale może następnym razem. Dzięki za wszystkie rady.

Hanno Fietz
źródło
3
Świetne pytanie. Przyglądamy się również ocenie pod kątem rozwoju międzyplatformowego.
Mat Nadrofsky
Dodałbym tag „który-język”, ale jest już ich 5, więc nie ma szczęścia.
Daniel Daranas
Silnie zależy od tego, na które platformy celujesz ...
Thorbjørn Ravn Andersen
1
Teraz może być dobry moment, aby spojrzeć na golang ...
StartupGuy
Warto również rozważyć Xojo. Kompiluje natywne aplikacje przy użyciu LLVM dla Windows, Mac Linux. Posiada automatyzację budowania IDE, debugowanie itp. Biblioteka ma wiele funkcji i może być rozszerzana w razie potrzeby. www / xojo.com
Paul Lefebvre

Odpowiedzi:

96

Cóż… Java jest właściwie bardziej przenośna. Mono nie jest wdrażane wszędzie i znacznie opóźnia się w stosunku do implementacji firmy Microsoft. Wydaje się, że Java SDK pozostaje lepiej zsynchronizowana między platformami (i działa na większej liczbie platform).

Powiedziałbym również, że Java ma większą dostępność narzędzi na wszystkich tych platformach, chociaż istnieje wiele narzędzi dostępnych dla .NET na platformach Windows.

Aktualizacja na rok 2014

Nadal podtrzymuję tę opinię w 2014 roku. Jednak zakwalifikuję to, mówiąc, że właśnie teraz zaczynam zwracać uwagę na Mono po dłuższej chwili braku zainteresowania, więc mogą nastąpić ulepszenia w środowisku wykonawczym Mono (lub ekosystemie ), o których nie zostałem poinformowany. AFAIK, nadal nie ma obsługi WPF, WCF, WF, z WIF. Mono może działać na iOS, ale według mojej wiedzy środowisko wykonawcze Java nadal działa na znacznie większej liczbie platform niż Mono. Ponadto Mono zaczyna dostrzegać znacznie ulepszone narzędzia (Xamarin), a Microsoft wydaje się mieć znacznie bardziej wieloplatformowe podejście i chęć współpracy z partnerami, aby uczynić ich komplementarnymi, a nie konkurencyjnymi (na przykład Mono będzie dość ważna część nadchodzącego krajobrazu OWIN / Helios ASP.NET). Podejrzewam, że w najbliższych latach różnice w przenośności szybko się zmniejszą,

Aktualizacja na 2018 rok

Mój pogląd na to zaczyna się odwracać. Myślę, że .NET, szczególnie w przypadku .NET Core, zaczął osiągać „równość przenośności” z Javą. Trwają prace nad przeniesieniem WPF do .NET Core na niektórych platformach, a sam .NET Core działa teraz na wielu platformach. Mono (należący do Xamarin, który jest obecnie własnością firmy Microsoft) jest produktem bardziej dojrzałym i dopracowanym niż kiedykolwiek, a pisanie aplikacji działających na wielu platformach nie jest już domeną głębokiej gnozy hakerów .NET, ale jest stosunkowo prostym przedsięwzięciem . Istnieją oczywiście biblioteki, usługi i aplikacje, które są przeznaczone tylko dla systemu Windows lub mogą być przeznaczone tylko dla określonych platform - ale to samo można powiedzieć o Javie (ogólnie).

Gdybym był w tym momencie na miejscu OP, nie przychodzi mi do głowy żaden powód tkwiący w samych językach lub stosach technologicznych, który uniemożliwiałby mi wybranie platformy .NET do jakiejkolwiek aplikacji, która będzie od tego momentu.

Ben Collins
źródło
2
Naprawdę się cieszę, że to czytam i cieszę się z głosów w świecie Microsoft. .NET jest naprawdę dobry, ale Java ma uzasadnienie, jak zawsze próbowałem tłumaczyć jako programista .NET i stara Java;)
JoeBilly
+1 za to. Uważam, że przenośność Javy (dla nietrywialnych aplikacji, np. Serwerów WWW, złożonych interfejsów GUI, silników analitycznych) jest lepsza niż jakakolwiek inna alternatywa. To nie jest do końca idealne, ale to najlepsze, co możesz teraz uzyskać.
mikera
1
@Ben, czy nadal utrzymujesz tę opinię w 2013 roku? Jeśli tak, czy mógłbyś o tym wspomnieć, a jeśli nie aktualizujesz tej odpowiedzi? Wiele razy czytając odpowiedzi czterolatka trudno powiedzieć.
Benjamin Gruenbaum
1
@BenjaminGruenbaum tak, chociaż w tym miejscu zakwalifikowałbym swoją opinię, mówiąc, że od dłuższego czasu nie zwracałem zbytniej uwagi na Mono, więc mogą być ulepszenia w środowisku wykonawczym Mono (lub ekosystemie), których nie byłem uświadomiony. AFAIK, nadal nie ma obsługi WPF, WCF ani WF. Mono może działać na iOS, ale według mojej wiedzy środowisko wykonawcze Java nadal działa na znacznie większej liczbie platform niż Mono. Więc tak. Kwalifikowany, ale tak.
Ben Collins
@HighCore argument nie jest przeciwko Mono per se. To tylko stwierdzenie faktu: jeśli piszesz kod zależny od WPF, nie możesz używać Mono; ergo w ten sposób jest nie do przenoszenia. Struktury UI Javy mogą być do niczego, ale o ile wiem, będą działać wszędzie tam, gdzie działa Java (a sprzęt obsługuje ten rodzaj interfejsu użytkownika). To nie sprawia, że ​​Java jest lepsza , ale w ten sposób bardziej przenośna.
Ben Collins
112

Mono lepiej radzi sobie z ukierunkowaniem na platformy, które chcę obsługiwać. Poza tym wszystko jest subiektywne.

Udostępniam kod C # na następujących platformach: - iOS (iPhone / iPad) - Android - Internet (HTML5) - Mac (OS X) - Linux - Windows

Mógłbym udostępnić jeszcze więcej miejsc: - Windows Phone 7 - Wii - XBox - PS3 - itd.

Największą zaletą jest iOS, ponieważ MonoTouch działa fantastycznie. Nie znam żadnego dobrego sposobu na kierowanie iOS z Javą. Nie można kierować reklamy na Windows Phone 7 za pomocą Javy, więc powiedziałbym, że czasy, gdy Java była lepsza dla urządzeń mobilnych, już za nami.

Jednak największym czynnikiem jest dla mnie osobista produktywność (i szczęście). C # jako język wyprzedza o lata Java IMHO, a korzystanie z platformy .NET jest przyjemnością. Większość tego, co jest dodawane w językach Java 7 i Java 8, jest od lat w języku C #. Języki JVM, takie jak Scala i Clojure (oba dostępne w CLR) są jednak całkiem przyjemne.

Postrzegam Mono jako platformę samą w sobie (świetną) i traktuję .NET jako implementację Mono firmy Microsoft w systemie Windows. Oznacza to, że najpierw opracowuję i testuję na Mono. To działa cudownie.

Gdyby zarówno Java, jak i .NET (powiedzmy, Mono) były projektami Open Source bez wsparcia korporacyjnego, za każdym razem wybrałbym Mono zamiast Java. Uważam, że to po prostu lepsza platforma.

Zarówno .NET / Mono, jak i JVM to świetny wybór, chociaż osobiście użyłbym innego języka niż Java w JVM.

Moje zdanie na temat niektórych innych komentarzy:

Problem: wydajność.

** Odpowiedź: Zarówno JVM, jak i CLR działają lepiej niż twierdzą krytycy. Powiedziałbym, że JVM działa lepiej. Mono jest generalnie wolniejsze niż .NET (choć nie zawsze).

Osobiście każdego dnia wziąłbym ASP.NET MVC nad J2EE zarówno jako programista, jak i użytkownik końcowy. Wsparcie dla klienta natywnego Google jest całkiem fajna. Wiem też, że słaba wydajność graficznego interfejsu użytkownika w aplikacjach Java na komputery stacjonarne należy już do przeszłości, ale wciąż znajduję powolne. Z drugiej strony mógłbym powiedzieć to samo o WPF. Jednak GTK # jest bardzo szybkie, więc nie ma powodu, żeby były wolne.

Problem: Java ma większy ekosystem dostępnych bibliotek.

Odpowiedź: Prawdopodobnie prawda, ale w praktyce nie jest to problem.

Praktycznie każda biblioteka Java (w tym JDK) działa po prostu elegancko na .NET / Mono dzięki IKVM.NET . Ta technologia to prawdziwy cud. Integracja jest niesamowita; możesz używać biblioteki Java tak, jak była natywna. Musiałem jednak używać tylko bibliotek Java w jednej aplikacji .NET. Ekosystem .NET / Mono zazwyczaj oferuje więcej, niż potrzebuję.

Problem: Java ma lepszą (szerszą) obsługę narzędzi

Odpowiedź: Nie w systemie Windows. W przeciwnym razie zgadzam się. MonoDevelop jest jednak fajny.

Chcę dać okrzyk MonoDevelop ; to jest klejnot. MonoDevelop integruje większość narzędzi, których chcę używać, w tym uzupełnianie kodu (intellisense), integrację z Git / Subversion, obsługę testów jednostkowych, integrację SQL, debugowanie, łatwą refaktoryzację i przeglądanie zestawów z dekompilacją w locie. Wspaniale jest używać tego samego środowiska do wszystkiego, od Internetu po stronie serwera po aplikacje mobilne.

Problem: kompatybilność między różnymi platformami.

Odpowiedź: Mono to jeden kod bazowy na wszystkich platformach, w tym Windows.

Najpierw opracuj dla Mono i wdróż w .NET w systemie Windows, jeśli chcesz. Jeśli porównasz .NET z MS i Javą, Java ma przewagę pod względem spójności między platformami. Zobacz następną odpowiedź ...

Problem: Mono opóźnia .NET.

Odpowiedź: Nie, nie. IMHO, to często podawane, ale błędne stwierdzenie.

Dystrybucja mono z platformy Xamarin jest dostarczana z C #, VB.NET, F #, IronPython, IronRuby i myślę, że może Boo po wyjęciu z pudełka. Kompilator Mono C # jest całkowicie aktualny z MS. Kompilator Mono VB.NET jest opóźniony w stosunku do wersji MS. Pozostałe kompilatory są takie same na obu platformach (podobnie jak inne języki .NET, takie jak Nemerle, Boo i Phalanger (PHP)).

Mono jest dostarczany z dużą ilością rzeczywistego kodu napisanego przez firmę Microsoft, w tym Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # i ASP.NET MVC. Ponieważ Razor nie jest Open Source, Mono jest obecnie dostarczany z MVC2, ale MVC3 działa dobrze na Mono.

Podstawowa platforma Mono dotrzymuje kroku .NET lub od wielu lat, a kompatybilność jest imponująca. Możesz już dziś używać pełnego języka C # 4.0, a nawet niektórych funkcji C # 5.0. W rzeczywistości Mono często przewodzi .NET na wiele sposobów.

Mono implementuje części specyfikacji CLR, których nawet Microsoft nie obsługuje (jak tablice 64-bitowe). Jednym z najbardziej ekscytujących nowych elementów technologii w świecie .NET jest Rosylyn . Mono od wielu lat oferuje kompilator C # jako usługę. Niektóre z tego, co oferuje Rosylyn, są również dostępne za pośrednictwem NRefractory . Przykładem, w którym Mono jest wciąż przed nami, byłyby instrukcje SIMD, aby przyspieszyć wydajność gier.

Microsoft oferuje oprócz .NET wiele produktów, które nie są dostępne w Mono, z czego wynika błędne przekonanie o opóźnieniu Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) to przykłady produktów, które nie działają lub są słabo obsługiwane w trybie mono. Oczywistym rozwiązaniem jest użycie alternatyw międzyplatformowych, takich jak GTK #, NHibernate i ServiceStack.

Problem: Microsoft jest zły.

Odpowiedź: prawda. Więc co.

Wiele osób podaje następujące powody, dla których warto unikać korzystania z Mono:

1) Nie powinieneś używać Mono, ponieważ należy unikać technologii Microsoft

2) Mono jest do bani, ponieważ nie pozwala na użycie wszystkich technologii oferowanych przez Microsoft

Dla mnie jest jasne, że te stwierdzenia są niezgodne. Odrzucam pierwsze stwierdzenie, ale pominę tutaj ten argument. Drugie stwierdzenie dotyczy wszystkich alternatyw .NET.

JVM to świetna platforma, a eksplozja języków JVM jest niesamowita. Korzystaj z tego, co cię uszczęśliwia. Na razie jest to dla mnie często .NET / Mono.

Justin
źródło
3
Dzięki za tak obszerną odpowiedź w późnej fazie gry. Nigdy nie używałem Mono / .Net / C #, ale Twój post wydaje się odzwierciedlać niektóre z nowszych osiągnięć w tym wszechświecie. Na przykład, nie przypominam sobie, żeby MonoTouch było tak znaczące 3,5 roku temu.
Hanno Fietz
3
Jestem zdezorientowany twoją odpowiedzią „Mono nie opóźnia .NET”. Twierdzisz, że to, a następnie podajesz pół tuzina sposobów, w jakie faktycznie opóźnia .NET (Entity Framework itp.). Można śmiało powiedzieć, że nie opóźnia kompilatora C # firmy Microsoft, ale ekosystem .NET jest w najlepszym przypadku fragmentaryczny w Mono. Wydaje się, że jest to w porządku dla twoich celów, ale nie dla wszystkich i istnieje uzasadniona obawa.
samkass
1
@samkass: Myślę, że chodzi o różnicę między „lagami” a „nie implementuje tej biblioteki”. W świecie Javy można znaleźć to analogiczne do Androida, który nie implementuje biblioteki Swing. Należy również pamiętać, że podano odpowiedniki między platformami (i przy okazji open source). Używam Mono codziennie i „w najlepszym razie fragmentaryczne” zdecydowanie nie było moim doświadczeniem.
konrad.kruczynski
9
Brak pełnej i niezawodnej obsługi WCF i EF oraz brak WPF jest zabójcą dla Mono dla prawie wszystkiego, nad czym pracowałem od .NET 3.0. Tak, istnieją alternatywy, ale ogromną część mocy .NET stanowią te dodatkowe frameworki. Bez tego nie sądzę, aby w ogóle można było wywołać Mono kompatybilne z .NET. W najlepszym przypadku jest to implementacja częściowa. Użyłem również NHibernate i szczerze mówiąc EF to o wiele lepsza technologia. Nigdy nie używany ServiceStack. IMO Mono jest zbyt dużym ryzykiem.
MrLane
1
każdy, kto tęskni za WCF, powinien rzucić okiem na servicestack. poważnie, brak implementacji WCF był dobrą rzeczą!
nierealne
54

Właściwie rozwijam się w .NET, uruchamiam wszystkie testy najpierw na Mono, a potem na Windowsie. Dzięki temu wiem, że moje aplikacje są wieloplatformowe. Zrobiłem to bardzo pomyślnie zarówno w aplikacjach ASP.NET, jak i Winforms.

Nie jestem pewien, skąd niektórzy ludzie odnoszą wrażenie, że Mono jest tak okropne, ale z pewnością spełniło swoje zadanie w moich przypadkach i opiniach. To prawda, że ​​będziesz miał trochę opóźnienia z najnowszymi i największymi wynalazkami w .NET świat, ale jak dotąd .NET 2.0 na Windows i Linux jest dla mnie bardzo solidny.

Pamiętaj, że jest w tym oczywiście wiele dziwactw, ale większość z nich wynika z upewnienia się, że piszesz przenośny kod. Podczas gdy frameworki wykonują świetną robotę, usuwając system operacyjny, na którym używasz, małe rzeczy, takie jak rozróżnianie wielkości liter w Linuksie w ścieżkach i nazwach plików, wymagają trochę przyzwyczajenia się do takich rzeczy, jak uprawnienia.

NET jest zdecydowanie bardzo wieloplatformowy ze względu na Mono w oparciu o moje dotychczasowe doświadczenia.

GEOCHET
źródło
Nazywaj mnie ignorantem, ale czy musisz nawet testować ASP.NET z mono? Wszystko, co byłoby .NET, jest po stronie serwera, więc nie ma znaczenia, w którym systemie operacyjnym jest wyświetlany, prawda?
Ethan Gunderson,
9
Ethan, korzystając z Mono, możesz hostować aplikacje ASP.net w systemie Linux.
Eric Haskins,
2
Nie każdy chce uruchamiać swoją aplikację w systemie Windows, z jakiegokolwiek powodu.
Bernard
2
@Rich B: jeśli klient nie chce produktów MS, .NET jest zdecydowanie złym wyborem.
Kjetil Ødegaard
21
@Kjetil: Mono nie jest produktem MS.
GEOCHET
26

Java jest tak wieloplatformowa, jak wszyscy mówią. Istnieje implementacja JVM dla prawie każdego głównego nurtu systemu operacyjnego (nawet Mac OS X, w końcu) i wszystkie działają naprawdę dobrze. Istnieje mnóstwo narzędzi open source, które są tak samo wieloplatformowe.

Jedynym haczykiem jest to, że istnieją pewne natywne operacje, których nie można wykonać w Javie bez napisania niektórych bibliotek DLL lub SO. W praktyce zdarza się to bardzo rzadko. Jednak we wszystkich tych przypadkach udało mi się to obejść, uruchamiając natywne procesy i przeglądając wyniki.

jodonnell
źródło
1
Ponadto w prawie każdym przypadku, gdy Java nie może wykonać natywnej operacji w sposób wieloplatformowy, to samo będzie miało miejsce w przypadku .NET
Eli Courtwright,
Wreszcie? Mac OS X ma implementację JVM od 10.0. :)
mipadi
3
@Eli - prawdopodobnie prawda. Z pewnością integracja z natywną funkcjonalnością w .NET / Mono jest dużo, dużo łatwiejsza niż w Javie. Tak więc, jeśli próbujesz tylko dobrze zintegrować się z natywną platformą, .NET / Mono oferuje prawdziwą przewagę.
Justin,
„tworzenie natywnych procesów i przeglądanie wyników z ekranu” drży
Podstawowy
Spierałbym się z „prawie każdym głównym systemem operacyjnym”, ponieważ nie ma JVM po wyjęciu z pudełka ani na Androida, ani iOS. Tymczasem dzięki nowym przenośnym bibliotekom klas w .NET można faktycznie udostępniać skompilowany kod (chociaż nie jest to praktycznie kod interfejsu użytkownika) na różnych platformach, w tym na urządzeniach mobilnych.
Mathieson,
18

Myślę, że pytanie jest sformułowane nieprawidłowo. C # w porównaniu z Javą jest znacznie mniej interesujący pod względem wykorzystania na wielu platformach niż (a) które platformy musisz obsługiwać i (b) biorąc pod uwagę podstawowe biblioteki i dostępne biblioteki stron trzecich. Język jest prawie najmniej ważną częścią procesu decyzyjnego.

Brad Wilson
źródło
Zgoda. Jest to kwestia tego, jak dobrze obsługiwane są maszyny wirtualne na różnych architekturach.
Allain Lalonde,
Zgoda. Nie ma przyjemności w tworzeniu pełnego rozwoju, jeśli klient nie może go uruchomić.
Thorbjørn Ravn Andersen
15

Java to lepszy wybór do tworzenia aplikacji na różnych platformach.

  • Występ. Java i .Net mają podobny poziom wydajności ze względu na maszynę wirtualną, ale JVM zwykle ma lepszą wydajność ze względu na lata i lata optymalizacji.

  • Biblioteka. Chociaż zależy to od zadania, Java ma tam znacznie więcej dostępnych bibliotek typu open source lub innych firm. W przypadku aplikacji serwerowych, J2EE, Spring, Struts itp. W przypadku GUI, chociaż .Net zapewnia interfejs API warstwy Win32, ale powoduje to problemy ze zgodnością. Java ma Swing, SWT, AWT itp. Działa w większości przypadków.

  • Zgodność. To są kluczowe kwestie, które należy wziąć pod uwagę podczas opracowywania programu wieloplatformowego. Dwie kwestie: po pierwsze, kompatybilność platformy. Java wciąż wygrywa, ponieważ JDK jest dobrze utrzymywany przez jedną, oryginalną firmę Sun. Mono nie jest obsługiwane przez MS, więc nie masz jeszcze gwarancji na zgodność aktualizacji. 2. Zgodność wsteczna. Sun zachowuje dobrą reputację pod względem kompatybilności wstecznej, chociaż czasami wydaje się to zbyt sztywne i spowalnia tempo.

  • Przybory. Java ma dobre środowiska IDE dla wielu platform. Netbeans, Eclipse itp. Większość z nich jest bezpłatna. VS Studio jest dobre, ale tylko w systemie Windows i nie kosztuje trochę. Oba zapewniają dobre testy jednostkowe, debugowania, profile itp.

Dlatego sugerowałbym, że lepszym wyborem jest Java. Przykładem może być kilka słynnych aplikacji na różne platformy opracowanych przez Javę: Vuze, Limewire, BlogBridge, CrossFTP, nie wspominając o tych IDE. Jeśli chodzi o .Net, mam ograniczoną wiedzę na temat takich aplikacji, które odniosły sukces.

Gatorhall
źródło
Praca z mono na „innym” Linuksie stała się trudna. Odzwierciedla to główny problem z monofonią: przyszłość monofonii jest zbyt zależna od dyktatury Miguela de Icazy. Przykład: zanikanie wsparcia dla „innych ... (nieobsługiwanych)” [ mono-project.com/Other_Downloads] Linux wydaje się korelować ( IMHO ) z rozczarowaniem Miguela de Icazy wobec Linuksa ( tirania.org/blog/archive/ 2013 / Mar-05.html ). Java nie cierpi z powodu tego problemu dyktatury. C # może działać na większej liczbie platform, ale wiąże się to z większymi kosztami, ryzykiem, kompromisem i zależnością od pana de Icaza. Nie, dziękuję.
StartupGuy
@ Michael.M więc wolisz być pod kaprysem Oracle?
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen: Źle. Pozwólcie, że przedstawię to tak prosto, jak tylko potrafię: .Net -> platforma MSFT (stabilna firma odnosząca sukcesy; ograniczony, ale zgrabny ekosystem); Mono -> Framework De Icaza (el dictador; nie jest gorący dla Linuksa i pokazuje: [ cultofmac.com/218632/ ... - spróbuj zainstalować mono na Centos 6.4, to koszmar "nieobsługiwany"); Java to specyfikacja, która należy do społeczności i ma wiele różnych implementacji dostawców (Oracle to tylko jedna) [ coderanch.com/t/327542/java/java/ ...
StartupGuy
@ ThorbjørnRavnAndersen: .. ponadto główny sponsor społeczności Java może nawet wykluczyć Oracle i nadal odnosić sukcesy i wyjątkowo dobrze obsługiwane - Java w żadnym wypadku nie jest kaprysem Oracle --- patrz: news.techworld.com/applications/3252787/ … Oracle mogłaby pozbyć się całego swojego zaangażowania w Javę i nadal by istniało. Jacy inni dostawcy mają platformę .Net? Kto jeszcze zapewnia środowisko uruchomieniowe mono inne niż Xamarin? Java jest jedyną z nich, która nie podlega dyktaturze i ma prawdziwą kontrolę społeczną, wsparcie społeczności i zarządzanie społecznością.
StartupGuy
1
@ Michael.M Specyfikacja? Należysz do społeczności? Myślę, że się mylisz - uważam również, że jedynym powodem, dla którego projekt OpenJDK nie został zamknięty po przejęciu Sun, była licencja GPL. Java jest w żelaznej pięści Oracle, po prostu dlatego, że TCK nie jest ogólnie dostępna i to jest to, co jest potrzebne do stworzenia maszyny JVM, która zachowuje się jak JVM Oracle. Nie mam problemu z Mono czy De Icaza, ale nie sądzę, żeby sytuacja z Javą była dużo lepsza. Jedyny alternatywny projekt JVM z rozmachem umarł, gdy IBM przestał go wspierać.
Thorbjørn Ravn Andersen
8

Powiem również o Javie. Jeśli spojrzeć na to z punktu widzenia dojrzałości, firma Sun (i inni) poświęciła dużo więcej czasu i wysiłku na przystosowanie maszyny JVM do działania na platformach innych niż Windows.

Z kolei Mono jest zdecydowanie obywatelem drugiej kategorii w ekosystemie .NET.

W zależności od tego, kim są Twoi docelowi klienci, może się okazać, że istnieje rzeczywisty sprzeciw wobec korzystania z Mono - czy Novell oferuje taki sam rodzaj wsparcia dostawcy dla Mono, jak w przypadku Java lub .NET w systemie Windows?

Jeśli chodziło Ci głównie o hosting usługi w systemie Windows, rozsądnie byłoby rozważyć ten wybór, ale ponieważ koncentrujesz się głównie na Linuksie, wydaje mi się to bez myślenia.

warren_s
źródło
Zgadzam się z tym, że Mono jest obywatelem drugiej kategorii, ale nie z wnioskiem. Java istnieje już od dawna i jest pełna starszych dziwactw i problemów z zarządzaniem pamięcią, nie wspominając o tym, że prawie zawsze wybiera najbardziej rozwlekły sposób zrobienia czegoś. Jest on również dość stagnacyjny (język) przez lata i dopiero niedawno zaczął włączać funkcje, które są w .Net od lat. IMHO, to wybór między dwoma złami ... Obsługa platformy Flakey w / .Net lub ociężałym behemotem, który ewoluuje bardzo wolno i jest obowiązkiem do kodowania.
Podstawowy
7

Java została zaprojektowana jako wieloplatformowa; C # /. Net nie był. W razie wątpliwości użyj narzędzia, które zostało zaprojektowane do tego celu.

EDYCJA: uczciwie mówiąc, .NET został zaprojektowany do pracy w środowiskach embedded / PC / Server, więc jest to SORT wieloplatformowy. Ale nie został zaprojektowany dla Linuksa.

AlexeyMK
źródło
3
cóż, C # jest znormalizowany ISO, więc pomysł był taki, aby mieć coś międzyplatformowego. Microsoft nie chciał tworzyć implementacji na inne platformy, ale pozostawiono to innym stronom, ponieważ język jest standardem. Framework .Net to jednak bardziej skomplikowana historia.
zappan
Mono to jednak dobra implementacja, a DotGNU (także dla Maca)
Andrei Rînea
1
zappan: poprawny punkt na C # (nie wiem), ale .NET jest cholernie ogromny. Wprawdzie nie mam tu żadnego osobistego doświadczenia.
AlexeyMK
@zappan - z praktycznego punktu widzenia nie ma znaczenia, że ​​C # jest ustandaryzowany (lub że Mono jest całkiem dobrym klonem C #). Przenośność platformy dotyczy całej platformy (w tym bibliotek i ekosystemu narzędzi), a nie tylko samego języka. W tym sensie .Net zdecydowanie nie jest w pełni wieloplatformowy.
mikera
7

Myślę, że odpowiedź brzmi „to zależy”. Java działa na prawie wszystkim, ale .NET / Mono są (IMHO) lepszą strukturą dla pulpitu. Myślę więc, że odpowiedź naprawdę zależy od tego, na jakie platformy planujesz kierować reklamy.

Giovanni Galbo
źródło
Pulpit nie jest synonimem systemu Windows, mimo że zajmuje największą część miejsca na pulpicie.
ZOXIS,
6

Aby dodać trochę więcej do rozmowy, Java jest bardziej przenośna, jeśli pozostajesz mniej więcej o jedną wersję w tyle - Java 5 nadal ma wiele doskonałych funkcji, więc możesz poczekać na Java 6 i nadal mieć duży zakres pod względem języka i bibliotek do opracowania z. Mac jest podstawową platformą, której dogonienie najnowszej wersji Java może zająć trochę czasu.

Java ma również doskonałe ciało normalizacyjne, które inteligentnie rozwija platformę w oparciu o dane pochodzące od wielu różnych firm. Jest to często pomijana funkcja, ale utrzymuje nawet nowe funkcje dobrze działające na wielu platformach i zapewnia szeroki zakres obsługi bibliotek dla niektórych ezoterycznych rzeczy (jako opcjonalne rozszerzenia).

Kendall Helmstetter Gelner
źródło
OS X 10.6 teraz w pełni dogonił wydanie Sun Java 6.
Thorbjørn Ravn Andersen
5

Głosowałbym za bardziej przenośną Javą niż C #. Java z pewnością ma również bardzo bogaty zestaw standardowych bibliotek. Istnieje również szeroki zestaw bibliotek stron trzecich typu open source, takich jak te dostarczone przez projekt Jakarta ( http://jakarta.apache.org/ ).

Istnieją również wszyscy zwykli podejrzani w zakresie CI, testów jednostkowych itp. Obsługa wielu platform IDE jest również bardzo dobra w przypadku Eclipse, Netbeans, IntelliJ IDEA itp.


źródło
4

Są też inne języki. Bardzo polubiłem Pythona, który działa dobrze w systemach Windows, Linux i Mac i ma bogaty zestaw bibliotek.

George V. Reilly
źródło
Tak, uwielbiam Pythona i ma Django, które lubię w aplikacjach internetowych, ale było kilka rzeczy, które sprawiały, że było to nie do zaakceptowania, z których najważniejszym jest GIL w standardowej implementacji interpretera w C. Mam wiele operacji, które czerpią duże korzyści z obliczeń równoległych na maszynach wielordzeniowych i musiałbym tworzyć procesy, aby to zrobić w cPythonie.
Hanno Fietz
3

Podczas gdy Mono ma wiele problemów , myślę, że ma lepszą historię kompatybilności między platformami, szczególnie JEŚLI polegasz na natywnym wywołaniu platformy.

W Stack Overflow nie ma wystarczającej liczby słów, aby podkreślić, o ile płynniej jest uzyskać coś natywnego wywoływanego i wykonywanego w .NET / Mono na (przynajmniej z mojego doświadczenia 3 ...) wielu platformach w porównaniu z równoważnym wysiłkiem Java.

szkoda chłopca
źródło
Zgadzam się, wywoływanie kodu specyficznego dla platformy z .NET / Mono jest bardzo łatwe, o ile można go wywołać z C. Z CXXI ​​(wymawiane jako sexy) również wywoływanie kodu w C ++ staje się bardzo proste. tirania.org/blog/archive/2011/Dec-19.html
Justin
2

Gatorhall, czy masz jakieś dane, aby to potwierdzić?

Występ. Java i .Net mają podobny poziom wydajności ze względu na maszynę wirtualną, ale JVM zwykle ma lepszą wydajność ze względu na lata i lata optymalizacji.

Tło: Jestem facetem od Windowsa od czasu Windows 3.1, a obecnie używam Linuksa (nadal mam Windows 7, świetny system operacyjny, na maszynie wirtualnej dla Visual Studio 2010 i innych narzędzi).

Chodzi o to, że ja i wielu użytkowników (Windows, Linux itp.), Których znam, możemy się z tobą nie zgadzać. Java ma tendencję do wolniejszego działania nawet w aplikacjach komputerowych Linux, ASP.NET często działa szybciej niż strony serwera java. Niektórzy mogą się zgodzić, że nawet nieskompilowany PHP działa lepiej w kilku scenariuszach.

Java jest bardziej wieloplatformowa? Nie mam co do tego wątpliwości (historia sięga dalej), ale szybszy (nie mówiąc. NET jest) nie jest taki pewny i chciałbym zobaczyć prawdziwe testy porównawcze.

Rui Marques
źródło
Jest jeszcze jedno pytanie, które może pomóc i oczywiście jest strzelanina językowa . JVM może być bardziej zoptymalizowany, ale jest blisko (szczególnie w systemie Windows). Testy porównawcze dla ASP.NET vs J2EE lub JSP są jeszcze bardziej podejrzane, ale nie mam problemu z uwierzeniem, że ASP.NET jest znacznie szybszy, nawet jeśli środowiska wykonawcze są takie same.
Justin