Mint mindenhol, a számítástechnika világában is sokféle tévhit és legenda kering. Van, ami teljesen alaptalan, van, amelyiknek akad némi alapja, de csak szélsőséges körülmények között mondható igaznak, vannak „túlfújt” hibák, és vannak olyan tévhitek, amelyeknek valaha létezett alapja, de ma már nem igazán van. Az egyik tévhitektől hemzsegő témakör a Java, amiről főleg az terjeng, hogy „lassú” és hogy „sok memóriát foglal”.
A Javáról röviden, a teljesség igénye nélkül
A Java egy programozási nyelv, ami a C és a C++ mintáját követi, viszont az előbbiből generált virtuális gépi kód (ún. „byte-kód”) a JVM (Java Virtual Machine) nevű virtuális gépen fut, ellentétben a C/C++ programoknál, amelyek valós gépi kódra fordulnak.
A Java virtuális gép a már említett byte-kódot valós időben fordítja gépi kódra, amit JIT (Just In Time) feldolgozásnak neveznek. Mindezt úgy teszi, hogy fordítás közben elemzi is a kódot, és optimalizál rajta, ha lehetséges, így fordulhat elő az, hogy bizonyos feladatoknál gyorsabb lehet, mint a hagyományosan futtatott programok. Ugyanakkor az elsődleges cél mégis csak a platformfüggetlenség, valamint az automatikus memóriakezelés biztosítása.
A platformfüggetlenség azt jelenti, hogy a program minden olyan processzoron és operációs rendszeren futni fog, amire elérhető a Java futtatókörnyezet (amely tartalmazza a JVM-et, a Java alap függvénykönyvtárait és a fordítót), legyen akár x86-, Power- vagy ARM-processzor a gépben, de a Java az operációs rendszerek között sem válogat.
Az automatikus memóriakezelés pedig leveszi a programozó válláról a memóriakezelés súlyát, ami jelentősen gyorsítja a fejlesztést, és sok hibalehetőséget zár ki. Igaz, az automatikus memóriakezelés megoldható JIT nélkül, nem virtuális gép alapú környezetekben is.
A Java programok memóriaéhsége pedig nem mindig annyira vészes, mint amennyire annak látszik, ugyanis az ilyen alkalmazások szeretnek sok RAM-ot lefoglalni maguknak, viszont az egyáltalán nem biztos, hogy ki is használják azt.
A lefoglalt memóriaterületet „heap”-nek hívják, és mindegyik Java futtatókörnyezetnek (több is van ám!) van egy alapbeállítása, hogy mennyi memóriát foglaljon le erre a célra, HA az alkalmazásban nem szabott meg a programozó egy saját értéket (amit általában nem szoktak), pedig manuálisa állítva be a minimális értéket bizony csökkenteni lehet a memóriaéhséget. Azért hozzá kell tennem, hogy manapság a nem Java alapú programok is felnőttek a Java szintjére memóriaéhség szempontjából, viszont a régi szövegek ismételgetés megmaradt…
A tévhitek
Gyakran ismételgetett probléma Java témában a nyelv állítólagos lassúsága. Ennek a sztorinak két forrása van: az egyik, hogy a Java alapú programok boot utáni első indulásakor be kell tölteni a futtatókörnyezetet is, na meg a függvénykönyvtárak egy részét (körülbelül 250 MB a futtatókörnyezet jelenleg), ami töredezett merevlemezeknél eltart pár másodpercig -- viszont ha körülnézünk, láthatjuk, hogy manapság ez nem kirívó adatmennyiség.
A másik forrása a lassúság „legendájának” pedig az, hogy a programok általában lassabbak az ilyen virtuális gépes környezetben, mint a natív, gépi kódú alkalmazások. Ennek az állításnak is van alapja, hiszen a Java első kiadása bizony 20 éve, 1995-ben indult útjára, és az akkori számítógépek finoman szólva nem dúskáltak sem memóriában, sem pedig processzorerőben, viszont azóta eltelt pár év, a gépek sokkal gyorsabbak, és maga a futtatókörnyezet is jelentősen gyorsult az időközi optimalizációknak köszönhetően. Lásd a Jake2 nevű Javában írt Quake2 klónt, ami alig lassabb mint az eredeti, C-ben írt, natív változat!
Látható, hogy a Java platformot ért támadások nagy része manapság inkább megszokás alapú, olyan „hallottam egy ismerőstől, hogy a barátja használta és gáz” típusú értesülésekből áll össze, és az is rásegít a rossz hírnévre, hogy az ilyen alkalmazások könnyen felismerhetők a laikus számára is, hiszen .exe helyett általában .jar kiterjesztésű a futtatható program, és a Java futtatókörnyezet telepítésének megkövetelése is árulkodó.
A Java nincs egyedül
Van egy másik virtuális gép alapú környezet, ami a Java klónjának mondható, teljesítménye hasonló (habár betöltődés szempontjából még lassabb, hiszen jóval nagyobb helyet foglal a környezet, ráadásul sok fájlban szétszórva), és valahogy elkerülik a károgók, ami nem véletlen.
Ez a Microsoft által fejlesztett C# és a .NET környezet, melynek megalkotása annak köszönhető, hogy a 2000-es évek elején a Javát fejlesztő Sun beperelte a redmondiakat, akik éppen nagyban fejlesztették saját céljaikra módosított Java futtatókörnyezetet és függvénykönyvtárakat, az MS Javát, és így ki kellett találniuk valamit, ami olyan, mint a Java, de még is kicsit más...
Ezekről a .NET-es alkalmazásokról a laikus felhasználó nem tudja, hogy bármiben is különböznek a natív programoktól, hiszen .exe kiterjesztésűek a futtatható fájlok, és a .dll kiterjesztésű függvénykönyvtárak is a natív programokra hasonlítanak, na meg a futtatókörnyezet alapesetben is az újabb Windowsok része. Ez jó ötlet volt, hiszen amiről nem tudnak a félinformációkból tájékozódó a hangulatkeltő felhasználók, arról nem is fognak elméleteket vagy tévhiteket gyártani. Bizony, a Java hallatán károgók is rengeteg ilyen szoftvert használnak nagy megelégedéssel, csak nem tudnak róla, hogy a háttérben ugyanaz megy, ami a Java esetében. Egy példa akad, amiről tudja szinte mindenki, hogy C# alapú .NET környezetben futó alkalmazás: a hírhedten lassú Catalyst Control Center, bár ennek csigatempója miatt inkább az alkalmazás programozói okolhatók, és nem a futtatókörnyezet.
Most jön a csavar! Java (vagy akár C#) nyelvben írt programot bizony lehet akár gépi kódra is fordítani, akárcsak a hagyományos programnyelvekben írt alkalmazásokat, viszont így elveszik a JIT esetleges előnye és a platformfüggetlenség, ugyanakkor az alkalmazás nem lesz számottevően gyorsabb, így nagyon ritkán van létjogosultsága ennek a stratégiának.
Szép példa erre az Android (amit szintén erős tévhitek öveznek, melyek közül sokat a Javától, sokat pedig az Androidot szétgányoló gyártói sufnituningoktól örökölt), amelynél éppen mostanában állnak át a Dalvik VM-ről (ami szintén olyan virtuális gép, mint a JVM, csak ezt a Google fejlesztette) ART környezetre, ami lényegében natív kódot készít az alkalmazás telepítésekor. Sajnos itt sem egyértelműek az előnyök, helyenként akár több memóriát igényelnek és lassabbak ezek a natív kódra fordított az alkalmazások, mint a Dalvik virtuális gép alatt, viszont megéri még így is a Google-nek a váltás, hiszen így remélhetőleg megússza a VM rövidítés, vagy „virtuális gép” kifejezés hallatára a platformnak ugró, vérben forgó szemű „szakértőket”.
És itt az újabb párhuzam: a Windows Phone-t nem szokták lassúsággal vádolni, pedig a WP alkalmazások túlnyomó része bizony virtuális gép alapú, csak ugye ott a C# és a .NET kombó játszik, és nem köthető össze a Java „szitokszóval”.
A Java tehát a desktop felhasználóknál nem túl népszerű a sok tévhit és a nem túl megalapozott „szakértői” vélemények miatt, miközben ironikus módon az ugyanolyan elven működő, Java mintájára készült, hasonló teljesítményű, és nyelvileg is nagyon hasonlító C# és .NET platform virágzik. Persze azért a Javát sem kell félteni, mert a fent említett pszichológiai hatásokra kevésbé érzékeny nagyvállalati környezetben szinte egyeduralkodó, emellett Androidon is ez marad az elsődleges fejlesztői nyelv.
Én is tanultam Java-t, sok mindent megcsináltunk benne, de sajnos minket is mindenféle előzetes programnyelv ismerete nélkül hajítottak bele így az egészből nem lett más csak káosz és bukdácsolás... Pedig maga a programozás érdekelt volna.
Amint viszont biztosan tudok, hogy az AbevJava és a MOL számlaletöltő rendszerével csak a baj van a melóhelyemen. :D Ha jól tudom ezen programok is Java alapúak.
Azt meg nem értem, egy Java app miért lenne kevésbé biztonságos, mint egy natív. Ez csak attól függ, mennyire jól van megírva, mire használják, és mennyire óvatos a felhasználó.
Azt meg nem értem, egy Java app miért lenne kevésbé biztonságos, mint egy natív. Ez csak attól függ, mennyire jól van megírva, mire használják, és mennyire óvatos a felhasználó.
Nem idézem be a szöveget, mert túl hosszú, és igazából csak egyetértésemet fejezném ki. Az ilyen VM programok akár játékok akár applikációk, egy részben jók:
- van esély a "nagy kiadóktól" független kis fejlesztők kreativitásának teret adni.
- és megmarad a platform függetlenség, aminek a jövőben még inkább a multi plaform programokban kéne megjelennie. (pl: elkezdek egy játékot a PC-n, de elutazom és szeretném tovább vinni (ugyan azt a mentést, játékot) a történetet tableten.
Más részben rosszak:
- hozzák a hozzá nem értő kreatívak bug-jait.
- vonzzák a pénzéhes dilettánsokat és a hozzáértő pénzéhes kártevőket
És ennek a tendenciának a következménye hogy az UBI nem érti hogy miért sírnak a játékosok néhány bug kapcsán, mikor "szinte" hasonló áron early accessben megjelent termékekért milliókat dobnak ki az emberek.
És tényleg lassú ez a folyamat, szeretném látni mi lesz ennek a következménye.
Tehát a Google (a cégóriás Google) azért cserélte le az egyébként az utódjánál jobb Dalvik-ot (ami a piacvezető mobil OS szerves része), mert néhányak nem tetszett a virtuális gép kifejezés? Ez nem komoly, ugye?
G.
Tehát a Google (a cégóriás Google) azért cserélte le az egyébként az utódjánál jobb Dalvik-ot (ami a piacvezető mobil OS szerves része), mert néhányak nem tetszett a virtuális gép kifejezés? Ez nem komoly, ugye?
G.
Egyébként pedig C++ nál new és delete operátorok helyett saját fgv-t kell hívni és meg van oldva a memória kezelés. A Java meg attól nem lesz gyorsabb, hogy az alatt a 0.01 mp alatt véletlenül a célprocesszorra fog fordítani, nem véletlen, hogy egy C++ fordító akár 10-20 percig is fordít egy nagyobb libet adott CPU családra. Natív és natív program között éppen ezért óriási különbség van.
Ui.: Egyebkent a Java ritka sz*r egy nyelv, letornek az ujjak mire megfogalmazol valamit benne, es ezen szerintem a lambda expression-ok sem segitenek.
TomGoodman: netto okorseg amit leirtal. Nincs is mit hozzafuzni.
Az egyértelmű hogy a kizárólag C-t ismerő csak gányolni fog Java-ban ha tájékozódás nélkül belevág, mert az előbbi nem objektum orientált, és még van pár különbség. De ettől még látszik honnan indultak ki a Java fejlesztésekor...
A Jake2 modernebb OpenGL utasításokat tartalmaz, ami modernebb GPU-kon természetesen gyorsabb futást eredményez, így azt az "alig lassabb" sebességet csak csalással sikerült elérni, ami még így sem éri utól a C-t. Tehát akkor mit is bizonyít ez a teszt?
De lehet ám keresni olyan teszteket is ahol nincs a képben 3D api...
A Jake2 modernebb OpenGL utasításokat tartalmaz, ami modernebb GPU-kon természetesen gyorsabb futást eredményez, így azt az "alig lassabb" sebességet csak csalással sikerült elérni, ami még így sem éri utól a C-t. Tehát akkor mit is bizonyít ez a teszt?
TomGoodman: netto okorseg amit leirtal. Nincs is mit hozzafuzni.
Egyébként pedig C++ nál new és delete operátorok helyett saját fgv-t kell hívni és meg van oldva a memória kezelés. A Java meg attól nem lesz gyorsabb, hogy az alatt a 0.01 mp alatt véletlenül a célprocesszorra fog fordítani, nem véletlen, hogy egy C++ fordító akár 10-20 percig is fordít egy nagyobb libet adott CPU családra. Natív és natív program között éppen ezért óriási különbség van.
TomGoodman: netto okorseg amit leirtal. Nincs is mit hozzafuzni.
Azért lássuk be, ezek mind arról szólnak, hogy iszonyatos mértékben felhígult a fejlesztői réteg és bevonzott egy csomó mihaszna semmirekellő amatőrt. Ami persze felpezsdíti a piacot és azt azt uraló nagy multiknak anyagilag piszkosul jól jön. ( Rövid távon, a játékpiac pont ennek az átkát kezdi el "élvezni" manapság és szép lassan visszaüt az egész. Az eladásokon már most is meglátszik, az emberek fokozódó csalódottsága _SAJNOS_ csak lassan realizálódik... )
Az már más kérdés, hogy pont emiatt a lazulás miatt lettek totálisan igénytelenek a programok és esett nagyon nagyot a minőség.
Ezek mind egy olyan mentalitást segítenek elő, aminek ez a sz@rözön az eredménye amit ma élünk:
- nem számít ha sz@rsz a változóidra, majd a garbage collector megoldja,
- nem baj ha totálisan sz@r a kódod, majd az exception kezelő elkapja,
- nem baj ha optimalizatlan, majd a jvm optimalizálja.
Hozzáteszem a Google sem hülye teljesen, nem véletlen adta ki az NDK-t és tette inkompatibilis aknamezővé az egész platformot. Segítek: nos nem azért mert a Java olyan baromi jó és gyors lenne...
Napi szinten használok javat, igen PC-n és Androidon is ( és nem játék-fejlesztőként ), de ha nem ebből élnék, legszívesebben fejbe lőném magam. :) Életem legjobb időszaka az volt, amikor natív C++ os környezetre fejlesztettünk Win32 és Linux alá... és érdekes módon nekünk akkor sem okozott gondot a platform függetlenség... Vicc a mai világ ( bár a pénz több :), de sajnos a legrosszabb fajtából. :/