Hlavní navigace

The future's bright… the future's Cobol

Pavel Tišnovský

Článek o Turbo Pascalu se zabýval počítačovým středověkem (alespoň ze současného pohledu). Dnes se ovšem budeme zabývat skutečnou prehistorií, protože se seznámíme s programovacím jazykem, který letos slaví šedesátiny.

Doba čtení: 35 minut

Sdílet

11. COBOL v číslech

12. (Možná) budoucnost COBOLu

13. Základní vlastnosti programovacího jazyka COBOL

14. Pevná struktura programů zapisovaných v COBOLu

15. Rozdělení COBOLovského programu na oddíly

16. Oddíl DATA DIVISION

17. Oddíl PROCEDURE DIVISION

18. Příloha: problematika výpočtů s numerickými hodnotami s plovoucí řádovou binární čárkou

19. Literatura

20. Odkazy na Internetu

1. The future's bright … the future's Cobol

„Real Programmers don't write in COBOL. COBOL was designed to be read, not run. Unfortunately it is often run anyway.“

V nedávno vydaném článku jsme oslavili jedno poměrně důležité výročí v oblasti informatiky. Jednalo se o třicet let, které uběhly od vydání Turbo Pascalu verze 5.5 určené pro osobní počítače PC a operační systém DOS. Z pohledu dnešních vývojářů, kteří jsou vybaveni rozsáhlými integrovanými vývojovými prostředími s plnohodnotným GUI a desítkami integrovaných nástrojů (do nichž se pomalu ale jistě přidávají i technologie umělé inteligence) může Turbo Pascal s textovým celoobrazovkovým rozhraním a poměrně minimalistickým designem připadat jako skutečný dávnověk. Ve skutečnosti však i ve světě informatiky existují a dokonce se stále používají i mnohem starší technologie. Pravděpodobně nejtypičtějším zástupcem těchto starobylých a možná i legendárních technologií je programovací jazyk COBOL, který letos oslaví šedesát let od svého vzniku (to se již skutečně dostáváme do počítačového dávnověku, konkrétně do období dinosaurů mainframů).

ibm3_

Obrázek 1: Zrekonstruovaný řídicí panel počítače IBM System/360 Model 30. Na dlaždici před panelem (zhruba pod čtveřicí bílých tlačítek) je pro porovnání velikostí umístěný současný mikrořadič PIC.

Jazyk COBOL neboli plným jménem COmmon Business Oriented Language patří do skupiny vyšších programovacích jazyků, což je (ve stručnosti) označení pro ty programovací jazyky, které se (zejména z hlediska sémantiky) nachází nad strojovým kódem a assemblerem. Těchto jazyků dnes existuje takřka nepřeberné množství, ovšem v době, kdy vznikal COBOL (konec padesátých let minulého století, což je období prvních generací mainframů), bylo těchto jazyků jen několik desítek a navíc se v naprosté většině případů jednalo o jazyky specializované: jazyk FORTRAN sloužil (a ostatně dodnes slouží) především pro numerické výpočty, COBOL pro implementaci „business“ aplikací, LISP pro symbolické výpočty a zpracování složitějších datových struktur (původně i pro první pokusy s umělou inteligencí) atd. Pravděpodobně prvním vážnějším pokusem o univerzální programovací jazyk je ALGOL.

ibm3_

Obrázek 2: Moduly počítačů řady IBM System/360. Zpočátku měl každý modul podobu větší či menší skříně, později docházelo ke slučování některých funkcí do menšího počtu modulů i k celkovému zmenšování jak obsazeného prostoru, tak i spotřeby elektrické energie (to znamenalo i menší nároky na chlazení – klimatizaci).

Poznámka: ve skutečnosti se nepoužívaly pouze specializované vyšší programovací jazyky, ale dokonce i celé tehdejší počítače (mainframy) měly svůj hardware specializovaný pro určitý účel. Typicky se rozlišovaly mainframy pro práci s celočíselnými daty, mainframy pro numerické výpočty, dále počítače pro zpracování textů atd. Idea „univerzálního počítače“ byla při použití technologií dostupných v padesátých letech minulého století jen těžko realizovatelná, a to především z finančních důvodů (ostatně doba, kdy se i pro běžná PC matematický koprocesor pořizoval jen když byl skutečně zapotřebí, není až tak vzdálená).
ibm3_

Obrázek 3: Ovládací panel počítače IBM System/360 Model 91 po levé straně a terminál připojený pomocí modemu na straně pravé.

Poznámka: v této kapitole jsou sice uvedeny snímky mainframu IBM System/360, ovšem tyto počítače vznikly až později, konkrétně v roce 1964, kdy již byl COBOL rozšířeným a ustáleným programovacím jazykem.

2. Vznik vyšších programovacích jazyků

„A computer without COBOL and FORTRAN is like a piece of chocolate cake without ketchup or mustard.“

V úvodní kapitole jsme si řekli, že jazyk COBOL patří do skupiny vyšších programovacích jazyků. Ovšem původně se pro vývoj aplikací pro mainframy vyšší programovací jazyky nepoužívaly, už jen z toho prostého důvodu, že ani neexistovaly :-).

ibm2

Obrázek 4: Úvodní stránka manuálu k assembleru počítačů System/360.

Vývoj programů pro tyto počítače byl poměrně složitý a především zdlouhavý a drahý, protože celý algoritmus se nejprve popsal vývojovým diagramem (kresleným samozřejmě ručně na papíry) a po ručním přezkoumání, zda algoritmus skutečně bude pracovat v pořádku, se provedl jeho přepis přímo do strojového kódu – assembler, neboli automatický programový prostředek pro transformaci zdrojového kódu využívajícího symbolické adresy a symbolické názvy instrukcí do strojového kódu, nebyl k dispozici. Přepis do strojového kódu se prováděl na papírové formuláře, které byly následně buď vyděrovány na děrné štítky (přístup preferovaný z historických důvodů především firmou IBM) nebo přepsány na magnetické pásky (přístup firmy Remington Rand). Až poté operátoři program i s daty připravili jako dávkovou úlohu, která musela počkat na své zpracování do doby, kdy byl k dispozici potřebný výpočetní čas, což však také mohlo trvat i několik týdnů.

Obrázek 5: Hledání chyby v blocích počítače UNIVAC II bylo zajisté dobrodružnou záležitostí.

V případě, že z nějakého důvodu došlo při návrhu programu nebo při jeho přepisu k chybě, muselo se celé kolečko opakovat. Navíc se v celém procesu od vytvoření programu až po jeho úspěšný běh vyskytovalo velké množství lidí (analytici, programátoři, operátoři, technici, lidé starající se o výměnu a archivaci magnetických pásek atd.), kteří mohli kvůli nějakému opomenutí do procesu tvorby a spuštění programu vnést nějakou chybu, která se projevila až následně při kontrole dat, nebo v horším případě až při stížnostech zákazníků. Mimochodem: zajímavé bylo, že mnohdy byli operátoři a technici většinou přímo zaměstnanci firmy dodávající mainframy a nikoli zaměstnanci společnosti, která programy/aplikace používala. To se týkalo například společnosti Remington Rand, která tyto pracovníky svým zákazníkům pronajímala i s vlastním počítačem (outsourcing tedy není ve světě IT vůbec nic nového, spíše naopak). I kvůli vysokému počtu pracovníků byla každá chyba, která se v programu nebo v průběhu zpracování objevila, velmi drahá.

