Akurat technicznie JVM od CLR (maszyny wirtualnej .Net) jest lepszy¹, choć językowo C# podobno faktycznie jest przyjemniejszy. Java 8 jednak jest bardzo porównywalna do C# – z Javowymi „Streamami”, które wprowadzają funkcyjne przetwarzanie typów iterowanych (czyli pozwala na takie LINQ-podobne operowanie na kolekcjach):
numList.stream()
.filter(Number::isOdd)
.map(age -> new Person(age))
.findFirst()
.orElseThrow(() -> new IllegalStateException("There are no valid records!"))
W każdym razie do pisania na JVM, ale też do kompilacji na przeglądarkę (asm.js, wasm), a też od jakiegoś czasu do natywnych bibliotek bardzo fajnym językiem (używam teraz regularnie w pracy zamiast Javy) jest
Kotlin. Z grubsza takie „weźmy Javę, wywalmy cały niepotrzebny boilerplate, przetwórzmy Javowe dobre praktyki do ficzerów samego języka, i napiszmy sensowną bibliotekę standardową, w taki sposób, by zachować pełną kompatybilność z Javą, i jeszcze dorzućmy kompilację na przeglądarki i do kodu maszynowego Linuksa/macOS-a/Windowsa/iOS-a”. Wciąż nie jest to
nasz Pan i Zbawca Rust™ (do wszystkiego niżej poziomowego – polecam), ale wciąż jest bardzo wygodnym językiem.
Co do pisania serwerów – jeśli masz wybór między Javą a C#, to jednak Java ma większy ekosystem, lepsze wsparcie wieloplatformowe i ogólnie jest powszechniejsza. Do pisania logiki gier komputerowych – odwrotnie, tutaj C# wygrał.
C# zdobył trochę przestrzeni serwerowej językowym wsparciem dla pisania asynchronicznego, ale tutaj w Javie też się da (w pracy używamy frameworka Vert.x z CompletableFuture’ami z Javy 8 – nie jest to tak ładna abstrakcja jak async/await z C#, ale wciąż da się bardzo czytelnie pisać i działa bardzo dobrze). A jak weźmiesz Kotlina, to ów również wprowadza korutyny i zaimplementowaną za ich pomocą abstrakcję async/await (choć póki co eksperymentalnie, i tak składnia jak i API biblioteki mogą się zmienić) – a przy tym masz wciąż dostęp do całego serwerowego Javowego ekosystemu.
Zło to jest JS-owy framework Electron. W pracy mam komputer 8GB RAM i Slack potrafi przymulić jak mam włączone Spotify i Visual Studio z powodu RAMu właśnie.
Electron to straszna abominacja. JS sam w sobie to zło.
¹ EDIT: no OK. Zależy jak na to spojrzeć. CLR ma więcej wsparcia w formacie bytecode’u i maszynie wirtualnej do ficzerów języków wyższego poziomu – zapisywane w bytecodzie generyki, rekurencja ogonowa, definiowane przez użytkownika typy nie-referencyjne (tzw. value types). Z drugiej strony JVM ma lepszy garbage collector z mnóstwem dodatkowych opcji do dokonfigurowania go pod konkrętną aplikację, i mnóstwo dodatkowych możliwości do monitorowania i debugowania działających aplikacji – co przy tworzeniu produkcyjnych serwerów i zarządzaniu nimi jest cholernie pomocne.