Czy jest coś, w czym Java jest lepsza od C#?

0

Pod wpływem fali hejtu na Javę i ciągłego wychwalania C# tak mi przyszło do głowy, że musi być coś, w czym Java jest lepsza od C#. Nie mam na myśli całego ekosystemu, ale sam język i JVM. Czy jest coś takiego?

2

Tak. Np. wieloplatformowosc i wsparcie na Linuxie. (jest niby Mono i Xamarin, ale takie to troche kulawe).

Dodam jeszcze serwery aplikacji, Tomcat, Jboss, Glassfish. Kontra glownie IIS.

Choc niby na Tomcacie da sie apke w C# postawic.

1

@WhiteLightning:

Raz odpaliłem na VM:

Zdziwienie: Wszystko śmigało, a kod pisałem normalnie, jak na windowsie (chociaż była to helloworldówka)

Jedynie pobieranie adresu IP z systemu mi nie działało. Kod który działał na windzie zwracał 0.0.0.0, ale to raczej z oczywistych powodów.

Z tego co chodziłem po rozmowach rekrutacyjnych i słyszałem coś na ten temat, to firmy interesują się tym, albo już nawet testują/przenoszą coś.

Więc generalnie uważam, że nie jest to jakaś tam pierdoła i niech ktoś się z tym męczy, tylko ms podszedł na poważnie do tego i zrobili coś, do czego będzie się dążyć: c# hostowany na linuksach.

2

Java ma przewagę w JITowaniu. W czasach, gdy C#-owcy zastanawiali się czy używać foreach czy for, Javowcy mogli robić foreacha na callbackach i innych ekstra obiektach bez straty wydajności: Dlaczego foreach jest gorsze od for (beta) Jeśli ktoś programuje obiektowo to takie automatycznie optymalizacje ułatwiają sprawę, bo nie trzeba się zastanawiać czy w danym miejscu użycie metody wirtualnej lub stworzenie nowego lokalnego obiektu popsuje wydajność - Javowy JIT sobie z tym zwykle dobrze poradzi.

Obecnie MS stara się trochę nadgonić JVMa i wprowadza RyuJIT do 32 i 64-bitowych wersji .NETa, ale nadal ten RyuJIT wygląda ubogo nawet w porównaniu do JVMa z 2011 roku. Podczas, gdy MS goni JVMa z 2011 roku, JVM odlatuje w kosmos jeszcze bardziej, bo mamy takie wynalazki jak np https://www.graalvm.org/ czy http://openjdk.java.net/projects/zgc/ (bądź https://wiki.openjdk.java.net/display/shenandoah/Main ).

0

Java nie ma LINQ :P

0

Wiem, że to część ekosystemu a nie JVM, ale jednak spędzasz w IDE większość czasu - IntelliJ > Visual Studio

0

Java ma Stream API które chyba jest takim odpowiednikiem LINQ. I na JVM jest cała masa fajnych językow jak Scala, Groovy czy Kotlin.
Nie wiem jak z null safem, @somekind można zrobić żeby C# na etapie kompilacji sprawdzał czy zmienna nie jest nulem? Bo w keczupie tak można :)

0

@scibi92: Można użyć Code Contracts, ale wymaga to trochę nadmiarowego kodu. Ma jednak więcej możliwości niż tylko sprawdzanie nulli

0

Dlaczego aplikacje desktopowe w C# na Windowsie szybko chodzą, a te napisane w Javie FX i Swing zamulają? Przecież te dwa języki programowania mają wirtualne maszyny, a jednak C# lepiej wygrywa na desktopie.

1
aa napisał(a):

Pod wpływem fali hejtu na Javę i ciągłego wychwalania C# tak mi przyszło do głowy, że musi być coś, w czym Java jest lepsza od C#. Nie mam na myśli całego ekosystemu, ale sam język i JVM. Czy jest coś takiego?

  1. Enumy mogą mieć pola, konstruktory i metody.
  2. Do tego jest kilka maszyn wirtualnych, które są wydajniejsze z dwóch powodów: dojrzałość rozwiązań (co wynika z tego, że platforma jest starsza oraz z samej konkurencji) oraz wsparcie linuksa (systemu, który łatwiej dostosować pod jedno zadanie typu obsługa konkretnej aplikacji niż Windows, który zawsze niesie ze sobą bardzo potrzebny bagaż wsparcia dla sterowników skanera sprzed 40 lat oraz pulpitu z obowiązkowym skrótem do Minecrafta).

Poza tym jest zdecydowanie lepsza jeżeli planujesz nawiązać więź erotyczną ze swoim kodem i imponują Ci ludzie, którzy mają w zakładkach linki sprzed 7 lat rzekomo udowadniające wydajność przy pomocy sztucznego testu na kodzie, za którego napisanie należałoby w ramach code review uciąć ręce przy samych jajach.

scibi92 napisał(a):