Obrázek 6: Základní pomůcky programátorů počítače UNIVAC I a II před vznikem vyšších programovacích jazyků – šablona pro tvorbu vývojových diagramů a tabulka kódů znaků (třetí důležitou pomůckou byl kelímek z automatu na kávu).

Pro ilustraci nároků na lidské zdroje je v následující tabulce vypsán počet pracovníků doporučovaných pro obsluhu jednoho počítače UNIVAC II v jednosměnném, dvousměnném a třísměnném provozu. Jedná se o doporučení vydané samotnou firmou Remington Rand. Nejde přitom o zbytečnou přezaměstnanost, protože počítač bylo žádoucí mít vzhledem k jeho vysoké ceně (více než 1 500 000 dolarů, popř. měsíční pronájem za cca 30 000 dolarů) neustále stoprocentně vytížený. Na tomto místě je možná vhodné si připomenout, že UNIVAC II dokázal za jednu sekundu vykonat pouze cca 3000 základních aritmetických operací nebo manipulací se symboly (znaky), takže i rychlost zpracovávání dat byla z dnešního pohledu velmi nízká (i ovladač klávesnice má o několik řádů vyšší výpočetní výkon):

Profese Jednosměnný provoz Dvousměnný provoz Třísměnný provoz
Supervisors 5
Analysts 8
Programmers 20
Clerks 5
Librarians 1
Operators 2 4 6
Engineers 4 6 9
In-Out Oper 2 4 6
Tape Handlers 1 2 3
ibm2

Obrázek 7: Architektura počítačů System/360.

3. Skuteční programátoři sice píšou svoje programy přímo ve strojovém kódu, ale kdo to zaplatí?

„Much of my work has come from being lazy. I didn't like writing programs, and so, when I was working on the IBM 701, writing programs for computing missile trajectories, I started work on a programming system to make it easier to write programs.“
John W. Backus, tvůrce FORTRANu

A právě z toho důvodu, že vývoj programů výše uvedeným způsobem je až přehnaně drahý, začaly vznikat aplikace, které nebyly určeny přímo pro koncové uživatele (například banky, statistické úřady, americký IRS atd.), ale „pouze“ pro programátory. Svým způsobem se vlastně jedná o přelomovou myšlenku: počítač má být pomocníkem mj. i pro vývoj programů pro něj samý.

ibm-5

Obrázek 8: Manuál k první verzi FORTRANu určeného pro mainframy IBM 704.

Postupně tak vznikly první primitivní assemblery, které byly postupně vylepšovány o další funkce. Výsledkem byly takzvané makroassemblery (assembler doplněný o systém maker) a později vznikly i autokódy (například AMRU atd.). Autokód je nízkoúrovňový programovací jazyk ležící přibližně v polovině cesty mezi assemblerem (jazykem symbolických instrukcí) a vyššími programovacími jazyky (FORTRAN, ALGOL). V autokódu se mohou používat jak přímo instrukce procesoru, tak i zapisovat jednoduché výrazy, konstruovat podmíněné bloky kódu a tvořit základní programové smyčky (ovšem deklarace vlastních datových typů, použití polí apod. většinou není podporována). Programové konstrukce zapsané v autokódu se poměrně přímočarým způsobem převádí do assembleru, který je potom přeložen přímo do strojového kódu daného procesoru. Od autokódů již vede relativně přímá cesta k plnohodnotným vyšším programovacím jazykům.

ibm-5

Obrázek 9: Ukázka programu napsaného ve FORTRANu II, ve kterém můžeme mj. vidět i použití aritmetického IF.

Poznámka: samozřejmě nelze říci, že se assemblery přestaly po vzniku vyšších programovacích jazyků používat. Používají se stále, ovšem nika, kde má jejich praktické využití smysl, je dnes již relativně malá. Dnes se typicky setkáme s nějakou formou makroassembleru a zajímavé je, že autokódy se již prakticky nepoužívají, i když existují projekty, které se je snaží znovuobjevit (HLL atd.). Je to i logické, protože ve chvíli, kdy by se mohl použít autokód (výrazy, jednoduché podmínky a smyčky atd.) je již mnohdy praktičtější přejít na programovací jazyk C, který se tak s trochou nadsázky stal „univerzálním assemblerem“.
ibm-5

Obrázek 10: Spolu s rozšiřováním Fortranu z mainframů firmy IBM na další architektury se zvyšovala potřeba standardizace tohoto jazyka. Postupně vzniklo několik norem, například ANSI norma FORTRAN 66, FORTRAN 77, či ANSI/ISO standard Fortran 90 (názvy standardů jsou uvedeny správně – jméno jazyka se skutečně postupem času změnilo z „FORTRAN“ na „Fortran“).

4. Grace Hopper a její vliv na vývoj vyšších programovacích jazyků

„Very few [people involved in data processing] were symbol oriented; very few of them were mathematically trained.“
Grace Hopper vysvětluje, proč je vhodné programovat počítače UNIVAC ve vyšším programovacím jazyku.

Poznámka k přechylování: čtenáři, kteří dávají přednost přechylování cizích příjmení, nechť si v dalším textu doplní chybějící -ová

Jedním z klíčových zaměstnanců firmy Remington Rand (což byla jedna ze sedmi firem vyrábějících mainframy) byla od roku 1949 i slavná Grace Hopper (). Tato programátorka dříve pracovala s reléovými elektronickými počítači, například na počítači Mark II. Právě při hledání chyby v jednom programu, který byl provozován na tomto stroji (programy byly „zadrátovány“, nikoli uloženy v paměti), objevila Grace, že v kontaktu jednoho relé je chycená můra – „bug“, kvůli níž kontakt korektně nespínal. Od té doby se v jejím týmu všechny chyby v programu označovaly slovem „bug“ a Grace později začala používat nové slovo „debug“ pro proces odstraňování těchto chyb, což později vedlo ke vzniku debuggerů, tedy utilit určených právě pro detekci a opravu chyb.

Obrázek 11: Program napsaný ve strojovém kódu počítačů UNIVAC I a UNIVAC II.

Ovšem vraťme se do doby, kdy Grace Hopper pracovala u firmy Remington Rand (Sperry Rand). V této době se jí totiž podařilo vytvořit první skutečný překladač na světě nazvaný jednoduše A-0, který dokázal transformovat symbolicky zapsané matematické výrazy do strojového kódu počítačů UNIVAC.

Obrázek 12: Velmi malá část vývojového diagramu složitějšího programu pro počítače UNIVAC I a UNIVAC II. Povšimněte si především příkazů pro ovládání páskových jednotek a taktéž zápisu absolutních adres 000–999 u některých stavů diagramu.

Po první verzi překladače A-0 vznikly i jeho vylepšené verze, především překladač nazvaný A-2, který byl poměrně intenzivně na UNIVACu používán. Grace Hopper vydala v roce 1952 článek o tomto překladači, což zajímavě koresponduje s rokem 1954, kdy byl vytvořen a představen první překladač Fortranu (tento jazyk se ovšem, na rozdíl od A-0 a A-2, používá po mnoha úpravách a vylepšeních dodnes). Grace Hopper pokračovala v návrzích dalších programovacích jazyků, především jazyka B-0 a taktéž jeho pokračovatele FLOW-MATIC a v neposlední řadě i COBOLu. Posléze se Grace vrátila k práci pro námořnictvo USA, kde po mnoha letech služby získala (jako první žena) hodnost kontradmirála v záloze.

