Autor Wątek: Java - w czym problem?  (Przeczytany 7722 razy)

Offline Shusty

  • Użytkownik

# Lipiec 11, 2012, 16:20:23
Kodząc w Javie można zostać nawet wyśmianym, choć nie tak jak "programista PHP" ;D

Rozumiem, że gry trzeba pisać wydajnie i najlepiej do tego C++ się nadaje.
Java ma garbage collector, który ma zalety i wady, aczkolwiek te wady nie są male. Obecnie JAVA nadal jest pamięciożerna, ale zdecydowanie szybsza niż wcześniej.

Zastanawia mnie jedno: gdy ktoś pisze grę w C# to wszyscy mu poklaskują, gdy ktoś pisze grę w Javie zostaje zjechany, a przecież C# też ma GC i założenia wysokopoziomowe ma podobne do Javy, lecz nie jest multiplatformowy. Może inaczej C# jest multi-microsoftowoplatformowy, też musi być odpalany przez wirtualną maszynę.

Czy Java jest faktycznie aż taka zła jeśli ktoś chce sobie popisać wysokopoziomowo, bo mu wygodnie i szybciej, czy to tylko stereotyp pozostały po tym czym Java była kiedyś. Jeśli to pierwsze to nadal nie rozumiem takiego uwielbienia w takim razie dla C#.
« Ostatnia zmiana: Grudzień 03, 2012, 04:32:05 wysłana przez Shusty »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline yarpen

  • Użytkownik

# Lipiec 11, 2012, 16:32:30
Mysle, ze odnosisz mylne wrazenie po prostu... Za Java ciagnie sie stary mit powolnosci, ale ma swoje zastosowania. Mysle, ze z Notcha nikt sie nie smieje :)

Offline Karol

  • Użytkownik

# Lipiec 11, 2012, 16:40:38
Ze stwierdzaniem, że wszyscy poklaskują to bym tak nie wyskakiwał. Jakoś nie widać tu specjalnego entuzjazmu do C#, a ludzie w tym piszący nieśmiało pytają czy ktoś zechce .net instalować dla nich. I w jedynym i drugim stworzone zostały dobre gry, lecz ze względu na wybór języka działające dość miernie (patrz Minecraft czy Magicka).

Gdy zobaczyłem nazwę tematu to od razu cisnęła mi się odpowiedź "w Javie" ;).

Offline Troll

  • Użytkownik
    • Oficjalna strona gry Gizarma

# Lipiec 11, 2012, 17:08:53
Kodząc w Javie można zostać nawet wyśmianym, choć nie tak jak "programista PHP" ;D

To ja muszę być prawdziwym pośmiewiskiem, bo Gizarma jest pisana w Javie i PHP :)

Offline dynax

  • Użytkownik

# Lipiec 11, 2012, 17:23:55
Dałeś się ponieść stereotypom i uwierzyłeś w śmieszne powiedzonka z czasów powolnej i mułowatej maszyny wirtualnej Javy. Teoretycznie Java wciąż nie nadaje się do zastosowań w programach czasu rzeczywistego ale biorąc pod uwagę dzisiejsze procesory i pojemności pamięci RAM jest w tym coraz mniej prawdy. Popatrz sobie, że na nowych komputerach taki Minecraft działa całkiem płynnie i to, że zużywa połowę dostępnego RAMu większości użytkowników wcale nie przeszkadza. Poza tym w Javie piszesz natywne aplikacje na Androida które działają tam z maksymalną wydajnością możliwą do uzyskania na tej platformie.

A Java składnie i narzędzia ma akurat bardzo przyjemne ;)

Offline Xion

  • Moderator
    • xion.log

  • +3
# Lipiec 11, 2012, 17:28:49
Cytuj
Mysle, ze z Notcha nikt sie nie smieje :)
Z tego co słyszę tu i ówdzie, Minecraft jest wręcz przysłowiowo wolny i zasobożerny. Nie tyle z powodu Javy - bo to obecne jeden z najszybszych języków w ogóle - co różnych, nazwijmy to, dziwnych decyzji inżynierskich ;)

OP: Tak jak wspomniałem, Java to obecnie jeden z najwydajniejszych języków do pisania aplikacji niebędących time-critical (czyli właściwie wszystkiego poza systemami wbudowanymi i wielkimi systemami czasu rzeczywistego, czyli np. grami AAA). Wciąż jednak ciągnie się za JVM stygmat powolności który powstał mniej więcej pod koniec zeszłego stulecia. Pamięciożerność to też już właściwie melodia przeszłości, zwłaszcza że rozmiar sterty dla JVMa można bez problemu regulować i ograniczać.

Wiele osób ma też "problem" z Javą z powodu jej obiektowości oraz rozwlekłości składniowej. Sporo powstałych ostatnio "hipsterskich" języków (oraz mnóstwo powstałych wcześniejszej ale akurat zdobywających popularność) mniej lub bardziej jawnie odcina się od Javy właśnie z tych dwóch powodów.

