Programszegmentálás
A programszegmentálás lehetővé teszi, hogy a
felhasználó overlay (átlapolt) módon működő tárgyprogramokat
generáltasson a fordítóprogrammal (overlay technika: a lefordított
program egymástól többé-kevésbé független szegmensekre oszlik, és ezek
közül csak azok vannak benne a memóriában, amelyekre éppen szükség
van). A COBOL programoknak csak az eljárási főrésze szegmentálható. A
felhasználó a szegmentálási igényeit a környezetleíró főrészben és az
eljárási főrészben fejezi ki. Láthattuk eddig, hogy az eljárási főrész
részekből építhető fel. Szegmentált programok esetében kötelezően több
részből áll.
A teljes tárgyprogramot szegmentálás szempontjából két
részletre osztjuk:
- Rögzített programrész, a tárgyprogramnak az a részlete,
amelyet logikailag úgy tekintünk, hogy állandóan az operatív memóriában
helyezkedik el.
- Független szegmensek, a program olyan
részei, melyek felülírhatók, és felülírhatnak akár másik független
szegmenst, akár rögzített szegmenst.
Kialakítási szempontok:
- Logikai követelmények: A gyakran használt részek
tartozzanak
valamelyik permanens szegmensbe. A kevésbé használt részeket valamelyik
független szegmensbe sorolhatjuk, vagy valamelyik felülírható rögzített
szegmensbe, a felhasználási módjuktól függően.
- A felhasználás gyakorisága: Minél többször
hívunk egy részt, annál kisebb prioritásszámot kell neki adni. A
legritkábban használt részekhez célszerű a legnagyobb prioritásszámot.
- Részek egymással való kapcsolata: Az
egymással gyakran kommunikáló részeknek adjunk azonos prioritásszámot.
Az egyenlő prioritásszámú részek halmaza alkot egy programszegmenst.
Résznév SECTION [prioritásszám]
A prioritásszám 0-99 közötti egész szám. Ha egy rész fejében
prioritásszám nem szerepel, akkor az 0. 0-49 között a szegmensek a
rögzített programrészhez tartoznak, 50-99-ig vannak a független
szegmensek.
COBOL szabványok
- COBOL-60 (a nyelv első változata)
- COBOL-68
- COBOL-74
- COBOL-85
- COBOL-2002
- legújabb
- bevezette a felhasználó által definiálható függvényeket
- Unicode-ot vezette be
- megjelent a dinamikus memória allokálás
- adat helyesség ellenőrzése a VALIDATE igével történik
- COBOL-2008 (állítólag erre tervezik, lesz benne függvény
pointer, metódus túlterhelés, dinamikus táblák...)
Forditók POSIX rendszerekhez
Ha COBOL-ban szeretnénk programozni, és nem áll rendelkezésünkre Linux környezet, valamint betervezett plusz órák arra, hogy egy compilert forráskódból forditsunk le az operációs rendszerünkhöz, majd hibakereséssel töltsük az időnket, akkor a következő projektek nem jó választások:
OpenCOBOL
C nyelvre forditja le a COBOL forrásfájlokat, majd GCC-vel fordit tovább. Ehhez szükségünk van az operációs rendszerünknek megfelelő GCC forditói környezetre, és egy sor segédkönyvtárra. Mindez azért, mert az OpenCOBOL-t UNIX környezetre tervezték, nem Linux-ra, vagy Windows-ra. A projekt hivatalos oldalán találhatunk részletes leirást arról, hogy milyen lépéseken kell keresztül mennünk ahhoz, hogy végül sikerrel használhassuk a compilert:
opencobol
Tiny COBOL
Ez a projekt COBOL 85 sztenderd forditón dolgozik. Használható FreeBSD-n, Linux-on és Windows-on. Ez utóbbi operációs rendszerhez azonban szintén kell MinGW környezet, vagyis gyakorlatilag egy emulált *nix forditói környezet, egy sor segédkönyvtárral. További információt ezen a linken lehet találni:
tiny cobol
z390 forditó Windows-hoz
Ha célnak azt tűztük ki, hogy megismerkedjünk a COBOL világával, a nyelv alapjaival, és nem szeretnénk bonyolult forditó környezetet felépiteni hozzá - ráadásul Windows operációs rendszert használnánk - akkor a "z390 Portable Mainframe Assembler and Emulator Project" COBOL compilerét használhatjuk minderre. A rendszer J2SE alapú, ez az egyetlen függőség, amelyet telepitenünk kell. A projekt itt található:
zcobol
A z390 projekt céljai:
- grafikus és konzolos felhasználói felületet biztositani a forditáshoz
- egyszerű parancsokkal elvégezni a forditást, linkelést és végrehajtást
- világos és érthető példaprogramokkal szemléltetni a kezdők számára is az adott nyelveket
- HLASM kompatibilitás
- bárki számára elérhető rendszert fenntartani - GNU license-el
z390 COBOL telepitése
Mielőtt belekezdünk a telepitésbe, győződjünk meg arról, hogy a legfrisebb Java Standard Edition 1.6 telepitve van a rendszerünkre. A telepitéshez szükséges csomagot Windows-hoz ezen a linken érjük el:
zcobol telepitő
Érdemes telepitési útvonalnak valamelyik partició gyökérkönyvtárát megadni, mondjuk a C:\z390 egy jó választás.
Miután végigkattintgattuk a varázslót, a compiler készen áll a használatra. Ezt úgy ellenőrizhetjük le, hogy a telepitési mappában található Z390.bat fájlt elinditjuk. Egy java alapú grafikus felhasználói felületet kapunk, amelybe parancsokat irhatunk, és azok kimenetét olvashatjuk. Irjuk be a következő parancsot:
ZC390CLG zcobol\demo\HELLO
Ez a szokásos "Helló világ!" program COBOL implementációját futtatja le nekünk. A zcobol\demo mappában a következő tanulást segitő példaprogramokat találhatjuk meg:
- COPYFILE: egy szekvenciális input fájl tartalmát másolja át egy szekvenciális output fájlba, miközben a sorok számát ellenőrzi
- DATETIME: az aktuális dátumot kéri be az operációs rendszertől, és irja ki
- HELLO: a fent emlitett "Helló világ!" program
- POWERS: 2 hatványait számolja és irja ki 127-ig
Részletesebben a z390 forditóról
A forditó a következő három komponenst használva készit futtatható állományt COBOL forrásfájlokból:
- A z390.jar-ban találhato zc390 program beolvassa a COBOL forráskódot a CBL kiterjesztésű fájlokból, és z390 HLASM kompatibilis mainframe assembler forráskódot generál belőle MLC kiterjesztéssel. Minden COBOL ige egy makró hiváskóddá alakul, és minden szó az ige után pozicionális paramétere lesz ennek a makróhivásnak. A kötőjeleket aláhúzássá alakitja a program, kivéve, ha idézőjelek között állnak.
- A makrók a z390\zcobol\*.mac fájlokban találhatóak, és ezekből készül futtatható kód.
- Jelenleg 4 opcionális zcobol futtatható kódot generáló makró könyvtár létezik:
- z390\zcobol\z390 - zcobol kódgeneráló makrók HLASM nativ z9/10 kódhoz
- z390\zcobol\java - zcobol kódgeneráló makrók for J2SE Java-hoz
- z390\zcobol\vce - zcobol kódgeneráló makrók MS Visual Express C++ rendszerhez
- z390\zcobol\i586 - zcobol kódgeneráló makrók HLA és MASM nativ Intel kódhoz
A cél a COBOL 85 sztenderd elérése HLASM kód generálásával. Ezután a többi könyvtár fejlesztése következik.
zcobol forditó parancsai
- ZC390 - COBOL CBL kiterjesztésű forrásfájt MLC fájlra fordit
- ZC390C - CBL forrásfájlt HLASM BAL fájlra fordit
- ZC390CL - CBL forrásfájlt HLASM BAL fájlra fordit, és a z390 betöltő modulhoz linkel
- ZC390CLG - CBL forrásfájlt HLASM BAL fájlra fordit, és a z390 betöltő modulhoz linkel, majd futtatja az állományt
- ZCJAVCLG - CBL forrásfájlt J2SE java-ra fordit, és futtatja az osztályt
- ZCVCECLG - CBL forrásfájlt MS Visual C++ fájlra fordit, linkel, and futtat
- ZC586CLG - CBL forrásfájlt HLA/ASM fájlra fordit, linkel, and futtat
- ZCRT390.BAT - lefuttatja a "zcobol to HLASM" demo programokat
- ZCRTJAV.BAT - lefuttatja a "zcobol to Java" demo programokat
- ZCRTVCE.BAT - lefuttatja a "zcobol to C++" demo programokat (szükséges hozzá MS Visual Express 2008 installáció)
- ZCRT586.BAT - lefuttatja a "zcobol to HLA/masm" demo programokat (szükséges HLA and MASM installációk)
- ZCRTTEST.BAT - lefuttatja a "zcobol to HLASM" regressziós teszteket
- ZCRTSAVE.BAT - elmenti a regressziós tesztek által generált fájlt, ha változást talál bennünk
Minden parancs megtalálható a telepitési könyvtárban a könnyebb használhatóság kedvéért.
Mindegyikhez szükséges: z390 v1.5.00+ and J2SE 6.0+.
A fejlesztés menete z390 COBOL-lal
- Hozzunk létre egy mappát a programunknak
- Hozzunk létre CBL kiterjesztésű fájlokat kedvenc szüvegszerkesztőnk segitségével, amelyekbe COBOL programkódot irunk
- Inditsuk el a z390 forditót a Z390.bat fájllal
- A forditónak adjuk meg a forditási parancsot - alaphelyzetben ZC390CLG - és utána szóközzel a teljes elérési utat a programunkhoz, de kiterjesztés nélkül
Példa:
Ha a C:\prg mappában van a hello.cbl fájlunk, akkor ezzek a paranccsal tudjuk futtatni:
ZC390CLG C:\prg\hello
Tutorialok és hasznos tippek a fejlesztéshez
- Mivel a COBOL nyelvnek az idők során sok változata és sztenderdje készült, vigyázzunk, hogy a z390-el kompatibilis 85-ös szabvány szerinti igéket és egyéb nyelvi megoldásokat használjunk, különben nem fog lefordulni a programunk
- Érdemes a forrásfájlban elhagyni a sorszámozást, mert legtöbbször feleslegesen nehezitjük a sorszámokkal a fejlesztés menetét
- Integrált fejlesztői környezet hiányában próbáljuk üres sorokkal strukturálni a kódot, és egyszerre csak keveset változtassunk rajta, majd forditással ellenőrizzük, hogy nem vétettünk-e szintaktikus hibát
- cobol by CSIS egy nagyon jó COBOL tutorial oldal
- freebyte COBOL COBOL programozáshoz extrém hasznos oldal
Példaprogram z390 COBOL-ban
A program adott városokban mért napi középhőmérsékletet átlagol. Fájlból olvassa be az adatokat, és megjeleniti az eredményt városonként, valamint el is menti őket egy kimeneti fájlba. A városok száma és a napok száma dinamikusan változhat.
Láthatjuk, hogy COBOL-ban hogyan kell szekvenciális fájlokkal dolgozni, alapvető matematikai műveleteket végrehajtani és képernyőre kiirni.
Az input fájl szerkezete (IN-RECORD):
- IN-RECORD-CITY PIC A(14) - a város neve, betű tizennégy karakteren, elválasztó szóközökkel
- IN-RECORD-WEEKDAY PIC A(4) - a hét napja, betű négy karakteren, elválasztó szóközzel
- IN-RECORD-DEGREE PIC 9(2) - mért hőmérséklet, szám két karakteren
- IN-RECORD-EOF PIC X(1) - sorvége jel
Az output fájl szerkezete (OUT-RECORD):
- OUT-RECORD-CITY PIC A(14) - a város neve, betű tizennégy karakteren, elválasztó szóközökkel
- OUT-RECORD-AVERAGE-DEGREE PIC 9(2) - számitott átlaghőmérséklet, szám két karakteren
Az input fájlt a 8. sorban található utasitásban kell megadni:
ASSIGN TO 'ZCOBOL\b\INPUT.TXT'
Hasonlóan, az output fájlt a 11. sorban található utasitásban kell megadni:
ASSIGN TO 'ZCOBOL\b\OUTPUT.TXT'
FILEPROC.CBL:
IDENTIFICATION DIVISION.
PROGRAM-ID. FILEPROC.
*************************************************************
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE
ASSIGN TO 'ZCOBOL\b\INPUT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUT-FILE
ASSIGN TO 'ZCOBOL\b\OUTPUT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
*************************************************************
DATA DIVISION.
FILE SECTION.
FD IN-FILE
DATA RECORD IS IN-RECORD
01 IN-RECORD
02 IN-RECORD-CITY PIC A(14)
02 IN-RECORD-WEEKDAY PIC A(4)
02 IN-RECORD-DEGREE PIC 9(2)
02 IN-RECORD-EOF PIC X(1)
FD OUT-FILE
DATA RECORD IS OUT-RECORD.
01 OUT-RECORD
02 OUT-RECORD-CITY PIC A(14)
02 OUT-RECORD-AVERAGE-DEGREE PIC 9(2)
WORKING-STORAGE SECTION.
01 END-OF-FILE-FLAG PIC X VALUE 'F'.
01 CITY PIC A(14) VALUE 'aaaaaaaaaaaaaa'.
01 AVERAGE-DEGREE PIC 9(2) VALUE 0.
01 DEGREE-COUNTER PIC 9(1) VALUE 0.
LINKAGE SECTION.
*************************************************************
PROCEDURE DIVISION.
MAINLINE.
PERFORM INITIALIZATION-ROUTINE.
PERFORM THE-CITY-LOOP UNTIL END-OF-FILE-FLAG = 'Y'.
PERFORM FLUSH-CITY-INFO.
PERFORM EOJ-ROUTINE.
STOP RUN.
INITIALIZATION-ROUTINE.
OPEN INPUT IN-FILE.
OPEN OUTPUT OUT-FILE.
READ IN-FILE INTO IN-RECORD
AT END MOVE 'Y' TO END-OF-FILE-FLAG.
MOVE IN-RECORD-CITY TO CITY
THE-CITY-LOOP.
IF CITY = IN-RECORD-CITY
ADD IN-RECORD-DEGREE TO AVERAGE-DEGREE
ADD 1 TO DEGREE-COUNTER
ELSE
PERFORM FLUSH-CITY-INFO
MOVE IN-RECORD-CITY TO CITY
MOVE 0 TO AVERAGE-DEGREE
MOVE 0 TO DEGREE-COUNTER
END-IF
READ IN-FILE INTO IN-RECORD
AT END MOVE 'Y' TO END-OF-FILE-FLAG.
EOJ-ROUTINE.
CLOSE IN-FILE.
CLOSE OUT-FILE.
FLUSH-CITY-INFO.
COMPUTE AVERAGE-DEGREE = AVERAGE-DEGREE / DEGREE-COUNTER
MOVE CITY TO OUT-RECORD-CITY
MOVE AVERAGE-DEGREE TO OUT-RECORD-AVERAGE-DEGREE
WRITE OUT-RECORD
DISPLAY 'CITY: ' CITY.
DISPLAY 'AVERAGE-DEGREE: ' AVERAGE-DEGREE.