Obrázek 13: Grace Hopper před ovládacím panelem UNIVACu.

5. Programovací jazyky A-0, A-2 a MATH-MATIC

Programovací jazyk A-0, neboli Arithmetic Language version 0, byl vytvořen v letech 1951 až 1952 pro počítač UNIVAC I a později byl upraven pro použití na počítači UNIVAC II (z tohoto důvodu je článek doplněn fotkami Univaců). Jednalo se o poměrně přímočarý překladač (bez kontroly chyb a navíc bez pokusu o zotavení z chyb), který transformoval aritmetické a relativně primitivní řídicí příkazy do strojového kódu. Z tohoto překladače vycházela i jeho vylepšená a výše zmíněná verze A-2, jejíž upravená varianta byla nabízena pod názvem MATH-MATIC. V programech napsaných v MATH-MATICu byly všechny programové řádky očíslovány, podobně jako tomu bylo o mnoho let později v BASICu. Jak je pro programovací jazyky, jejichž autorem je Grace Hopper, typické, používají se namísto různých symbolů převážně klíčová slova a sekvence slov s přesným významem (JUMP TO SENTENCE atd.). Jednotlivé příkazy jsou ukončeny tečkou, podobně jako věty v běžném textu.

Obrázek 14: Titulní stránka manuálu k programovacímu jazyku FLOW-MATIC.

Následuje ukázka čtyř vzájemně nesouvisejících programových řádků napsaných v MATH-MATICu – jedná se postupně o příkaz pro načtení hodnot tří proměnných, podmíněný příkaz, volání podprogramu umístěného na řádcích 4 až 8 (s implicitním návratem) a počítanou programovou smyčku s počitadlem J, které se zvyšuje od jedničky do dvaceti s krokem 1:

(1) READ A B C .
(20) IF X > Y JUMP TO SENTENCE 8 .
(12) EXECUTE SENTENCE 4 THRU 8 .
(6) VARY J 1 (1) 20 SENTENCE 11 THRU 15 .

Obrázek 15: Zdrojový kód napsaný v programovacím jazyku FLOW-MATIC.

Druhý demonstrační příklad je již plnohodnotným programem, který dokáže vypočítat průměr a odchylku z deseti hodnot uložených v poli. Na tomto příkladu je možná patrné, že již před více než šedesáti lety bylo možné programovat na vcelku vysoké úrovni (a výsledný program je dokonce čitelnější, než by tomu bylo v případě některých „moderních“ programovacích jazyků):

(1) READ-ITEM X(10) IF SENTINEL JUMP TO SENTENCE 11 .
(2) SUM = 0 .
(3) SUMSQUARES = 0 .
(4) VARY I 1 (1) 10 SENTENCE 5 THRU 6 .
(5) SUM = SUM + X(I)
(6) SUMSQUARES = SUMSQUARES + X(I)^2 .
(7) MEAN = SUM / 10 .
(8) VARIANCE = SUMSQUARES / 10 - MEAN ^ 2 .
(9) WRITE AND EDIT FOR UNIPRINTER MEAN VARIANCE .
(10) JUMP TO SENTENCE 1 .
(11) STOP .
Poznámka: opět si povšimněte, že se programy, resp. přesněji řečeno jednotlivé programové řádky s příkazy a deklaracemi, podobají zápisu anglických vět, dokonce se i příkazy ukončují tečkami. Podobný přístup je vidět i u COBOLu.

Obrázek 16: Grace Hopper s referenční příručkou jazyka COBOL stojící u páskových jednotek UNISERVO.

6. Programovací jazyky B-0 a FLOW-MATIC

„Real Programmers don't write in PL/I. PL/I is for programmers who can't decide whether to write in COBOL or FORTRAN.“

Druhým programovacím jazykem, který Grace Hopper i přes určitý odpor svých spolupracovníků (kteří předložený návrh považovali za příliš radikální) vytvořila pro počítače UNIVAC, byl jazyk nazvaný B-0 neboli Business Language version 0. Tento programovací jazyk je však známější pod svým komerčním názvem FLOW-MATIC. Jednalo o jazyk určený převážně pro zpracování dat, provádění bankovních operací, fakturace či výpočty mezd, což je velký rozdíl oproti výše popsaným jazykům A-0 a MATH-MATIC, které byly orientovány zejména na provádění numerických výpočtů. FLOW-MATIC je s velkou pravděpodobností prvním programovacím jazykem, v němž se používala anglická slova mající význam klíčových slov i operátorů; navíc se jednotlivé příkazy (programové řádky) velmi podobaly jednoduchým anglickým větám, a to i v případě zápisu složitějších podmínek (jazyk původně rozeznával dvacet klíčových slov). V tomto programovacím jazyku se vyskytovaly i příkazy, kterými se daly přímo ovládat jednotlivé páskové jednotky, kterých mohlo být v případě počítače UNIVAC II připojeno až 16. Existovala taktéž podpora pro tvorbu tiskových sestav.

ibm6

Obrázek 17: První zveřejněná publikace o programovacím jazyku COBOL.

Následuje ukázka programu napsaného v programovacím jazyce FLOW-MATIC. Povšimněte si především poměrně složité podmínky na řádku číslo jedna a porovnání výsledku výpočtu s nulou se specifikovaným počtem míst na řádku 14 (ZZZZ znamená porovnání na 4 místa/cifry, ZZZZZ na pět míst atd., podobný koncept opět objevíme i v COBOLu):

 0) INPUT  INVENTORY FILE=A
           PRICE FILE=B,
    OUTPUT PRICED-INV FILE=C
           UNPRICED-INV FILE=D,
    HSP D.
 1) COMPARE PRODUCT-NO(A) WITH PRODUCT-NO(B)
    IF GREATER GO TO OPERATION 10;
    IF EQUAL GO TO OPERATION 5;
    OTHERWISE GO TO OPERATION 2.
 2) TRANSFER A TO D.
 3) WRITE ITEM D.
 4) JUMP TO OPERATION 8.
 
 5) TRANSFER A TO C.
 6) MOVE UNIT-PRICE(B) TO UNIT-PRICE(C).
 7) WRITE ITEM C.
 8) READ ITEM A; IF END OF DATA GO TO OPERATION 14.
 9) JUMP TO OPERATION 1.
 
10) READ ITEM B; IF END OF DATA GO TO OPERATION 12.
11) JUMP TO OPERATION 1.
 
12) SET OPERATION 9 TO GO TO OPERATION 2.
13) JUMP TO OPERATION 2.
 
14) TEST PRODUCT-NO(B) AGAINST ZZZZZZZZZZZZ;
    IF EQUAL GO TO OPERATION 16;
    OTHERWISE GO TO OPERATION 15.
15) REWIND B.
16) CLOSE-OUT FILES C, D.
17) STOP. (END)
ibm6

Obrázek 18: Programátorský textový editor určený pro zápis COBOLovských programů, na kterém je mj. patrné i rozdělení řádků na jednotlivé části (číslo sekvence, sedmý sloupec, sekce A, sekce B) i omezení délky jednotlivých textových řádků na 72 znaků na řádek.

7. Od FLOW-MATIC k COBOLu

