Java programozás/A programok fordítása

Korábban már volt szó a telepítés alapjairól. Itt most átismétlünk néhány fogalmat kiegészítve néhány részlettel.

Fordítás bájtkódbaSzerkesztés

Egy Java program fordításakor nem futtatható fájl készül, hanem bájtkód (ahogyan arról korábban már volt szó), amit a Java Virtuális Gép hajt végre. A Java forráskódot a javac fordítóval fordíthatjuk bájtkódra. A fordító ezt egy .class kiterjesztésű fájlba menti. A program futtatásakor a just-in-time (JIT) fordító alakítja át a bájtkódot. Az eredmény gépi kódú lesz, ami bekerül a memóriába és futhat is.

Tehát a Java kétlépéses fordítást használ:

  • 1. lépés: bájtkód készítése
  • 2. lépés: natív gépi kód készítése

A Java osztályokat (bájtkódokat) a virtuális gép fordítja gépi kódra és tölti be őket a memóriába az első alkalommal, amikor szükség van rájuk. Ez különbözik a legtöbb programozási nyelvtől, mint a C/C++, ahol az egész programot gépi kódra kell fordítani, és futtatható fájllá kell szerkeszteni, mielőtt a program elindulhat.

A JIT fordítók egyszer fordítják le a bájtkódot, és a gépi kód újra és újra felhasználható a futtatás sebességének növelésére. Emiatt akár lehetne a JIT fordítók neve "csak egyszer" fordítók ("compile only once" compilers, COO vagy "just-one-time" compilers, JOT). A korai Java rendszerek a bájtkódot annyiszor fordították gépi kódra, ahányszor csak használtuk őket, ezért ez lassú volt. Azonban még mindig gyorsabb volt, mint az olyan értelmezett nyelvek esetén, ahol a kódot magas szintű nyelvből fordították, és nem bájtkódból.

A függő osztályok automatikus fordításaSzerkesztés

Javában, ha egy másik osztályra hivatkozol, akkor ez az osztály automatikusan fordításra kerül, ha eddig ez még nem történt meg. Ez az automatikus fordítás rekurzív, tehát addig folytatódik, amíg az összes, a futtatáshoz szükséges osztályt le nem fordítjuk. Tehát elegendő csupán a legfelső szintű osztályt lefordítani, ezzel az összes függő osztályt is lefordítjuk.

javac ... MainClass.java

Azonban nem támaszkodhatunk erre a tulajdonságra akkor, ha reflexióval hozunk létre objektumokat, ha servletet fordítunk vagy jar csomagot készítünk. Ezekben az esetekben az közvetlenül fel kell sorolni az összes ilyen osztályt.

javac ... MainClass.java, ServletOne.java, ...

A legjobb módszer azonban az, ha egy segédprogramot használunk a fordításhoz. Egy ilyen eszköz képes ellenőrizni a függőségeket, és csak a szükséges osztályokat fogja lefordítani. Jelenleg az Ant a legjobb és a legelterjedtebb eszköz erre a célra. Az Ant használatával a következő paranccsal lehet elindítani a fordítást:

ant build.xml

Az xml fájl az összes információt tartalmazza, ami az alkalmazás elkészítéséhez szükséges.

Ezen kívül az alkalmazások fordításához használt másik népszerű módszer az IDE-k használata. Az IDE jelentése Integrated Development Environment, azaz integrált fejlesztő környezet. Ezekről lesz szó később.

Csomagok és alkönyvtárakSzerkesztés

