LINUX - JVM

Andras Tantos andras_tantos at yahoo.com
Wed Mar 30 00:53:25 CEST 2005


Hali!

> Azt en ertem, hogy a programozonak konnyebb (irtam progit javaban). De
> itt arrol megy a vita peldakkal megtamogatva, hogy a Javaban irt progi
> gyorsabb, mint egy x C forditoval forditott gepiodi progi. Na ezt nem
> ertem.

Kicsit keson kapcsolodom be a vitaba (BTW: a subj. sor nem valami 
informativ), ugyhogy lehet, hogy mar masok irtak: se a Java, se a C# (vagy 
barmely mas .net nyelv) nem feltetlen iterpretalt nyelv. A .Net a legtobb 
esetben nem az, a Java-t annyira nem ismerem, de gondolom a dolog rendkivul 
hasonlo, legalabbis elmeletben. A tovabbiakban a .NET megoldasrol fogok 
irni. A virtualis gep csupan egy futtasi kornyezet specifikacioja, es mint 
ilyen, fikcio. A betoltott .NET assembly-t (java-ban byte-code) egy u.n. 
just-in-time compiler forditja le gepi kodra. Ez a leforditott kod fut, azaz 
nincs interpreter kozbe iktatva. Ez a forditas tobbfele idopontban es modot 
tortenhet meg. A legegyszerubb, hogy amikor egy fuggveny meghivasra kerul, 
akkor annak a kodjat a fordito gyorsan leforditja, majd meghivja. Ehhez 
mindossze arra van szukseg, hogy a belepesi ponton ne az eredeti fuggveny 
legyen, hanem egy hivas a forditora. Amikor az vegzett a forditassal, atirja 
a belepesi pontot a leforditott fuggvenyre valo hivatkozasra, igy az osszes 
tovabbi hivas mar kesedelem nelkul a kesz fuggvenyt hivja. Egy masik 
megoldas, hogy az egesz assambly-t betoltesi idoben atulteti a fordito gepi 
kodra, es igy az elso hivatkozaskor mar nem kell ra varni. Cserebe a 
betoltesi ido nagyobb. Sok esetben azonban nem lehet tudni, hogy milyen 
modulokat (DLL-eket) fog a program hivni a mukodese soran elore, igy aztan a 
'betoltesi ido' atcsuszhat a program futasanak idejere is. Ezt sem valami 
nehez megoldani, csak el kell kapni a LoadLibrary, es hasonlo OS hivasokat, 
es azok mukodeset modositani. A marmadik megoldas, hogy a program telepitese 
soran elvegezzuk a forditast, igy mind a betoltes, mind a futtatas gyors 
lehet, cserebe a telepites hosszadalmasabbra nyulasaert. .Net eseteben pl. 
ez utobbit az ngen.exe csinalja, es az eredmenyt a GAC-be (Global Assembly 
Cache) rakja el. Ilyenkor a futtato kornyezet a program betoltese elott 
megvizsgalja a GAC tartalmat, es ha abban mar van egy leforditott verzio, 
akkor azt tolti be az eredeti .NET assembly helyett.

Sajnos a helyzet az, hogy ezek a virtualis gepes megoldasok tapasztalat 
szerint sokkal lassabbak, mint a nativ programok. Ennek rengeteg oka van, 
parat tudok, meg tobbet nem. Elmeletben azonban valoban lehetoseg lenne 
arra, hogy ezek a programok akar gyorsabbak is legyenek, mint az elore 
leforditott tarsaik, ezert aztan kulonosen szomoru, hogy nem igy van.

Udv,
Tantos Andras 




More information about the Elektro mailing list