As taboo as COBOL might be in the ping pong rooms of modern startup-driven culture today, its influence and irreplaceability will result in a spotlight on the dinosaur language again.

Grace Hopper se později podílela i na vzniku standardu jazyka COBOL, kterému je dnešní článek věnován. Tento programovací jazyk v mnoha ohledech vychází právě z jazyka FLOW-MATIC. O tom, že oba zmíněné programovací jazyky mají hodně společného, se mohou čtenáři přesvědčit sami porovnáním předchozího kódu s COBOLovským programem, v němž taktéž můžeme narazit na anglické věty ukončené tečkou, formátováním údajů na zadaný počet desetinných míst atd.:

       $ SET SOURCEFORMAT"FREE"
       IDENTIFICATION DIVISION.
       PROGRAM-ID.  Multiplier.
       AUTHOR.  Michael Coughlan.
      * Example program using ACCEPT, DISPLAY and MULTIPLY to
      * get two single digit numbers from the user and multiply them
      * together
 
       DATA DIVISION.
 
       WORKING-STORAGE SECTION.
       01  Num1                                PIC 9  VALUE ZEROS.
       01  Num2                                PIC 9  VALUE ZEROS.
       01  Result                              PIC 99 VALUE ZEROS.
 
       PROCEDURE DIVISION.
       DISPLAY "Enter first number  (1 digit) : " WITH NO ADVANCING.
       ACCEPT Num1.
       DISPLAY "Enter second number (1 digit) : " WITH NO ADVANCING.
       ACCEPT Num2.
       MULTIPLY Num1 BY Num2 GIVING Result.
       DISPLAY "Result is = ", Result.
       STOP RUN.
ibm6

Obrázek 19: Program typu „Hello World!“ zapsaný v COBOLu. Tento screenshot ukazuje obrazovku terminálu připojeného k mainframu firmy IBM. Ostatně je zajímavé sledovat programátory s mnohdy obrovskými monitory, jak píšou či upravují programy v maličkém terminálku uprostřed pracovní plochy.

8. Minulost COBOLu: COBOL-60, COBOL-61, COBOL-64 a COBOL-65

Skutečná historie programovacího jazyka COBOL (COmmon Business Oriented Language) se začala psát již na konci padesátých let minulého století, jedná se tedy (vedle Fortranu a LISPu) o jeden z nejstarších dodnes používaných programovacích jazyků (Algol z této slavné skupiny pravděpodobně již odpadl). V roce 1959 (tedy právě před šedesáti lety) se na konferenci pořádané v USA sešli zástupci firem a některých vládních i nevládních organizací, aby se dohodli na vytvoření standardu vysokoúrovňového programovacího jazyka vhodného pro zpracování strukturovaných dat i pro řízení různých procesů ve firmách.

V průběhu této konference byly vytvořeny separátní komise vedené výkonným výborem nazvaným CODASYL (Conference on Data Systems Languages). Výsledkem práce těchto komisí byla mj. i publikace s předlouhým titulem Initial Specification for a Common Business Oriented Language (COBOL) for Programming Electronic Digital Computer, která byla vydána v roce 1960. Tato publikace se později stala mezi odbornou veřejností známá pod zkráceným názvem COBOL-60, protože na jejím základě vznikly i první implementace jazyka COBOL.

Na strukturu COBOLu popsaného v COBOL-60 měly velký vliv již tehdy existující systémy, v první řadě zejména výše zmíněný jazyk FLOW-MATIC firmy Sperry-Rand, Commercial Translator firmy IBM a AIMACO (Air Material Command). Způsob vzniku tohoto programovacího jazyka, především to, že byl vytvořený relativně početnou komisí na základě poměrně vágního zadání, nikoli menším týmem řešícím určitý konkrétní problém (viz například historie vzniku céčka, Pythonu, jazyku Lua či Go), se projevil i na jeho těžkopádné syntaxi a poměrně rigidní struktuře, která navíc v prvních verzích odrážela způsob zápisu programů na děrné štítky (viz další kapitoly s podrobnějším popisem některých konceptů). Práce komisí zabývajících se návrhem jazyka COBOL pokračovala i v následujících letech. Na základě připomínek uživatelů vznikla první modifikace jazyka popsaná ve zprávě označované jako COBOL-61 a doplňkem nazvaným Extended COBOL-61. Následoval COBOL-64, COBOL-65, a ANSI standardy v roce 1968, 1974 a 1985 (ty si přiblížíme v navazující kapitole).

ibm6

Obrázek 20: Jedna z novějších publikací o programovacím jazyku COBOL.

9. COBOL-68, ANS COBOL, COBOL-85 a COBOL 2002

Další specifikace programovacího jazyka COBOL se jmenovala COBOL-68. Důvodem pro její vznik byla především snaha o standardizaci různých nekompatibilních rozšíření a úprav, které se v průběhu času nastřádaly v prakticky všech používaných implementacích tohoto programovacího jazyka. Nenechte se ovšem zmást názvem COBOL-68, protože samotná standardizace začala již v roce 1962, ovšem samotný standard vyšel právě až v roce 1968 pod jménem USA Standard COBOL X3.23. Tento standard je dnes známější pod názvem ANS COBOL či nověji ANSI COBOL (původně se ovšem zkratka ANSI nepoužívala, protože název celého úřadu zněl United States of America Standards Institute). ISO tento standard adaptovalo až v roce 1972.

Poznámka: mimochodem je zde vidět jedna z vlastností COBOLu a (firemní) komunity okolo něj – nové vlastnosti se zavádějí a standardizují jen velmi zvolna, deset let není žádná míra, čas na adaptaci novinek se počítá na desetiletí. Oproti (například) ekosystému JavaScriptu se jedná o zcela odlišný svět.

Na začátku sedmdesátých let minulého století se COBOL stal nejrozšířenějším programovacím jazykem na světě (což bylo před příchodem mikropočítačů) a ve světě COBOLu se stala zvláštní věc – vedle komise ANS(I) začala paralelně zasedat i komise CODASYL, přičemž cílem bylo vypracování specifikace nových verzí COBOLu. Tyto specifikace byly postupně vydávány v letech 1968, 1969, 1970 a 1973. Paralelně byl v roce 1974 vydán nový standard ANS COBOLu, který později (až v roce 1978) převzalo o ISO.

Mezi další známé verze patří především COBOL-85 (práce na něm začala již v roce 1978). Původně se tento standard měl jmenoval COBOL-80, ovšem kvůli zavedeným nekompatibilitám se dokonce uvažovalo o tom, že bude komise zažalována kvůli tomu, že firmy investovaly velké prostředky do přepisu aplikací (mluvilo se o 40 milionech řádků) do nového nekompatibilního standardu.

V dalších verzích COBOLu již můžeme vidět snahu o přidání podpory nových technologií, například zpracování XML, podpory plné rekurze, podporu Unicode atd. Mezi novinky verze COBOL 2014 patří například podpora numerických datových typů definovaných v normě IEEE 754 (ovšem pochopitelně je stále možné a většinou i nutné používat i původní formáty s pevnou řádovou čárkou).

10. COBOL v současnosti

Reálný příběh jednoho COBOLovského programátora: “IT worker who’s on oxygen. He’s 70 years old, he knows the keys to the kingdom, he knows where everything is, it’s all sitting in his head. They send out a police car to pick him up every morning and bring him into work in a vault-like room.”