Minden Java osztály egy csomaghoz (package) tartozik. (Erről később még lesz szó a Csomagok fejezetben. Ezt a package kulcsszó után adhatjuk meg a forrás fájlok elején. Ha ezt nem tesszük meg, akkor az osztályunk egy névtelen csomaghoz fog tartozni.

A fordításhoz a fájloknak a megfelelő könyvtárszerkezetben kell lenniük. Ha egy fájl egy névtelen csomaghoz tartozó osztályt tartalmaz, akkor az aktuális könyvtárban kell lennie. Ha egy osztály egy csomaghoz tartozik, akkor egy olyan alkönyvtárban kell lennie, aminek a neve megegyezik a csomag nevével.

Egy általánosan elterjedt konvenció szerint a csomagnevek és a hozzájuk tartozó alkönyvtárak nevei csak kisbetűkből állnak.

PéldákSzerkesztés

Felső szintű csomagokSzerkesztés

Egy ilyen csomaghoz tartozó osztályban a következő alakú deklarációnak kell lennie:

package example;

és a következő nevű alkönyvtárban kell lennie:

example

AlcsomagokSzerkesztés

Egy osztálynak, aminek a csomag deklarációja

package org. wikibooks.en;

egy olyan alkönyvtárban kell lennie, melynek neve

en

ami az alkönyvtára egy

wikibooks

alkönyvtárnak, ami pedig az

org

mappában található, tehát a kapott könyvtárszerkezet:

org/wikibooks/en

FájlnevekSzerkesztés

Egy Java forrásfájl nevének meg kell egyeznie a benne található publikus osztály nevével. Egy fájlban csak egy publikus osztály deklarálható. A Java osztályok nevei, akárcsak a forrásfájlok nevei, érzékenyek a kis- és nagybetűk közötti különbségekre.

Egy általánosan elfogadott elnevezési konvenció szerint az osztályok nevei nagybetűvel kezdődnek.

További eszközökSzerkesztés

IDESzerkesztés

Ebben a részben szólunk egy keveset néhány különböző IDE programokról, ezek erősségeiről ill. gyengeségeiről.

JBuilderSzerkesztés

Ez az eszköz a Borland nevű cég IDE programja. Egyik előnye az integrált modellező eszköz.

JCreatorSzerkesztés

Erről a http://www.apcomputerscience.com/ide/jcreator/index.htm oldalon találhatunk információkat.

EclipseSzerkesztés

Az Eclipse egy ingyenes IDE, valójában egy fejlesztőeszköz keretrendszer, ami kibővíthető az adott fejlesztői igényeknek megfelelően. A szoftver egyik legfőbb támogatója az IBM, tulajdonképpen erre cserélte le az IBM a Visual Age nevű szoftverét. Az alapötlet az volt, hogy készítsenek egy szabványos kinézetet, ami kibővíthető. Ez a bővíthetőség az, ami megkülönbözteti az Eclipse-et a többi IDE-től. Az Eclipse-et a Microsoft Visual Studio eszközök versenytársának szánták. A Microsoft eszközök egy szabványos fejlesztési módszert adnak a Microsoftos világhoz. Az Eclipse egy hasonló szabványos fejlesztési módot szeretne adni a Java világához, eddig nagy sikerrel.

Az Eclipse-nek két fő célja van:

  • egy szabványos IDE készítése kódfejlesztéshez
  • legyen egy kiindulópont, más szabványos eszközök készítéséhez

Az Eclipse képezte néhány későbbi IBM termék alapját, mint például az IBM WSAD vagy az IBM Rational Software Development.

Az Eclipse néhány tulajdonsága:

  • szabványos ablakkezelés (perspektívák, nézetek, böngészők, ...)
  • hibaellenőrzés beíráskor
  • súgó beíráskor (a . vagy a <ctrl>+<space> billentyűk lenyomásakor)
  • automatikus fordítás
  • beépített debugger
  • forráskód generálás (get és set metódusok, ...)
  • keresés (implementációk, referenciák)
  • Kód refactoring
  • plig-in alapú architektúra (hogy a környezethez és más eszközökhöz hasonló integrált eszközöket készíthessünk

További információk:

NetBeansSzerkesztés

A NetBeans egy ingyenes IDE. Jelenleg a Sun terméke, Java Platformon fut. Egyszerű a telepítése és a használata. A NetBeans rengeteg olyan eszközt tartalmaz, amire a fejlesztőknek szüksége lehet hordozható, enterprise, web vagy akár mobil alkalmazások készítésére is.

További informáicók a http://www.netbeans.org honlapon érhető el.

AntSzerkesztés

Az Ant egy fordítást menedzselő eszköz, amit a MAKE helyettesítésére találtak ki, nagy Java alkalmazások automatikus fordításához. A Javához hasonlóan, és a MAKE-től eltérően, ez egy platform független eszköz.

Egy Java alkalmazás elkészítése többféle feladatot foglal magába. Ez nem csak a kód fordítását jelentheti, hanem többek között másolást, jar csomag készítését, EJB létrehozását, automatikus tesztek elindítását, stb. Ilyen feladatokhoz feltételeket is megadhatunk, például csak a megváltozott forráskódokat fordítsuk le, vagy egy feladatot csak akkor hajtsunk végre, ha még ezt nem tettük meg korábban. A feladatok közötti függőségek megadásával biztosíthatjuk, hogy a feladatok végrehajtása a megfelelő sorrendben történik. Például ha a jar fájlba csomagolás előtt fordítást akarunk végrehajtani, akkor a jar-csomagolási feladat függ a fordítási feladattól.

A feladatokat és a közöttük lévő függőségeket egy "build.xml" fájlban adhatjuk meg. Az Ant program ezt fogja értelmezni, és végrehajtja a benne leírtakat. Ez az eszköz sokkal hatékonyabb lehet mint a MAKE. Mivel a Java kódok a csomagoktól függően nagyon szét tudnak szóródni a fájlrendszerben, a MAKE használata nagyon kellemetlen lehet.

Az Ant programot Java nyelven írták, és kibővíthető, tehát ha van olyan feladat, amit végre szeretnél hajtani a fordítás során, és ez nincs rajta az előre megadott feladatlistán, akkor megírhatód azt te magad. Nagyon egyszerűen össze lehet kapcsolni a saját kódunkat a többivel. A mi kódunknak rajta kell lennie a keresési útvonalon (classpath), és az Ant futási időben be fogja tölteni. A saját feladatunk kódjának alkalmazkodnia kell az Ant keretrendszeréhez, ez minden.

Az Ant projekt weboldala: http://ant.apache.org

A JIT fordítóSzerkesztés

A JIT fordító csak akkor fut le, amikor arra szükség van. Amikor egy metódust többször is meghívunk, akkor a JIT fordító elemzi a bájtkódot, és hatékony gépi kódot hoz létre, ami nagyon gyorsan fut. A JIT fordító elég okos ahhoz, hogy felismerje, ha egy kódot már lefordított, így az alkalmazás futása során a fordítás csak szükség esetén történik meg. A Java alkalmazások a futásuk során egyre gyorsabbá és gyorsabbá válhatnak, mert a JIT futási idejű elemzést és optimalizálást hajt végre, hogy alkalmazkodjon a futtató környezethez. Azokat a metódusokat és kódrészleteket, amik kevesebbszer kerülnek végrehajtásra, kevésbé fogja optimalizálni. A gyakran végrehajtandó kódrészeket (amiket hotspotnak nevezünk) többször elemzi, és jobban optimalizálja őket.