Software Development

Nieśmiertelny język

Maj 6, 2016 2
Podziel się:

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.

karta programowania Cobol

Papierowy arkusz z fragmentem programu.

Źródło: https://neil.fraser.name/news/2013/02/23/

karta perforowana

Karta perforowana, na której zapisywano dawniej programy. Na jednej karcie zapisywano jedną linię kodu.

Źródło: https://commons.wikimedia.org/wiki/File:Blue-punch-card-front.png

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.


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

a6

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

a9

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.

 

5 / 5

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

komentarze(2)

avatar'
Luther Eckman
7 października 2018 Odpowiedz

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/

Zostaw komentarz