COBOL se pochopitelně používá i v současnosti (viz též následující kapitolu), a to z mnoha různých důvodů. Tím hlavním důvodem je fakt, že do stávajících zdrojových kódů bylo za oněch šedesát let investováno obrovské množství prostředků a mnoho existujících zdrojových kódů je mnohdy jedinou dokumentací k business procesům, které ve firmě, většinou bance či státním úřadě, probíhají. To znamená, že případný přepis by musel být proveden na základě analýzy zdrojových kódů a nikoli na základě přesné specifikace. Navíc se zdá, že COBOL skutečně do business prostředí velmi dobře zapadá (výpočty s dekadickými čísly, tvorba tiskových sestav, úzká vazba s databázemi), takže vlastně ani nevznikla velká snaha o vytvoření specifikace nového jazyka vhodného právě pro toto poněkud specifické prostředí.

„You had to extract from the organization their business rules and requirements. You had to learn how to write the code in COBOL while learning what their business was.” “These applications are so incredibly complex and sophisticated, because they encapsulate decades of business process and know-how.“

Důležité je si taktéž uvědomit, že COBOL není rozšířen kvůli tomu, že by se jednalo o populární technologii (spíš je tomu přesně naopak). Je to důsledek šedesátileté historie tohoto jazyka a taktéž díky tomu, že že aplikace psané v COBOLu tvoří tzv. vertikální trh (malé množství instalací, velká cena ze jednu licenci a z toho vyplývající dlouhá doba provozu – někdy i více než 30 let), na rozdíl od běžných desktopových aplikací a systémů operujících na trhu horizontálním (cena za vývoj je zaplacena velkým množstvím relativně laciných licencí, takže nákupní cena za novou verzi aplikace, popř. cena za její instalaci a správu v případě free software, je pro mnohé uživatele velmi nízká, což vede k rychlejším upgradům). Extrémním příkladem tohoto přístupu jsou mobilní aplikace s životností mnohdy jen několik měsíců (čemuž musí odpovídat cena za toto „spotřební zboží“).

„What you have to remember is that when the COBOL code was written, it replaced hundreds, maybe thousands of people doing manual data entry and manipulation, maybe even pen-on-paper“

11. COBOL v číslech

„I’m pretty much of the opinion that what we need to do is understand the business rules and the business process that’s embedded in these legacy systems and just rewrite.“

Možná nebude na škodu si uvést několik zajímavých čísel, které se týkají jak samotného programovacího jazyka COBOL, tak i jeho použití v současnosti:

  • V IRS („finančák“, jedna z nejdůležitějších institucí) se používají aplikace psané v COBOLu, celkově se jedná o padesát milionů řádků.
  • V USA je každý den odbaveno na 60 milionů pacientů s využitím programů napsaných právě v COBOLu.
  • V USA je COBOL použit ve 43% bankovních systémů.
  • Celých 80% bankovních transakcí prochází programy psanými v COBOLu.
  • Dokonce 95% transakcí přes bankomaty (ATM) je řízeno COBOLem (pochopitelně samotný operační systém ATM v COBOLu není, ovšem samotná transakce již COBOLovskou aplikací řízena je).
  • Uvádí se, že v současnosti dosahuje počet vývojářů pracujících s COBOLem hodnoty dva miliony (což je dost neuvěřitelné číslo, osobně si myslím, že hodně nadsazené). Velikost tohoto čísla vynikne v porovnání například s počtem vyrobených kusů osmibitových mikropočítačů Atari či ZX Spectrum (v obou případech okolo pěti milionů), přičemž můžeme předpokládat, že jen zhruba pětina vlastníků těchto strojů skutečně programovala. Tj. populární osmibitové platformě měly řekněme jeden milion vývojářů (i to je však nadsazené), zatímco nepopulární COBOL dva miliony.
  • Celkově se každý den používají programy v COBOLu, jejichž celkový rozsah dosahuje 220 miliard (!) programových řádků.
  • Existuje několik statistik o průměrném věku vývojářů používajících primárně COBOL. Jeden zdroj tvrdí 57 let (což zhruba odpovídá stáří samotného jazyka a jednalo by se tedy přibližně o druhou generaci programátorů), druhý zdroj udává, že nejvíce COBOListů je ve věkové skupině 45–50 let.
  • GitHub při hledání repositářů s COBOLem hlásí: „No public GitHub repository available“, což je pro tento programovací jazyk a jeho ekosystém asi nejtypičtější vlastnost.
Poznámka: na tomto místě je vhodné poznamenat, že v tuzemsku byla situace v mnoha směrech odlišná od USA, takže zde COBOL neměl zdaleka tak široké zázemí.

12. (Možná) budoucnost COBOLu

„In 1997 they estimated that there were about 300 billion lines of computer code in use in the world. Of that they estimated that about 80% (240 billion lines) were in COBOL and 20% (60 billion lines) were written in all the other computer languages combined.“

COBOL se, a to i přes jeho zcela neagilní povahu, poměrně dobře kombinuje s moderními technologiemi. Například společnost Micro Focus (která se na COBOL specializuje) nabízí nástroje umožňující provozování COBOLovských aplikací přímo na běžných PC, integraci s integrovanými vývojovými nástroji (tatam je doba IBMáckých terminálů s 80 znaky na řádku a 24 řádky) a dokonce i integraci s cloudovými technologiemi (AWS, Microsoft Azure, …).

Dále je již dnes možné na některých architekturách kombinovat COBOL s Javou (kterou mimochodem někteří nazývají „moderní COBOL“). Typicky se setkáme s architekturami, v nichž je samotné jádro napsáno v COBOLu a integraci s okolním světem zajišťuje právě Java, například přes messaging, REST API atd.

ibm6

Obrázek 21: S rozvojem relačních databází vybavených jazykem SQL se v COBOLu začala objevovat podpora i pro tento typ databází.

Predikce jsou v oblasti IT vždy ošemetnou záležitostí (proto je jich ostatně nutné vygenerovat více, člověk se aspoň jednou musí trefit :), ale vypadá to, že COBOL zcela jistě přežije minimálně dalších dvacet let a je možné, že oslaví i rovných 100 let. Mezitím naopak upadne v zapomnění mnohý dnes populární programovací jazyk.

ibm6

Obrázek 22: Pro COBOL existuje podpora například i ve známém vývojovém prostředí Eclipse.

13. Základní vlastnosti programovacího jazyka COBOL

„Will a future generation of young programmers want to transition away from Java to a newer language — and companies will have to once again go through another expensive and time-consuming transition.“

Jedním z cílů návrhu nového programovacího jazyka výše zmíněnou komisí CODASYL bylo to, aby programy v něm napsané byly čitelné i pro uživatele–neprogramátory (například pro manažery). Z tohoto důvodu se způsob zápisu programů v COBOLu podobá běžnému anglickému textu strukturovanému do kapitol, odstavců, vět, frází a slov. Mnohé znaky se speciálním významem, které známe z jiných programovacích jazyků, byly v COBOLu nahrazeny klíčovými slovy, což se do jisté míry týká i aritmetických, logických a relačních výrazů. Důraz na možnost zpracování strukturovaných dat se projevil i v možnosti snadného zápisu jejich struktury (ve speciálním oddílu – viz další text) i možnosti poměrně jednoduché manipulace jak s celými záznamy (ZAMĚSTNANEC, ADRESA), tak i s jejich položkami (JMÉNO_ZAMĚSTNANCE, PSČ), včetně jejich načítání či zápisu na paměťová média, řazení záznamů apod. (zde se COBOL do jisté míry přibližuje pozdějším jazykům čtvrté generace SEQUEL a na něj navazujícímu SQL).

