Kobieta widoczna na zdjęciu prowadzącym do tego wpisu, to Grace Hopper (źródło: flickar.com). W oparciu o jej prace w 1959 powstał język programowania Cobol. Mimo upływu lat, na świecie wciąż działają systemy informatyczne napisane w Cobolu. Są to głównie systemy przetwarzające ogromne liczby transakcji, wykorzystywane w bankach, firmach ubezpieczeniowych, instytucjach publicznych.
Początkowo programowanie w Cobolu i nie tylko polegało na tym, że program zapisywało się na papierowym arkuszu a następnie operator zakodowywal poszczególne instrukcje na karcie perforowanej (dziurkowanej). Łatwo się domyślić, że każda pomyłka kosztowała wiele czasu i nerwów.
Wraz z wprowadzeniem przyjaźniejszych edytorów tekstu programowanie w Cobolu stało się prostsze. Dwa przykłady programów zamieszczone poniżej pokazują, że czytelność kodu jest całkiem spora. Składnia języka miała być jak najbardziej podobna do języka angielskiego. Efektem ubocznym tego podejścia jest zbytnie jej rozbudowanie. Zdarzają się programy zawierające kilkadziesiąt tysięcy linii kodu (w jednym pliku). Łatwo się domyślić, jak wygląda analiza takiego programu.
Od wielu lat panuje trend odchodzenia od systemów napisanych w Cobolu. Przemawiają za tym ograniczenia języka, jak i inne czynniki:
- Brak zmiennych lokalnych
- Brak obiektowości (nowsze wersje języka, które wprowadziły obiektowość nie przyjęły się wśród programistów)
- Brak rekurencji
- Nadmiernie rozbudowana („przegadana”) składnia
- Rosnąca średnia wieku programistów (młodzi programiści niechętnie uczą się Cobola) – coraz trudniej znaleźć na rynku specjalistów
Osobom chcącym spróbować swoich sił w Cobolu, bez konieczności zabawy w emulację mainframeów, polecam kompilator GnuCOBOL: https://sourceforge.net/projects/open-cobol/
Można go uruchomić na Linuxie i Windowsie (tutaj będzie to trochę bardziej skomplikowane). Polecenie służące do kompilacji i generujące plik wykonywalny: cobc –x nazwa_pliku.cob.
Poniżej najprostszy program wyświetlający napis ‘Hello, Sii’:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY Hello, Sii.
STOP RUN.
Kompilacja i uruchomienie programu HELLO (plik hello.cob):
$ cobc -x hello.cob
$ ls
hello hello.cob
$ ./hello
Hello, Sii
Poniższy program wybiera z pliku „ACCOUNTS.IN” id klientów i ich rachunki, posiadających przynajmniej milion na koncie (dla uproszczenia pominięto kilka elementów, jak np. waluta rachunku i konieczność przewalutowania). Wybrane rekordy zapisywane są do pliku REPORT.OUT.
</p>
IDENTIFICATION DIVISION.
PROGRAM-ID. MILLIONAIRE.
AUTHOR. SII PROGRAMMER.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
* deklaracja plikow
FILE-CONTROL.
SELECT CUSTOMER-ACCOUNTS ASSIGN "ACCOUNTS.IN"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT MILLIONAIRE-ACCOUNTS ASSIGN "REPORT.OUT"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
* definicja struktury rekordow w plikach
FILE SECTION.
FD CUSTOMER-ACCOUNTS.
01 CUSTOMER-RECORD.
02 ACCOUNT-NUM PIC 9(26).
02 CUSTOMER-ID PIC 9(8).
02 BALANCE PIC S9(13)V99.
FD MILLIONAIRE-ACCOUNTS.
01 MILLIONAIRE-RECORD.
02 MILLIONAIRE-ID PIC 9(8).
02 MILLIONAIRE-ACCOUNT PIC 9(26).
WORKING-STORAGE SECTION.
* zmienna switchowa - wskaznik konca pliku
01 WS-SW-CUSTOMER-EOF PIC X(1).
88 WS-SO-CUSTOMER-EOF-YES VALUE "Y".
88 WS-SO-CUSTOMER-EOF-NO VALUE "N".
* stala - milion
01 CT-MILLION PIC 9(7) VALUE 1000000.
PROCEDURE DIVISION.
BEGIN.
* otwarcie pliku wejsciowego i wyjsciowego
OPEN INPUT CUSTOMER-ACCOUNTS
OPEN OUTPUT MILLIONAIRE-ACCOUNTS
SET WS-SO-CUSTOMER-EOF-NO TO TRUE
* odczyt pierwszego rekordu z pliku ACCOUNTS.IN
READ CUSTOMER-ACCOUNTS
AT END SET WS-SO-CUSTOMER-EOF-YES TO TRUE
END-READ
* czytanie pliku w petli
PERFORM UNTIL WS-SO-CUSTOMER-EOF-YES
* sprawdzenie czy saldo wieksze od miliona
IF BALANCE >= CT-MILLION
* przepisanie id klienta i nr rachunku do pliku REPORT.OUT
MOVE CUSTOMER-ID TO MILLIONAIRE-ID
MOVE ACCOUNT-NUM TO MILLIONAIRE-ACCOUNT
WRITE MILLIONAIRE-RECORD
END-IF
* odczyt kolejnego rekordu z pliku ACCOUNTS.IN
READ CUSTOMER-ACCOUNTS
AT END SET WS-SO-CUSTOMER-EOF-YES TO TRUE
END-READ
END-PERFORM
* zamkniecie plikow
CLOSE CUSTOMER-ACCOUNTS
CLOSE MILLIONAIRE-ACCOUNTS
* koniec programu
STOP RUN.
Plik wejściowy „ACCOUNTS.IN” zawiera następujące rekordy (struktura rekordów zdefiniowana jest programie):
Kompilacja i uruchomienie programu MILLIONAIRE (plik millionaire.cob):
$ cobc -x millionaire.cob
$ ls
millionaire millionaire.cob
$ ./ millionaire
$ ls
millionaire millionaire.cob ACCOUNTS.IN REPORT.OUT
Jak widzimy, pojawił się plik REPORT.OUT, w którym mamy rekordy klientów – milionerów (struktura rekordów zdefiniowana w programie):
Program Cobolowy składa się zazwyczaj z następujących bloków/dywizji (DIVISIONS), co widać na powyższym przykładzie:
- IDENTIFICATION DIVISON – zawiera nazwę programu i inne dane, np. nazwisko autora
- ENVIRONMENT DIVISION – specyfikuje pliki wejściowe i wyjściowe (rodzaj plików, nazwa)
- DATA DIVISION – definiuje strukturę plików oraz zmienne używane w programie
- PROCEDURE DIVISION – zawiera logikę programu.
Bloki IDENTIFICATION DIVISON oraz PROCEDURE DIVISION są wymagane.
W programie „MILLIONAIRE” dodatkowo pojawiają się sekcje (SECTIONS). Sekcje wchodzą w skład dywizji. Dla przykładu DATA DIVISION dzieli się na sekcje:
- FILE SECTION – zawiera definicję struktury rekordu w pliku
- WORKING-STORAGE SECTION – zawiera deklaracje zmiennych/stałych
Dokładniejsze wyjaśnienie struktury programu w Cobolu a także omówienie składni języka można znaleźć pod adresem: http://www.csis.ul.ie/cobol/course/Default.htm
Strona zawiera także więcej przykładów programów: http://www.csis.ul.ie/cobol/examples/ Zachęcam do zapoznania się z nimi.
fantastic submit, very informative. I ponder why the opposite specialists of this sector do not understand this. You must continue your writing. I am confident, you’ve a huge readers’ base already!
http://vividleds.us/