Първи стъпки в COBOL: втора част

Оригиналът е на Charles R. Martin

0
315

В първата част се спряхме на възникването и на някои особености на езика за програмиране COBOL. Разгледахме и нулевия пример “Hello, world“. Сега следва да продължим с втория, по-сложен пример на COBOL.

Тук няма смисъл да повтаряме идентификационния раздел и ще преминем направо към раздела на обкръжението, на чиято основа се създава интерфейса между COBOL програмата и външния свят:

ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT TIMECARDS
               ASSIGN TO "TIMECARDS.DAT"
                   ORGANIZATION IS LINE SEQUENTIAL.

Нека да се спрем върху отделните аспекти на COBOL в този пример, които могат да бъдат твърде учудващи за един програмист, който никога не е писал код в табличния свят за обработка на данните. В UNIX, Linux, MacOS и Windows за един запис се счита един ред текст, който завършва със специален символ или символи. В традиционния COBOL това е проблем и някои интерпретатори на COBOL реализират нестандартни разширения, за да се справят с това. Едно от тях е следното:

ORGANIZATION IS LINE SEQUENTIAL

В раздела за вход/изход на файла просто се присвоява символното име (TIMECARDS), което извършва съединяването на файла с външната среда.

 

Следващата част на тази програма описва данните, с които ще работим по-нататък. При COBOL обикновено се предполага, че всички данни ще са с фиксиран формат. Структурата на записите е йерархична с отбелязване номерата на нивата. Нивото 01 е най-високото, а следващите подраздели получават по-големи номера. Аз използвах номерацията 01, 05 и така нататък, понеже по този начин е по-лесно да се вмъкват нови перфокарти, без да се налага да се правят промени и пробиват всички останали. В първата част вече обяснихме, че в началото програмите за COBOL са пробивани в перфокарти, като тази парадигма се е запазила и до днес.

Нека да въведем още един раздел, който при COBOL се нарича раздел на данните. Както вече навярно сте се досетили, той е предназначен само за данни. Тук се използват две секции. Първата е файловата секция:

       DATA DIVISION.
       FILE SECTION.
           FD TIMECARDS.
           01 TIMECARD.
               02 EMPLOYEE-NAME.
                   03 EMP-FIRSTNAME PIC X(10).
                   03 EMP-SURNAME   PIC X(15).
               02 HOURS-WORKED PIC 99V9.
               02 PAY-RATE     PIC 99.

Това е нашият вход с фиксиран формат: с помощта на реда FD ние го съединяваме с файла TIMECARDS. Следва секцията на работното хранилище. Ако досега не сте работили с COBOL, то ще ви изглежда доста необичайно, но всъщност тук просто обявявам променливите, които ще се използват в тази програма:

 WORKING-STORAGE SECTION.
      * temporary variables in computational usage (временни променливи, използвани при изчисленията на)
      *    intermediate values for computing paycheck with overtime (междинните значения за пресмятането на заплатата)
           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.
           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.
      *    computed parts of the paycheck (променливите за крайната ведомост)
           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.
           01 FED-TAX          PIC 9(4)V99 USAGE COMP.
           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.
           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.
           01 NET-PAY          PIC 9(4)V99 USAGE COMP.
 

Непознатата част от този код е условието PIC (или PICTURE). COBOL не е характерен със силна типизация. Точно обратното, подобно на C, всяко деклариране съответства на точно определен участък на паметта. В този случай PIC съобщава на COBOL, че въпросният участък на паметта, например REGULAR-HOURS, трябва да се интерпретира като шестзначно число, което има десетична запетая (V), предшестваща последните два символа. USAGE COMP нарежда на COBOL да използва вътрешния си формат, който е специално предназначен за бързи аритметични операции. На практика този формат е доста гъвкав и зависи от архитектурата. Ето защо не го препоръчвам да се използва във всички възможни платформи. Тук е даден само като пример.

Ако искате да бъдете по-уверени, не използвайте USAGE COMP, което веднага ще ни заведе към другата част на данните – формата на изхода. Тези полета се използват по подразбиране и се извеждат на екрана, а  USAGE COMPне се извежда:

