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