II. A NetREXX compiler

Bevezetés

Az elsô leckében láttuk, hogy a NetREXX-ben írt programokat a NetRexxC vagy nrc parancsok segítségével fordítottuk le és futtattuk. Ebben a leckében megismerkedünk a parancsok mögött álló NetREXX fordítóprogrammal (compiler).

A NetREXX parancsfájlok

A NetREXX csomag tartalmaz néhány parancsfájlt, amelyekkel a programok fordítása és futtatása kényelmesebbé tehetô:

Programfájl:Platform:Funkció:
NetRexxC.cmdOS/2NetREXX programok fordítása Java bájtkódra és a -run opció megadása esetén azok automatikus futtatása.
nrc.cmdOS/2A NetRexxC.cmd rövidítése.
NetRexxC.batWindowsA NetRexxC.cmd DOS változata a Windows alapú operációs rendszerek számára. Vigyázzunk a -run opció használatával, ez ugyanis érzékeny a nagy és kisbetûk közötti különbségekre és az elsô argument kell, hogy legyen.
nrc.batWindowsA NetRexxC.bat rövidítése.

Mint a táblázatból is kitûnik, a segédprogramok csak OS/2-n vagy Windows-on mûködnek. Egyéb platformokon magunknak kell gondoskodni a fenti programok hordozásáról, vagy minden esetben ki kell adni a java COM.ibm.netrexx.process.NetRexxC [file.nrx] (fordítás) és java [file] (futtatás) parancsokat.

Mi történik a színfalak mögött?

A NetRexxC tulajdonképpen egy Java osztály a COM.ibm.netrexx.process csomagból. Mivel main metódussal is rendelkezik, ezért önálló Java alkalmazásként is futtatható (java COM.ibm.netrexx.process.NetRexxC):

C:\>java COM.ibm.netrexx.process.NetRexxC
NetRexx portable processor
Copyright (c) IBM Corporation, 1999.  All rights reserved.

Arguments are: in_file_specification... [-option]...

NetRexxC-specific options are:

  -nocompile = do not compile, and -keep the .java file
  -noconsole = do not display messages on console
  -keep      = keep the java file (as xxx.java.keep)
  -savelog   = save messages in NetRexxC.log
  -time      = display timings

Any NetRexx options may be added; please see NetRexx documentation.

Mint ahogy az a program kimenetébôl is látható, a fordítóprogram két fajta paramétert fogad el, a fordítandó fájlok neveit és bizonyos opciókat. Figyeljük meg, hogy a -run opciót nem ismeri a fordítóprogram, az ugyanis a NetRexxC/nrc szkriptek szolgáltatása. A fordítóprogram által visszaadott hibakódok értéke 0, 1 vagy 2 lehet. A 0 visszatérési érték problémamentes fordítást jelent. Az 1 figyelmeztetô üzeneteket (warning), a 2 pedig hibát (error) jelent. Ez utóbbi esetben mindig kapunk valamilyen hibaüzenetet is, és a NetREXX kódból generált köztes Java kód (.java kiterjesztéssel) is megmarad. Ezzel a félmondattal már el is árultuk (amit eddig is mindenki sejtett), hogy a compiler a Java bájtkód (.class) elkészítése elôtt a NetREXX kódot átalakítja Java kódra, amelyet aztán a Java környezet vesz kezelésbe. Amennyiben az átalakítás közben hiba merül fel, akkor az alábbihoz hasonló üzenetet kaphatunk:

NetRexx portable processor, version 1.00
 Copyright (c) IBM Corporation, 1997. All rights reserved.
 9 +++ elect
 +++ ^^^^^
 +++ Error: keyword.expected (sorry, full message unavailable)

Ez a hibaüzenet sajnos nem túl informatív. A NetREXX a Java-hoz hasonlóan egy .properties kiterjesztésû fájlban tárolja a hibaüzeneteit (tk. ez az OS/2-es .msg fájl megfelelôje), s ezt OS/2 alatt a NETREXX_HOME környezeti változó által meghatározott könyvtár, LIB alkönyvtárában keresi a fordító. A NETREXX_HOME könyvtár általában megegyezik a Java könyvtárral, ám ha bizonytalanak vagyunk, akkor a megfelelô könyvtárat megadhatjuk a java parancs -D paraméterével is:

java -Dnetrexx.home=d:\NetRexx COM.ibm.netrexx.process.NetRexxC [file.nrx]