01 PAYCHECK.
               02 PRT-EMPLOYEE-NAME    PIC X(25).
               02 FILLER               PIC X.
               02 PRT-HOURS-WORKED     PIC 99.9.
               02 FILLER               PIC X.
               02 PRT-PAY-RATE         PIC 99.9.
               02 PRT-GROSS-PAY        PIC $,$9.99.
               02 PRT-FED-TAX          PIC $,$9.99.
               02 PRT-STATE-TAX        PIC $,$9.99.
               02 PRT-FICA-TAX         PIC $,$9.99.
               02 FILLER               PIC X(5).
               02 PRT-NET-PAY          PIC $*,**9.99.
 

Тук най-интересното е това, че вече виждаме няколко нови формата PIC: за $,$$9.99 Водещият символ е знакът на долара, който винаги предшества най-лявата цифра. Виждаме още и $*,**9.99, със звездички, които допълват символите между знака на щ. долара и първите цифри.

 

След малко ще видим цялата програма, но първоначално нека да видим каква е математиката на COBOL с примера COMPUTE-GROSS-PAY:

 COMPUTE-GROSS-PAY.
           IF HOURS-WORKED > 40 THEN
               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE
               MOVE 40 TO REGULAR-HOURS
               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS
               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY
               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE
                   GIVING OVERTIME-PAY
               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY
           ELSE
               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY
           END-IF

Да, в стандартния COBOL всичко трябва да е зададено съвсем явно и ясно.

Ето как изглежда цялата програма на COBOL:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PAYCHECKS.
       AUTHOR. CHARLES R. MARTIN.
       DATE-WRITTEN. 2020-APR-15.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT TIMECARDS
               ASSIGN TO "TIMECARDS.DAT"
                   ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
           FD TIMECARDS.
           01 TIMECARD.
               02 EMPLOYEE-NAME.
                   03 EMP-FIRSTNAME PIC X(10).
                   03 EMP-SURNAME   PIC X(15).
               02 HOURS-WORKED PIC 99V9.
               02 PAY-RATE     PIC 99.
       WORKING-STORAGE SECTION.
      * temporary variables in computational usage.
      *    intermediate values for computing paycheck with overtime
           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.
           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.
           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.
      *    computed parts of the paycheck
           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.
           01 FED-TAX          PIC 9(4)V99 USAGE COMP.
           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.
           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.
           01 NET-PAY          PIC 9(4)V99 USAGE COMP.
      * print format of the check
           01 PAYCHECK.
               02 PRT-EMPLOYEE-NAME    PIC X(25).
               02 FILLER               PIC X.
               02 PRT-HOURS-WORKED     PIC 99.9.
               02 FILLER               PIC X.
               02 PRT-PAY-RATE         PIC 99.9.
               02 PRT-GROSS-PAY        PIC $,$9.99.
               02 PRT-FED-TAX          PIC $,$9.99.
               02 PRT-STATE-TAX        PIC $,$9.99.
               02 PRT-FICA-TAX         PIC $,$9.99.
               02 FILLER               PIC X(5).
               02 PRT-NET-PAY          PIC $*,**9.99.
      * Tax rates -- 77 level aha!
           77 Fed-tax-rate     Pic V999 Value Is .164 .
           77 State-tax-rate   Pic V999 Value Is .070 .
           77 Fica-tax-rate    Pic V999 Value Is .062 .
      * Level is for conditions.
           01 END-FILE             PIC X.
               88  EOF VALUE "T".
       PROCEDURE DIVISION.
       BEGIN.
           PERFORM INITIALIZE-PROGRAM.
           PERFORM PROCESS-LINE WITH TEST BEFORE UNTIL EOF
           PERFORM CLEAN-UP.
           STOP RUN.
       INITIALIZE-PROGRAM.
           OPEN INPUT TIMECARDS.
       PROCESS-LINE.
           READ TIMECARDS INTO TIMECARD
               AT END MOVE "T" TO END-FILE.
           IF NOT EOF THEN
               PERFORM COMPUTE-GROSS-PAY
               PERFORM COMPUTE-FED-TAX
               PERFORM COMPUTE-STATE-TAX
               PERFORM COMPUTE-FICA
               PERFORM COMPUTE-NET-PAY
               PERFORM PRINT-CHECK
            END-IF.
       COMPUTE-GROSS-PAY.
           IF HOURS-WORKED > 40 THEN
               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE
               MOVE 40 TO REGULAR-HOURS
               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS
               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY
               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE
                   GIVING OVERTIME-PAY
               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY
           ELSE
               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY
           END-IF
           .
       COMPUTE-FED-TAX.
           MULTIPLY GROSS-PAY BY FED-TAX-RATE GIVING FED-TAX
           .
       COMPUTE-STATE-TAX.
      * Compute lets us use a more familiar syntax
           COMPUTE STATE-TAX = GROSS-PAY * STATE-TAX-RATE
           .
       COMPUTE-FICA.
           MULTIPLY GROSS-PAY BY FICA-TAX-RATE GIVING FICA-TAX
           .
       COMPUTE-NET-PAY.
           SUBTRACT FED-TAX STATE-TAX FICA-TAX FROM GROSS-PAY
               GIVING NET-PAY
           .          
       PRINT-CHECK.
           MOVE EMPLOYEE-NAME  TO PRT-EMPLOYEE-NAME
           MOVE HOURS-WORKED   TO PRT-HOURS-WORKED
           MOVE PAY-RATE       TO PRT-PAY-RATE
           MOVE GROSS-PAY      TO PRT-GROSS-PAY
           MOVE FED-TAX        TO PRT-FED-TAX
           MOVE STATE-TAX      TO PRT-STATE-TAX
           MOVE FICA-TAX       TO PRT-FICA-TAX
           MOVE NET-PAY        TO PRT-NET-PAY
           DISPLAY PAYCHECK
           .
        CLEAN-UP.
           CLOSE TIMECARDS.
        END PROGRAM PAYCHECKS.

