A COBOL programozási nyelv

Fordítók

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:

Kialakítási szempontok:

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

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:

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:

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:

  1. 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.
  2. A makrók a z390\zcobol\*.mac fájlokban találhatóak, és ezekből készül futtatható kód.
  3. 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

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

  1. Hozzunk létre egy mappát a programunknak
  2. Hozzunk létre CBL kiterjesztésű fájlokat kedvenc szüvegszerkesztőnk segitségével, amelyekbe COBOL programkódot irunk
  3. Inditsuk el a z390 forditót a Z390.bat fájllal
  4. 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

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):

Az output fájl szerkezete (OUT-RECORD):
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.