ibm6

Obrázek 23: Zatímco mnoho jiných programovacích jazyků se lze skutečně naučit za 21 dní (1 pracovní měsíc), u COBOLu to prakticky není možné, což je mj. dáno i poměrně komplikovanou sémantikou, množstvím různých kombinací klíčových slov (více než 300) a v neposlední řadě také tím, že je COBOL dosti odlišný od dnešních mainstreamových jazyků odvozených především od Algolu.

14. Pevná struktura programů zapisovaných v COBOLu

„COBOL isn’t as sexy as working with Elixir, or Golang“

Zdrojové kódu zapisované v programovacím jazyce COBOL se vyznačují strukturou připomínající text rozsáhlé knihy. Některé úrovně této struktury jsou povinné, u jiných je naopak jejich přítomnost v programu volitelná. Celý zdrojový text programu je rozdělen na několik pojmenovaných oddílů (divisions). Oddíly se dělí na kapitoly (sekce), kapitoly na odstavce, odstavce na věty (ukončené tečkou, jako v běžné anglické gramatice), věty na příkazy a fráze, příkazy na výrazy, výrazy na slova a slova jsou již (jako u jiných jazyků) složena z jednotlivých znaků. Pro kódování znaků může být použito jak kódování EBCDIC, tak i ASCII, protože jazyk COBOL využívá jen základní alfanumerické znaky a dalších 15 znaků společných pro obě kódování.

Poznámka: může to být překvapivé, ale EBCDIC není mrtvým kódováním; stále se s ním můžeme ve světě IT setkat.

V „klasickém“ COBOLu navíc existovala i přesná pravidla určující význam jednotlivých sloupců – prvních šest znaků na každém řádku mohlo obsahovat číslo sekvence (obdoba čísla řádku v BASICu či návěstí ve FORTRANu). Maximálně šestimístné číslo sekvence se většinou rozdělovalo na dvě části – první tři cifry udávaly číslo tiskové strany, druhé tři cifry řádek v rámci jedné tiskové strany. Tento způsob umožňoval rychlé vyhledání potřebné části kódu ve vytištěných výpisech programů.

V sedmém sloupci se buď nacházela mezera (běžný programový řádek), znak pro pokračování (rozdělení dlouhého programového řádku) nebo hvězdička („*“) v případě, že se na řádku nacházel komentář. Další sloupce (rozdělené navíc do sekcí A a B), tj. osmý až sedmdesátý druhý, sloužily pro zápis programového kódu. Programové řádky delší než 72 znaků bylo nutné rozdělit na více textových řádků pomocí znaku pro pokračování – toto omezení v COBOLu existovalo z důvodu jednoznačné interpretace vytištěných programů i programů uložených na děrným štítcích.

Obrázek 24: První pokusy s COBOLem nevyžadují profesionální a patřičně drahý překladač. Vystačil si lze s GnuCOBOLem.

15. Rozdělení COBOLovského programu na oddíly

COBOL – Completely Obsolete Business Oriented Language.
COBOL – Can't Obsolesce Because Of Legacy.
Ruby on Rails? Don't forget COBOL ON COGS.
Rumour has it that the object oriented specification for COBOL was code named ADD 1 TO COBOL GIVING COBOL.

V předchozí kapitole jsme si řekli, že na nejvyšší úrovni je každá aplikace naprogramovaná v COBOLu rozdělena na čtyři oddíly, jejichž jednoznačná identifikace (jedná se o klíčová slova) a význam je uveden v následující tabulce:

Název oddílu Význam
IDENTIFICATION DIVISION identifikace programu, jeho programátora, poznámek, informace o zabezpečení atd.
ENVIRONMENT DIVISION popis vybavení počítače především jeho datových médií, mapování dat do souborů atd.
DATA DIVISION oddíl dat (popis struktury, vlastní informace)
PROCEDURE DIVISION oddíl procedur, právě zde je popsána programová logika

První dva oddíly, tj. IDENTIFICATION DIVISION a ENVIRONMENT DIVISION jsou z hlediska studie struktury programovacího jazyka relativně nezajímavé – jedná se v principu o metadata, která program (aplikaci) přesněji popisují. Důležité však je, že prakticky všechny systémově závislé vlastnosti aplikace, především způsob uložení dat v souborech (či dříve na děrných štítcích a páskách), je „izolován“ v oddílu ENVIRONMENT DIVISION, takže přenos aplikace na zcela odlišnou platformu spočívá v modifikaci údajů zapsaných v tomto oddílu – zbývající (většinou mnohem rozsáhlejší) část aplikace by – alespoň teoreticky – měla zůstat zachována beze změny. V následujících dvou kapitolách se budeme zabývat spíše informacemi zapisovanými do oddílů DATA DIVISION a PROCEDURE DIVISION, neboť jejich obsah nám bude mnohem lépe ilustrovat významné vlastnosti programovacího jazyka COBOL.

Poznámka: ve skutečnosti záleží na prostředí, ve kterém se COBOLovské aplikace spouští. Jazyk JCL (Job Control Language) identifikaci programu používá.

Následuje příklad jednoduchého programu typu „Hello world!“ zapsaného v COBOLu. V tomto programu jsou použity pouze dva oddíly IDENTIFICATION DIVISION a PROCEDURE DIVISION:

        IDENTIFICATION DIVISION.
        PROGRAM-ID. SmallestProgram.
        PROCEDURE DIVISION.
        DisplayGreeting.
           DISPLAY "Hello world".
           RUN.
Poznámka: v tomto příkladu nejsou použita čísla řádků, někdy je však nutné je zapisovat.

16. Oddíl DATA DIVISION

Je Java novým COBOLem?

V oddílu nazvaném DATA DIVISION se mohou nacházet tři typy údajů – charakteristiky (struktury a metody uložení) souborů, struktury záznamů (records) a konstanty (záznamem v tomto textu rozumíme datovou strukturu obsahující libovolný počet dalších položek, včetně dalších záznamů; v dnešních informačních systémech by záznam byl uložen například v tabulkách relační databáze). Tyto typy údajů, jenž jsou z hlediska gramatiky jazyka představovány sekcemi (sections), jsou od sebe odděleny klíčovými slovy FILE SECTION, WORKING-STORAGE SECTION a CONSTANT SECTION, které jsou sice nepovinné, ale pokud jsou v programu použity, musí být uvedeny v pořadí naznačeném pod tímto odstavcem:

        DATA DIVISION.
        FILE SECTION.
           ... popisy struktur a způsobu uložení souborů
        WORKING-STORAGE SECTION.
           ... popis záznamů uložených v operační paměti
        CONSTANT SECTION.
           ... konstanty