А ето го и файлът с входните данни:

Charlie   Martin         41015
Terry     Lacy           32007

Ето какво излиза на изхода:

$ cobc -x paycheck.cob 
$ ./paycheck 
Charlie   Martin          41.0 15.0 $622.50 $102.09  $43.57  $38.59     $**438.25
Terry     Lacy            32.0 07.0 $224.00  $36.73  $15.68  $13.88     $**157.71
$

Къде можем да учим COBOL?

Всъщност има доста курсове и книги по COBOL.

Аз водя платения курс Udemy, което считам за доста добър. Сред електронните книги за Kindle харесвам Beginning COBOL for Programmers на Майкъл Кафлън. В YouTube има многобройни видеа на тази тема, от които съм прегледал само няколко и всеки може да ги види, ако в търсачката въведе COBOL.

Подготвят се и нови материали. IBM и Open Mainframe Project анонсираха своя нов съвместен проект, които има за цел да обедини специалистите с изградени навици в COBOL, които могат да учат и другите да използват този програмен език. Има и новинарска площадка за COBOL програмисти, които се надяват добре да спечелят с използването на този език за програмиране.

Защо COBOL има лоша слава?

Както стана ясно от този съвсем малък пример, COBOL не прилича особено много на другите стандартни езици за програмиране. COBOL не става за писане на компилатор, той не може да се използва за създаване на ядро за операционна система и синтаксисът му е такъв, какъвто едва ли програмистите са очаквали. Но нека да го сравним с друг много разпространен предметно ориентирани език – SQL. И при него синтаксисът е твърде причудлив, а семантиката се определя от релационните изчисления.

„Програмирайки мейнфрейми можете да разберете как се създаваше софтуера преди години“ – споделя Марио Себалос, програмист на Cigna“. „С негова помощ съвременният програмист сякаш отваря капсула на времето. Много черти на COBOL днес изглеждат някак занаятчийски в сравнение със съвременните похвати на DEVOPS и роботизацията“.


Под статията на Charles R. Martin има много коментари. Редица потребители провериха в indeed.com какви специалисти по COBOL се търсят и какви годишни заплати им се предлагат.  Има обяви за по около $220 хиляди годишно, което не е чак толкова много за САЩ, където програмистите, използващи по-съвременни езици за програмиране получават доста повече. От друга страна, има много предложения за отдалечена работа с програмиране на COBOL с многобройни бонуси, 13-та заплата и други подобни. По всичко личи, че си струва изучаването на този програмен език.

Вижда се, че към днешен ден COBOL все още се използва и ще продължи да се използва в банките и в редица големи държавни учреждения, а специалисти няма. Това ще доведе до тяхното търсене, а привличането на подобни специалисти става предимно чрез много добро заплащане. Навярно обявите в indeed.com съвсем скоро ще се променят. 

Абонирай се
Извести ме за
guest
0 Коментара
Отзиви
Всички коментари