Offline szalony_zlomiarz

  • Użytkownik

# Lipiec 11, 2012, 17:34:03
@dynax Natywne aplikacje dla androida pisze sie w C lub C++ (zobacz android ndk), chociaż faktycznie Java jest na androidzie wystarczająco szybka do większości niemultimedialnych zastosowań.

Offline Xender

  • Użytkownik

# Lipiec 11, 2012, 17:35:05
Ja bym podszedł od innej strony - Java i JVM są technologiami już dopracowanymi w bojach. Za to problem z Javą jest taki, że bardzo łatwo wykształcić pseudo-programistę - podobnie zresztą z PHP - dlatego te języki często są obiektami żartów.

Pseudo-programista to taki, co nauczył się korzystania z języka, ale nie nauczył się, jak korzystać z niego dobrze. W Javie da się pisać szybkie programy, da się nawet pisać oszczędne pamięciowo programy. Ale jest to trudne, natomiast jak do kodu przysiądzie pseudokoder, to na pewno powstanie coś wolnego i pamięciożernego poprzez kompletne zapchanie GC.

GC wyręcza programistę ze zwalniania zasobów. Nie wyręcza go z ani myślenia o efektywnym zarządzaniu zasobami, ani z konieczności wiedzy o działaniu GC, ani z poprawnego zarządzania zasobami (najprostszy przykład - da się zrobić "memleak" w Javie trzymając gdzieś nadal referencje do obiektów, które przestały być potrzebne, zamiast je usunąć).

Co do Notcha - kod Minecrafta jest słaby jak mało co - chyba jednak nie jest dobrym programistą Javy...

Offline FoToN

  • Użytkownik

# Lipiec 11, 2012, 17:41:49
C# też ma GB i założenia wysokopoziomowe
Raczej GC (chyba że o coś innego Ci chodziło), a poza tym to boli tylko, gdy on się odpali (krótki lag). Oczywiście jak źle napiszesz to i GC będzie się wywoływać co chwilę.
I nie wiem jak Tobie, ale dla mnie "założenia wysokopoziomowe" chyba nigdy nie były bólem w czymś tam ;)

też musi być odpalany przez wirtualną maszynę.
Niech mnie ktoś poprawi jeśli się mylę, ale według mojej wiedzy C# jest na początku kompilowany do kodu pośredniego, a następnie przy uruchomieniu (a może nawet tuż przed wywołaniem kodu) ponownie kompilowany do kodu maszynowego maszyny na której jest odpalany (dzięki temu może wykorzystać optymalizacje pod konkretny sprzęt).

Offline Avaj

  • Użytkownik

# Lipiec 11, 2012, 17:51:10
Java dużo dostaje krytyki ze względu na kilka elementów:

1) niektóre jej części są strasznie powolne. Przykładowo aplety Javy były zabójczo wolne w latach '90 i na początku XXI wieku, poza tym Javę wciskano wszędzie, przez co niektórym obrzydła

2) Javowcy mają specyficzny sposób pisania frameworków, niektórzy mówią że to obiektowo, niektórzy że szalony, ale charakteryzuje się on konstrukcjami typu ObjectProxyBuilderFactory itp.

3) Język się powoli rozwija, głównie przez to, że jest bardzo popularny, przez to ciężko wdrożyć zmiany bez porzucania wstecznej kompatybilności. Poza tym musi działać wszystko crossplatform. Taki C# ogranicza się do Windowsa tylko i nie bawi się w kompatybilność wsteczną (.NET 1.0 jest już deprecated i 2.0 będzie pewnie lada moment też).

4) Brakuje wsparcia dla przeciążania operatorów oraz structów, to szczególnie w gamedevie wyłazi, interakcja z libkami C/C++ też jest uciążliwa (JNA tu ma pomóc ale kto wie).

5) Trochę mało stabilna sytuacja jeśli chodzi o frameworki GUI. Był AWT, potem były SWT i Swing, teraz Swing jest deprecated. W C# jednak WinForms jest i WPF i tyle, nie ma żadnej konkurencji.

Akurat garbage collector Javy jest dużo lepszy bo dużo więcej man centuries i $$$ w to wpakowano :)

Niech mnie ktoś poprawi jeśli się mylę, ale według mojej wiedzy C# jest na początku kompilowany do kodu pośredniego, a następnie przy uruchomieniu (a może nawet tuż przed wywołaniem kodu) ponownie kompilowany do kodu maszynowego maszyny na której jest odpalany (dzięki temu może wykorzystać optymalizacje pod konkretny sprzęt).
Tyle teoria, a w praktyce jest jak jest. Poza tym wiele JITów robi optymalizacje w locie jak np. program chodzi 10 godzin to wtedy można lepsze predykcje branchów robić itd. jak piszesz serwer to spoko ale do gry to już niewiele daje.

Na C# jest parcie bo on próbuje być lepszą Javą i hipster i w ogóle, ale pewnie będzie tak, że MS wycofa się z .NETa, Windows 10 będzie w sprzedaży, a Java dalej będzie się trzymać.