Nie wiem jak z null safem, @somekind można zrobić żeby C# na etapie kompilacji sprawdzał czy zmienna nie jest nulem? Bo w keczupie tak można :)

W następnej wersji C# będa nullable reference types, co sprowadzi się do tego, że będzie można zadeklarować, czy zmienna typu referencyjnego akceptuje null czy nie. (I jak sama nazwa wskazuje, domyślnie to będzie nie.)
No i w .NET nie trzeba 15 języków, żeby z ich ficzerów złożyć jeden sensowny.

0
WhiteLightning napisał(a):

Dodam jeszcze serwery aplikacji, Tomcat, Jboss, Glassfish. Kontra glownie IIS.

Serwery aplikacji zaliczamy przy tym do poważnych MINUSÓW. HOLD

Na szczęście w nowych systemach się od tego odchodzi, więc to tylko kwestia legacy.

0

Łatwiej z Javy przejść na Kotlina.

2

Obecnie MS stara się trochę nadgonić JVMa i wprowadza RyuJIT do 32 i 64-bitowych wersji .NETa

Wprowadzał to 5 lat temu :P. Przez ten czas został zopensource'owany i jego development w całości odbywa się na githubie: https://github.com/dotnet/coreclr. Został również wieloplatformowy i będzie głównym enginem w Unity3D. Ficzery typowo wydajnościowe też się pojawiają. I w samym coreclr i w języku (np. rzeczy związane z zarządzaniem pamięcią - spany, lepsze wykorzystanie stosu, etc).

3

Nigdy specjalnie nie siedziałem w .NET ale wydaje mi sie ze to są technologie raczej porównywalne i wątpię żeby gdzieś była jakaś wielka przewaga techniczna. Lekka przewaga Javy możne wynikać co najwyżej z zaszłości historycznych

  • Java była open source znacznie wcześniej, w efekcie w wielu miejscach się zadomowiła i koszt zmiany byłby zbyt duży.
  • Punkt wyżej plus fakt że Java jest starsza sprawia że powstała do niej masa bibliotek. Jeśli szukasz czegoś dziwnego to najpewniej ktoś zrobił libkę do Javy i Pythona, ale do C# już niekoniecznie.
    Ale poza takimi szczegółami to raczej nie ma co się doszukiwać jakiejś "lepszości".
1

Dlaczego aplikacje desktopowe w C# na Windowsie szybko chodzą, a te napisane w Javie FX i Swing zamulają? Przecież te dwa języki programowania mają wirtualne maszyny, a jednak C# lepiej wygrywa na desktopie.

Pewnie porównujesz zupełnie inaczej napisane aplikacje. JetBrains jakiś czas temu stworzyło nowe IDE o nazwie Rider, które składa się z backendu napisanego w C# (tego samego co używany w ReSharperze) i frontendu napisanego w Javie (IntelliJ Platform, to samo co używane w IntelliJ IDEA). Takie połączenie działa znacznie szybciej (tzn tak twierdzą sami autorzy) niż ReSharper, który jest nakładką na Visual Studio.

Ponadto jest różnica między prędkością działania, a szybkością uruchamiania. .NET jest mocno zespawany z Windowsem i prawdopodobnie spora jego część zostanie załadowana do pamięci zanim w ogóle klikniesz w ikonkę swojego ulubionego programu napisanego w .NETu. Druga sprawa to to, że .NET ma zaimplementowanego AOTa w jakiejś tam postaci (nie dociekałem jakiej), bądź coś podobnego, a w Javce kompilacja jest zawsze w trybie JIT - VMka startuje w trybie interpretera i kompiluje najczęściej wykonywane fragmenty kodu. Standardowa Javka nie ma ani AOTa, ani jakiejś trwałej (np dyskowej) pamięci podręcznej na skompilowany kod. To powoduje, że Javka ma generalnie największy czas (bądź jeden z większych) rozgrzewania spośród szeroko używanych VMek - innymi słowy w Javie trzeba czekać najdłużej zanim VMka osiągnie pełną prędkość wykonywania kodu. Nie ma to jednak znaczenia w przypadku długo działających aplikacji - np webowych aplikacji biznesowych.

Poza tym jest zdecydowanie lepsza jeżeli planujesz nawiązać więź erotyczną ze swoim kodem i imponują Ci ludzie, którzy mają w zakładkach linki sprzed 7 lat rzekomo udowadniające wydajność przy pomocy sztucznego testu na kodzie, za którego napisanie należałoby w ramach code review uciąć ręce przy samych jajach.

W C# pewnie obcina się jaja za używanie słówka virtual. Kod nie miał na celu budzić podziwu tylko pokazać możliwości VMki - a możliwości JVMki w zakresie optymalizacji kodu zorientowanego obiektowo już wtedy były bardzo duże.

1 użytkowników online, w tym zalogowanych: 0, gości: 1