Elméleti alapozás
A programozási nyelvek
Először is gyorsan tisztáznunk kell a hardver és szoftver közti fogalomkülönbséget.
A hardver a számítógép teste, annak minden megfogható alkatrésze:
Ebben a minőségében azonban tökéletesen élettelen. Nem számítva a kötelező áramellátást, a szoftver az, ami „életet lehel” belé, azaz ami működteti. A szoftver valamilyen célra előre megírt programot jelent. A szoftver mozgatja a hardvert, hasonlóan a régi latin mondáshoz:
Mens agitat molem – A szellem mozgatja az anyagot.
A szoftver tehát a hardver „lelke”.
A szoftverek valamilyen programozási nyelven íródnak, ám ezek a nyelvek különböző szintűek. Lássuk a legalsó, gépi szintet!
A számítógép 0 és 1 jelértékek felhasználásával működik (ezek a bitek). A számítógép gépi szintű működése nem más, mint nagyon gyors és szinte végtelen bitfolyam. Úgy is mondhatjuk, hogy a számítógép kettes (bináris) számrendszert használ fel számításai során, amely azonban számunkra rendkívül nehezen értelmezhető és követhető:
…0001110010101111000111010101111…
A számítógép legfontosabb része a (mikro)processzor, ez a számítógép agya, ez hajtja végre a szoftveres utasítások túlnyomó részét.
A processzor azonban csak 0 és 1 bitek sorozatából ért, ez a gépi (natív) kód szintje. Ez a kódszint az átlag felhasználó számára nem elérhető és értelmezhetetlen, jogos tehát az igény olyan, magasabb szintű kommunikációs felületek használatára, amelyek segítségével a felhasználó már képes kommunikálni (programot írni) a számítógép számára. Ehhez az első lépés az alacsony szintű programozási nyelvek régiója, a legismertebb közülük az Assembly-nyelv.
Egy Assembly-utasítás (mnemonic) már több gépi kódú utasítást foglal magába, de a programok írása még így is eléggé nehézkes (az alábbi képen a mnemonikok balról a 2. oszlop nagybetűs utasításai):
Az alábbi képen néhány mnemonik-utasítást tanulmányozhatunk magyarázataival együtt (bal oszlop), azonban az érdekesség az, hogy a jobb oldali oszlopban az utasítás gépi kódja is látható:
A rövid utasítások miatt egy Assembly-kód –mivel szintben nagyon közel helyezkedik el a processzort működtető gépi kódhoz-, rendkívül gyors. Egy Assembly-kódot azonban már nem lehet közvetlenül futtatni, előtte le kell fordítani egy úgynevezett assembler programmal:
Az assembler tehát az Assembly-ben megírt utasítássorozatot (programot) gépi kóddá alakítja át (vagy visszafejti: a kódfeltöréseket általában ilyen programokkal végzik). Nézzük meg az alacsony szintű programozás előnyeit és hátrányait:
-
a megírt kód gyorsabban fut,
-
kisebb a helyfoglalása,
-
minden olyan feladat, amely hardverközelséget igényel, csakis így oldható meg,
-
programozás-technikailag rendkívül aprólékos munkát igényel,
-
a keletkezett kód nehezen érthető és értelmezhető,
-
nagyon erősen processzortípus-függő, gyakorlatilag minden egyes utasításkészlet-típusra külön-külön meg kell írni a programot.
A fejlesztői felület kialakítása később általános eljárás lesz a programozási nyelvek esetében: mindig kell majd egy fordító (compiler-linker) vagy interpreter, amelyik a megírt programot átfordítja gépi kódra.
Ezt a programozási nyelv megírására, szerkesztésére szolgáló különleges program (editor) legtöbbször már tartalmazza; ez a szoftveregyüttes a programozók legfontosabb munkaeszköze, bármilyen nyelvről is legyen szó.
Az Assembly-mnemonic tehát adott szinten összefoglal néhány gépi kódú utasítást, azonban már viszonylag hamar felmerült az igény még magasabb szintű programozási nyelvek megalkotására. Például: mi volna, ha a nyelv már beépítetten (natívan) tartalmazna egy olyan lehetőséget, amely megkeres valamit valahol?
Írjuk le ezt a jogos igényt álkódban (pszeudokód):
Keress(valamit, valahol){
Keresésindítás();
HA (megtaláltad){
Listázd ki a tartalmat a képernyőre();
}
MÁSKÉNT
Küldj hibaüzenetet a képernyőre();
}
Vegyük észre, hogy ez az utasítás itt csupán néhány gépelt sor, az Assembly-ben néhány 100, míg gépi kód szintjén akár több 1000 sor lehet!
Ilyen és ehhez hasonló gondolatok, szándékok, valójában a programozási ötletek egyre mélyebb és bonyolultabb tárháza, illetve a valós élet kihívásai hívták életre a magas szintű programozási nyelveket. A cél az volt és a jövőben is az fog maradni, hogy a programozási nyelvek minél közelebb kerüljenek emberi gondolkodás paneljeihez. Mivel azonban az emberi gondolkodás sokféle és komplex, valamint legtöbbször cél-, és feladatorientált, a magas szintű programozási nyelvek fejlődése is hasonló jelleget öltött.
Teljesen logikus, hogy a programozás fejlődése egyértelműen maga az emberi gondolkodás fejlődését jelenti.
Ebben az evolúcióban a Java-nyelv az egyik aktuális intellektuális csúcsot képviseli. Minden megtalálható benne, ami a rendkívül magas szintű programozási szemlélet fellegváraiban egyáltalán kialakulhatott, ezért kezdők számára viszonylag nehéz a megértése. Aki viszont rászánja az időt, a pénzt és az energiát, az cserébe egy csodálatos, valóban kreatív szakmát és vele versenyképes fizetést kap ajándékul. Ráadásképpen jelzem: ez a jövő. Előbb-utóbb mindent számítógép fog működtetni, ehhez pedig jó programozók kellenek…