Offline m4tx

  • Użytkownik
    • m4txblog

# Lipiec 11, 2012, 17:53:41
Co do Notcha - kod Minecrafta jest słaby jak mało co - chyba jednak nie jest dobrym programistą Javy...
Tutaj się zgodzę. Oglądając Minecrafta można znaleźć pełno przykładów świadczących o tym, że Notch NIE był dobrym programistą. Ostatnio patrzyłem sobie na wykresy, co jak długo zajmuje. Okazuje się, że najdłużej Minecraftowi zajmuje renderowanie grafiki (ok. 70% całości), a - co ciekawe - 30% tego czasu zajmują... chmury. Zwykłe, proste, voxelowe chmury.

Moim ulubionym przykładem jest tutaj też poziom trudności peaceful - gdy się go włączy, teoretycznie nie powinno się uświadczyć żadnego nieprzyjaznego moba. Są one jednak, niestety, tworzone i od razu usuwane, co można bardzo łatwo zauważyć na serwerze postawionym na localhoście. Kiedyś słyszałem nawet teleportującego się endermana - a serwer był na poziomie Peaceful.

Dodam też sam coś od siebie jeśli chodzi o Javę: tak jak zostało to tutaj już napisane wcześniej, da się napisać aplikację bardzo szybko działającą w Javie. Sam jestem programistą Javy (chociaż czy dobrym programistą, to już można by się zastanawiać...) i wiem, że jak się potrafi, to można napisać aplikację działającą szybciej niż jej odpowiednik napisany w C++ (co mi się zresztą nawet raz udało). Ogólnie to Java w jednym sobie radzi gorzej, w drugim lepiej. Mity o niezbyt szybkim działaniu JVM-a pochodzą ze starych czasów i - niestety - z Minecrafta. Minecraft jest pewnym ewenementem, jest to jedna z niewielu tak popularnych gier w Javie, jednocześnie został napisany tak beznadziejnie, że pewien "mądry" człowiek pomyślał "a, to pewnie przez Javę" i plotka się rozniosła. Swoją drogą, słyszałem nawet, że Notch się właśnie na Minecrafcie uczył w Javie pisać.

Offline dynax

  • Użytkownik

# Lipiec 11, 2012, 17:54:35
@dynax Natywne aplikacje dla androida pisze sie w C lub C++ (zobacz android ndk)

Aplikacje pisane w NDK też są ładowane do maszyny wirtualnej działającej pod kontrolą Javy, jak wszystko na Androidzie.

Offline Asmodeusz

  • Użytkownik
    • Bogumił Wiatrowski: Blog

# Lipiec 11, 2012, 18:02:22
I w jedynym i drugim stworzone zostały dobre gry, lecz ze względu na wybór języka działające dość miernie (patrz Minecraft czy Magicka).
Nie wiem, jak Minecraft (wstyd przyznać, nie grałem), ale Magicka obrywa po wydajności głównie z powodu zastosowania XNA i marnych możliwości optymalizacyjnych. Pisanie gry w czymkolwiek (C++, C#, Java, JavaScript, Python, assembly, tu-wstaw-dowolny-inny-język-w-którym-ktokolwiek-może-zrobić-grę) jest jak najbardziej OK, o ile tą grę da się zrobić. Wybieraj narzędzia odpowiednie do zadania, a nie do trendów.

Zresztą, czy Java jest niepopularna/nielubiana? Na Androida można pisać w C++ i Javie, podejrzewam że kilkadziesiąt procent z top100 gier na system Google jest napisana bez linijki kodu w C++.

Jeśli chodzi o wydajność, warto pamiętać, że optymalizacja w przypadku rozwiązań wysokopoziomowych opiera się na trochę innych zasadach, niż przy korzystaniu z rozwiązań natywnych. Ważne są m.in. odpowiednie rozmieszczenie alokacji, ręczne wywoływanie GC (jeśli to możliwe), równomierne zużywanie pamięci (GC może uruchamiać się w małych cyklach) i dobry dobór algorytmów.

Offline Avaj

  • Użytkownik

# Lipiec 11, 2012, 19:34:10
Aplikacje pisane w NDK też są ładowane do maszyny wirtualnej działającej pod kontrolą Javy, jak wszystko na Androidzie.
nie pisz, że Javy tylko Dalvika bo jeszcze ci Oracle proces wytoczy :)

Offline Xender

  • Użytkownik

# Lipiec 11, 2012, 20:02:03
Aplikacje pisane w NDK też są ładowane do maszyny wirtualnej działającej pod kontrolą Javy, jak wszystko na Androidzie.

Mógłbyś rozwinąć? Nie interesowałem się dokładnie, ale wiem, że wstawki natywne są kompilowane do normalnego linuxowego .so - natomiast są API, do których można się bezpośrednio dostać tylko z Javy... Wiem też, że da się napisać aplikację w NDK bez ani jednej linijki Javy - wtedy samo generuje jakiegoś Javowego stuba, czy do apki leci samo .so z metadaymi?