V části FILE SECTION s charakteristikami souborů lze pro každý pojmenovaný soubor specifikovat jeho vnitřní strukturu, způsob uložení souboru na paměťovém médiu i to, jakým způsobem se data do souboru fyzicky ukládají. Oproti dnešním programovacím jazykům se tedy jedná o značně odlišný přístup, který má své výhody (popis souboru se nachází na jednom místě, což zjednodušuje modifikace programů; navíc je struktura souboru popsána deklarativně a existuje přímé mapování mezi souborem a datovými záznamy), ale samozřejmě i některé nevýhody (určité struktury souborů nelze v COBOLu tímto způsobem uspokojivě popsat). U každého souboru lze zadat způsob jeho uložení (fráze RECORDING MODE) na paměťovém médiu, přibližný počet záznamů uložených v souboru (fráze FILE CONTAINS x RECORDS), počet záznamů uložených v jednom bloku (fráze BLOCK CONTAINS x TO y RECORDS – sdružení více záznamů do jednoho bloku může vést k optimalizaci přístupu na paměťové médium), délku jednotlivých záznamů (fráze RECORD CONTAINS x CHARACTERS) i samotnou strukturu záznamů, přesněji řečeno jméno datové struktury (fráze DATA RECORD IS xxx popř. DATA RECORDS ARE yyy). Specifikace každého souboru začíná klíčovým slovem FD (file description) za nímž následují jednotlivé fráze oddělené středníkem. Celý blok specifikace je ukončen tečkou:

        FD SEZNAM-ZAMESTNANCU;
           RECORDING MODE IS BINARY LOW DENSITY;
           FILE CONTAINS ABOUT 100 RECORDS;
           BLOCK CONTAINS 2 TO 3 RECORDS;
           RECORD CONTAINS 75 CHARACTERS;
           LABEL RECORD IS STANDARD;
           DATA RECORD IS ZAMESTNANEC.

Struktura ZAMESTNANEC, která je do souboru SEZNAM-ZAMESTNANCU uložena cca stokrát (viz výše uvedený příklad), je v COBOLu popsána následovně:

        01 ZAMESTNANEC.
           02 OSOBNI-UDAJE.
              03 JMENO; SIZE IS 12 CHARACTERS.
              03 PRIJMENI; SIZE IS 20 CHARACTERS.
           02 ADRESA.
              03 OBEC; SIZE IS 20 CHARACTERS.
              03 ADRESA; SIZE IS 20 CHARACTERS.
              03 CISLO_DOMU; SIZE IS 3 DIGITS.
              03 PSC; SIZE IS 5 DIGITS.

Jak je z výše uvedeného příkladu patrné, obsahuje záznam ZAMESTNANEC dvě podstruktury, které obsahují textové řetězce různé délky či numerické hodnoty se zadaným počtem číslic. Formát záznamu je určen dvoucifernou číslicí na začátku každé věty, nikoli odsazením (to je zde uvedeno pouze pro větší přehlednost). Konstanty se v COBOLu zapisují jako struktury se speciálním číslem 77, například:

        CONSTANT SECTION.
           77 PI; PICTURE 9V9999; VALUE 31415.

Povšimněte si použití fráze PICTURE, pomocí níž se určuje, jakým způsobem se bude textový řetězec či číslice ukládat do paměti. Jedná se vlastně o obdobu céčkových formátovacích řetězců – zápis 9V9999 znamená, že číslo (viz fráze VALUE) bude obsahovat maximálně pět cifer, přičemž za první cifru je vložena desetinná tečka. Pokud by se tímto způsobem specifikoval formát delších čísel či řetězců, lze v závorce nastavit i počet opakování znaku či číslice, například 9V9(4).

Poznámka: více o výhodách tohoto způsobu si řekneme v osmnácté kapitole.

17. Oddíl PROCEDURE DIVISION

„The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence.“
E. W, Dijkstra

Čtvrtým oddílem, který je obsažen v každém COBOLovském programu, je oddíl nazvaný příznačně PROCEDURE DIVISION. V tomto oddíle je uložena vlastní logika aplikace reprezentovaná posloupností vět, které jsou rozděleny na jednotlivé fráze a slova podobně, jako tomu bylo i u předchozích oddílů. Pomocí vět se dokonce zapisují i aritmetické a logické výrazy, takže i relativně jednoduché výpočty mohou v COBOLu zabírat několik programových řádků (alternativně lze použít frázi COMPUTE, která umožňuje zápis výrazů podobným způsobem, jaký známe z mnoha dalších programovacích jazyků). Následuje příklad zápisu aritmetických výrazů:

* C = A + B
  ADD A,B GIVING C
  COMPUTE C = A + B
 
* C = A + B + C
  ADD A,B TO C
  COMPUTE C = A + B + C
 
* C = A * B
  MULTIPLY A BY B GIVING C
 
* C = A - B
  SUBTRACT B FROM A GIVING C
 
* COUNTER++
  ADD 1 TO COUNTER

V programovacím jazyku COBOL lze samozřejmě zapisovat i programové smyčky, ovšem tělo smyčky neobsahuje blok kódu, ale pouze volání nějaké procedury. Pro tento účel se používá fráze PERFORM:

* opakovani procedury 10x
  PERFORM procedura 10 TIMES
 
* programova smycka s podminkou na zacatku
  PERFORM proved-platbu UNTIL zustatek IS GREATER THEN 0
* popr.
  PERFORM proved-platbu UNTIL zustatek IS POSITIVE

COBOL taktéž obsahuje, ostatně jako prakticky každý vyšší programovací jazyk vyvinutý v padesátých a počátku šedesátých letech minulého století (samozřejmě kromě LISPu), příkaz GO TO, pomocí kterého je možné provést skok do vybrané procedury. Navíc je možné pomocí příkazu GO TO provést i rozeskok do více procedur na základě hodnoty celočíselné proměnné: hodnota 1 znamená skok do první procedury, hodnota 2 skok do procedury druhé atd.:

GO TO proc1, proc2, proc3 DEPENDING ON status
ibm6

Obrázek 25: Další pohled na vývojové prostředí Eclipse s přídavným modulem pro podporu vývoje v COBOLu.

18. Příloha: problematika výpočtů s numerickými hodnotami s plovoucí řádovou binární čárkou

V předchozích kapitolách jsme se několikrát setkali s frází PICTURE, pomocí níž se určuje, jakým způsobem se bude číslo ukládat do paměti a jak se bude tisknout. COBOL podporuje hned několik formátů uložení čísel. Nejjednodušší, nejbezpečnější (při převodech a konverzích) a nejméně paměťově efektivní je přitom formát zoned decimal format, v němž každá číslice obsazuje celý jeden bajt. Dále existuje packed decimal format, v němž je každá číslice uložena ve čtyřech bitech a poslední bajt určuje znaménko. A pochopitelně lze použít i binární reprezentaci. V případě použití všech desítkových (decimal) formátů je důležité, že pozici desetinné čárky (tečky) určuje programátor, který tak dokáže určovat a řídit potřebnou přesnost výpočtů. To představuje velký a v mnoha případech i nejdůležitější rozdíl oproti těm programovacím jazykům, které nabízí datové typy float a double, kde se přesnost výpočtů (zadaná v počtu desetinných míst) nedá žádným způsobem řídit a ani zaručit.

Některé vlastnosti typů float a double, resp. přesněji řečeno formátů s plovoucí řádovou binární tečkou prakticky zcela znemožňují jejich použití například při výpočtech s měnami (složené úroky atd.), při výpočtech pojištění (zlomky měsíců či let) apod. Nejedná se ovšem jen o „malou přesnost“ typu „zbývá vám 0,99 dnů dovolené“ nebo o nemožnost přesné reprezentace hodnoty 0,1, ale o závažnější problémy, které mnohdy vedou ke zcela špatným výpočtům. Velmi dobrým a často citovaným příkladem je Muller's Recurrence. I tento rozdíl mezi COBOLem a většinou mainstreamových programovacích jazyků je možná jedním z důvodů, proč je COBOL stále používán a není masivně nahrazován modernějšími technologiemi.