Windows alatt a Java könyvtár LIB alkönyvtárában kell elhelyezni a NetREXX csomagban letöltött .properties fájlt. Ha sikeresen elkészült a .java fájl, akkor a NetREXX compiler a Java compiler (javac, a Java toolkit része) segítségével készíti el a Java bájtkódot. Elôfordulhat, hogy a NetREXX által készített Java programban hiba van, és így nem sikerül a bájtkód elkészítése. Ilyenkor sajnos elô kell venni Java tudásunkat és bele kell nyúlni a .java fájlba. Amennyiben újrafordítjuk egy sikertelen kísérlet után a NetREXX fájlt, akkor elôbb le kell törölni a visszamaradt .java fájlt, vagy használni kell a compiler REPLACE opcióját.

A NetREXX fordítóprogram main metódusát akár egy másik NetREXX programból is meghívhatjuk:

argument = 'factor -nocrossref'
rc = COM.ibm.netrexx.process.NetRexxC.main(argument)

A fenti kódrészletben pl. a factor.nrx fájlt fordíttatjuk le a nocrossref opcióval.

A fordítóprogram opcionális paraméterei

Mint azt már elôzô példáinkban is láttuk, a fordítóprogramnak a parancssorban is megadhatók bizonyos paraméterek. Ezeket a paramétereket és azok jelentését összefoglaltuk az alábbi táblázatban:

Paraméter:Funkció:
-keepEzen paraméter megadásakor a compiler elmenti a NetREXX kódból generált köztes Java fájlt .java.keep kiterjesztéssel.
-nocompileEnnek a paraméternek a hatására a compiler megáll a Java kód generálása után, hogy a felhasználó az igényének megfelelô Java fordítóval tudja tovább fordíttatni a programját.
-noconsoleLetiltja a compiler üzenetek megjelenítését a képernyôn (console).
-savelogElmenti a compiler üzeneteit a NetRexxC.log fájlba.
-timeA compiler megmondja az egyes fordítási fázisokhoz felhasznált idôt.

A csak parancssorban megadható paramétereken kívül a programfájlba helyezett OPTIONS [opció] utasításokkal is befolyásolhatjuk a compiler mûködését. Természetesen ezeket a paramétereket megadhatjuk a parancssorban is. Ha ki akarjuk kapcsolni valamelyik opciót, akkor a no szócskát kell az opció neve elé tenni (pl. nrc -run -nocrossref [file.nrx], ha ki akarjuk kapcsolni a keresztreferencia-fájl készítését). Az alábbi táblázatban összefoglaltuk a megadható értékeket:

Paraméter:Default érték:Funkció:
BINARYnobinaryAktivizálja a bináris osztálykezelést. Az elôzô leckében már részletesen volt szó errôl az opcióról.
CROSSREFcrossrefAktivizálja a keresztreferencia-fájl készítését. Ebben a fájlban megtalálható az osztályok által használt változók teljes listája. A file a .crossref kiterjesztést kapja.
DIAGnodiagAktivizálja a diagnosztikai információ generálását (egyfajta debug funkció, a mûködést magától értetôdôen lassítja).
FORMATnoformatOlvashatóbbá teszi a generált Java kódot üres sorok és szóközök beiktatásával. A funkció hátránya az, hogy a sorszámok eltolódnak, így hibajelzés esetén nehezebb lesz megtalálni a NetREXX fájlban a hibás sort!
LOGOlogoBekapcsolja a compiler verziószámát megjelenítô sor kijelzését.
REPLACEnoreplaceA compiler fölülírja az esetleg már létezô .java fájlt új fordítás esetén. Vigyázzunk vele, mert engedélyezése esetén észrevétlenül fölülírhatunk egy esetleg értékes, azonos nevû Java programot.
STRICTARGSnostrictargsKötelezôvé teszi a programozó számára a zárójelek használatát a metódusok meghívásakor. Ez az opció elôsegíti a kód jó olvashatóságát, ezért ajánlott a használata.
STRICTASSIGNnostrictassignBekapcsolja a compiler igen szigorú típusellenôrzési opcióját. Az ellenôrzés szigorúbb, mint a Java compiler által végzett ellenôrzés. Nagyon hasznos, ha pl. optimalizáció céljából rejtett konverziókat akarunk felderíteni programunkban.
STRICTCASEnostrictcaseBekapcsolja a compiler azon ellenôrzési mechanizmusát, amely a kis és nagybetûk helyes használatát teszteli.
STRICTSIGNALnostrictsignalAktivizálja a váratlan esemény (exception) lekezelés hiányának jelzését. Használata erôsen javallott, mivel elôsegíti a helyes programozási stílus kialakulását.
TRACEtraceEngedélyezi a hibakövetéshez használt információk automatikus generálását.
UTF8noutf8Engedélyezése esetén a forráskódot UTF-8 forráskódként kezeli a compiler. Az UTF-8 kódolás az unicode karakterekkel kapcsolatos kódolási eljárás.
VERBOSE[n]verbose3Ez az opció a compiler bôbeszédûségét szabályozza. Az n értéke 0-tól 5-ig terjedhet. A NOVERBOSE érték a VERBOSE0-nak, vagyis a teljesen kikapcsolt kísérôszövegek esetének felel meg. A hibaüzenetek természetesen ekkor is megjelennek fordítás közben.

