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.
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
Zadałem to samo pytanie późno i IMHO, .NET / Mono wydaje się być lepszą opcją po prostu dlatego, że Mono ma świetne wyniki w aplikacjach wieloplatformowych (w przeciwieństwie do Java) i oczywiście Mono jest poprawianie się skokowo w dzisiejszych czasach.
źródło
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.
źródło
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.
źródło
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.
źródło
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).
źródło
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
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.
źródło
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.
źródło
Gatorhall, czy masz jakieś dane, aby to potwierdzić?
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.
źródło