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.cmd | OS/2 | NetREXX programok fordítása Java bájtkódra és a -run opció megadása esetén azok automatikus futtatása. |
| nrc.cmd | OS/2 | A NetRexxC.cmd rövidítése. |
| NetRexxC.bat | Windows | A 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.bat | Windows | A 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ó: |
| -keep | Ezen paraméter megadásakor a compiler elmenti a NetREXX kódból generált köztes Java fájlt .java.keep kiterjesztéssel. |
| -nocompile | Ennek 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. |
| -noconsole | Letiltja a compiler üzenetek megjelenítését a képernyôn (console). |
| -savelog | Elmenti a compiler üzeneteit a NetRexxC.log fájlba. |
| -time | A 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ó: |
| BINARY | nobinary | Aktivizálja a bináris osztálykezelést. Az elôzô leckében már részletesen volt szó errôl az opcióról. |
| CROSSREF | crossref | Aktivizá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. |
| DIAG | nodiag | Aktivizá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). |
| FORMAT | noformat | Olvasható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! |
| LOGO | logo | Bekapcsolja a compiler verziószámát megjelenítô sor kijelzését. |
| REPLACE | noreplace | A 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. |
| STRICTARGS | nostrictargs | Kö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. |
| STRICTASSIGN | nostrictassign | Bekapcsolja 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. |
| STRICTCASE | nostrictcase | Bekapcsolja a compiler azon ellenôrzési mechanizmusát, amely a kis és nagybetûk helyes használatát teszteli. |
| STRICTSIGNAL | nostrictsignal | Aktivizá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. |
| TRACE | trace | Engedélyezi a hibakövetéshez használt információk automatikus generálását. |
| UTF8 | noutf8 | Engedé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] | verbose3 | Ez 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 ] |