Ha véletlenül egy opció értékét két, vagy több helyen is beállítottuk, akkor az utolsó beállítás értéke lesz az irányadó. Elgépelt opciók a forrásfájlban nem kerülnek feldolgozásra, mivel a compiler ilyen esetben azt hiszi, hogy egy újabb NetREXX verzió által használt opcióról van szó, ezért egészen egyszerûen figyelmen kívül hagyja. Parancssorban megadott hibás opciók viszont azonnal hibaüzenetet produkálnak.

A compiler telepítése

A NetREXX csomag kétféle kiszerelésben terjed. Az egyik kiterjesztése .zip, amely a PC-s ZIP archívumot jelöli. A másik fajta kiszerelés kiterjesztése a .tar.Z, amely a UNIX rendszerek tömörített szalagos archívumát jelenti. Bármelyik csomagot is használjuk, a kitömörítésénél figyeljünk oda, hogy az archívumban tárolt, a kis és nagybetûk különbségére érzékeny, hosszú nevû fájlokat és a teljes könyvtárstruktúrát is visszakapjuk. Sikeres kibontás után kapnunk kell egy NetRexx alkönyvtárat, amelynek tartalmaznia kell a dokumentációt, a példaprogramokat, a csomagokat és a végrehajtható programokat.

A kicsomagolás után találnunk kell egy nrtools.zip vagy nrtools.tar.Z fájlt, amely többek között a compilert is tartalmazza. Másoljuk át az nrtools fájlt a Java motor fôkönyvtárába, majd pedig bontsuk ki! Ennek hatására keletkezni kell egy NetRexxR.zip (NetREXX runtime) és egy NetRexxC.zip (compiler osztályok) fájlnak a LIB alkönyvtárban. A BIN alkönyvtárban is keletkezik néhány új fájl, pl. hello.nrx, NetRexxC.cmd, nrc.bat, stb. Ahhoz, hogy a Java megtalálja az új osztályokat, ki kell egészíteni a CLASSPATH környezeti változót a NetRexxC.zip teljes elérési útvonalával. Ha pl. a NetRexxC.zip a C:\Java11\lib\NetRexxC.zip útvonalon érhetô el, akkor Windows alatt az AUTOEXEC.BAT, OS/2 alatt pedig a Config.Sys-ben található SET CLASSPATH sort kell kiegészíteni a C:\Java11\lib\NetRexxC.zip szöveggel. NT alatt a Control Panel, System, Environment fül, System Variables, CLASSPATH útvonalon ejthetô meg a változtatás. šgyeljünk az elérési útvonalban a kis és nagybetûk közötti különbségre is, ugyanis a Java nyelv ugyanis erre nagyon érzékeny! Amennyiben mindent jól csináltunk, akkor (többnyire a rendszer újraindítás után) a java/bin könyvtárban kiadott java COM.ibm.netrexx.process.NetRexxC hello, majd java hello parancsokkal futtatni kell tudni a NetRexx csomag hello példaprogramját. Probléma esetén nézzük át a NetREXX-hez mellékelt dokumentációt, ebben ugyanis további hasznos, a telepítéssel és a telepítés közben felmerült problémákkal kapcsolatos információt találunk.


REXX GYÍK:

K1. Futtatás közben bizonyos NetREXX példaprogramokra azt mondja a Java környezet, hogy void main(String argv[]) is not defined. Hibás lenne a példaprogram?
V1. Nem. Ez csak azt jelenti, hogy nem Java alkalmazásról, hanem programocskáról (applet) van szó, amely csak ezen appletek futtatására alkalmas böngészôben, vagy applet nézegetôben futtatható.

K2. A compiler telepítése után futtatnám a hello példát, ám a következô üzenetet kapom: Can't find class COM.ibm.netrexx.process.NetRexxC....
V2. Ez a hiba azt jelenti, hogy a Java motor nem találja a NetRexxC.zip fájlba csomagolt osztályokat, így magát a NetREXX compilert sem. Ez arra utalhat, hogy nem adtuk meg helyesen a CLASSPATH környezeti változó értékét, vagy a NetRexxC.zip nincs az ott megadott könyvtárban.


Gyakorlatok:

1. Telepítse gépén a NetRexx compilert és futtassa a mellékelt példaprogramokat!

2. Próbálja ki, hogy hogyan viselkedik a compiler az egyes opciók be illetve kikapcsolásakor!

Kádár Zsolt
1999. 12. 25.
[ Elôzô lecke | Következô lecke | Tartalom ]