19. Literatura

  1. Ankrum,T. Scott
    COBOL – A Best Practice (Sept, 2001)
    COBOLReport.com
  2. Arranga,Edmund C.
    The Viagrazation of COBOL
    COBOLwebler.com
  3. Arranga, Edmund C. & Price, Wilson
    Fresh from Y2K, What's next for COBOL? (March/April 2000)
    IEEE Software
  4. Arranga et al
    In COBOL's Defense : Roundtable Discussion (March/April 2000)
    IEEE Software
  5. Badower, Justin
    COBOL: Foundation of the future
    COBOLwebler.com
  6. Brown, Gary DeWard
    COBOL: The failure that wasn't
    COBOLReport.com
  7. Burger,Thomas Wolfgang
    COBOL in an open source future (May 2000)
    IBM developerWorks : Linux : Linux articles
  8. Carr, Donald and Kizior, Ronald J.
    The Case for Continued COBOL Education (March/April 2000)
    IEEE Software
  9. Feiman, J.
    The Gartner Programming Language Survey (October 2001)
    Gartner Advisory
  10. Glass, Robert L.
    Cobol – A Contradiction and an Enigma
    COMMUNICATIONS OF THE ACM September 1997/Vol. 40, No. 9
  11. Jones, Capers
    The global economic impact of the year 2000 software problem
    (Jan, 1997)
  12. Kappelman, Leon A.
    Some Strategic Y2K Blessings (March/April 2000)
    IEEE Software
  13. Kizior, Dr. Ronald J. and Carr, Donald and Halpern, Dr. Paul
    What Professionals think of the Future of COBOL?
  14. Murach, Mike
    Is COBOL Dying … or Thriving? (February 2001)
    The Cobol Newswire
  15. Pagnan, Martin
    Can A Java Programmer Be Transitioned To Cobol? (Feb, 2002)
    COBOLReport.com
  16. Reimann, Artur
    COBOL, Language of Choice – Then and Now (January, 2001)
    COBOLReport.com
  17. Sayles, Jonathan
    COBOL and the Enterprise Business Application Programming Legacy
    MicroFocus Ltd.
  18. Silverberg, Fred
    COBOL and the Business Programming Paradigm
    (1996)
  19. Sneed, Harry M.
    The Evolution of COBOL
    COBOLReport.com
  20. Wilkinson,Stephanie
    From the Dustbin, Cobol Rises (May, 2001)
    eWeek

20. Odkazy na Internetu

  1. COBOL blues
    http://fingfx.thomsonreuter­s.com/gfx/rngs/USA-BANKS-COBOL/010040KH18J/index.html
  2. COBOL Is Everywhere. Who Will Maintain It?
    https://thenewstack.io/cobol-everywhere-will-maintain/
  3. The Inevitable Return of COBOL
    https://blog.hackerrank.com/the-inevitable-return-of-cobol/
  4. It’s COBOL all the way down
    https://increment.com/programming-languages/cobol-all-the-way-down/
  5. Muller's Recurrence
    https://scipython.com/blog/mullers-recurrence/
  6. Muller's Recurrence – roundoff gone wrong
    https://latkin.org/blog/2014/11/22/mu­llers-recurrence-roundoff-gone-wrong/
  7. Lisp, Floating Points and Muller's Recurrence
    https://breeko.github.io/post/2018–07–30_lisp-floating-points-and-muller-s-recurrence/
  8. Exactly what is COBOL and why is COBOL still a widely used language in IT?
    https://freedomaftertheshar­ks.com/2016/06/27/exactly-what-is-cobol-and-why-is-cobol-still-a-widely-used-language-in-it/
  9. COBOL: 10 Reasons the Old Language Is Still Kicking
    https://www.eweek.com/deve­lopment/cobol-10-reasons-the-old-language-is-still-kicking
  10. Why COBOL Will Never Die
    https://www.techwell.com/2012/10/why-cobol-will-never-die
  11. The Inevitable Return of COBOL
    https://blog.hackerrank.com/the-inevitable-return-of-cobol/
  12. Ancient programming language COBOL can make you bank, literally
    https://thenextweb.com/fi­nance/2017/04/10/ancient-programming-language-cobol-can-make-you-bank-literally/
  13. COBOL vs Python
    https://stackshare.io/stackups/cobol-vs-python
  14. Mainframes 360
    http://www.mainframes360.com/2009/04/co­bol-tutorials.html
  15. Rosetta Code – Category:COBOL
    http://rosettacode.org/wi­ki/Category:COBOL
  16. COmmon Business Oriented Language
    http://foldoc.org/COBOL
  17. COBOL Compilers
    http://www-01.ibm.com/software/awdtools/cobol/
  18. Cobol: Not Dead Yet
    http://www.computerworld.com/s/ar­ticle/266156/Cobol_Not_De­ad_Yet?intsrc=kc_rfavs
  19. The future's bright … the future's Cobol
    http://features.techworld­.com/applications/3056/the-futures-bright–the-futures-cobol/
  20. COBOL Example Programs
    http://www.csis.ul.ie/COBOL/e­xamples/default.htm
  21. Introduction to COBOL
    http://www.csis.ul.ie/COBOL/Cou­rse/COBOLIntro.htm
  22. COBOL programming – tutorials, lectures, exercises, examples
    http://www.csis.ul.ie/COBOL/
  23. Wikipedia: COBOL
    http://en.wikipedia.org/wiki/COBOL
  24. Humor on Computers, Systems and Programming
    http://www-crypto.htw-saarland.de/weber/misc/pro­gramming.html
  25. OpenCOBOL
    http://en.wikipedia.org/wi­ki/OpenCOBOL
  26. OpenCOBOL.org
    http://opencobol.org/
  27. OpenCOBOL FAQ
    http://opencobol.add1tocobol.com/
  28. TinyCOBOL
    http://tiny-cobol.sourceforge.net/
  29. TinyCOBOL FAQ
    http://tiny-cobol.sourceforge.net/docs/faq/
  30. JTC1/SC22/WG4 – COBOL
    http://ra.dkuug.dk/jtc1/sc22/wg4/
  31. COBOL on COGS
    http://www.coboloncogs.org/INDEX.HTM
  32. Cobol Coders: Going, Going, Gone?
    http://www.computerworld.com/s/ar­ticle/266228/Cobol_Coders_Go­ing_Going_Gone_
  33. UNIVAC II – Universal Automatic Computer Model II
    http://ed-thelen.org/comp-hist/BRL61-u4.html
  34. UNIVAC I Computer System
    http://univac1.0catch.com/
  35. UNIVAC I Computer System
    http://univac1.0catch.com/y­ellowpage.htm
  36. UNIVAC (Wikipedia)
    http://en.wikipedia.org/wiki/Univac
  37. UNIVAC I (Wikipedia)
    http://en.wikipedia.org/wiki/UNIVAC_I
  38. UNIVAC II (Wikipedia)
    http://en.wikipedia.org/wi­ki/UNIVAC_II
  39. UNIVAC III (Wikipedia)
    http://en.wikipedia.org/wi­ki/UNIVAC_III