Obsah
1. The future's bright … the future's Cobol
2. Vznik vyšších programovacích jazyků
3. Skuteční programátoři sice píšou svoje programy přímo ve strojovém kódu, ale kdo to zaplatí?
4. Grace Hopper a její vliv na vývoj vyšších programovacích jazyků
5. Programovací jazyky A-0, A-2 a MATH-MATIC
6. Programovací jazyky B-0 a FLOW-MATIC
8. Minulost COBOLu: COBOL-60, COBOL-61, COBOL-64 a COBOL-65
9. COBOL-68, ANS COBOL, COBOL-85 a COBOL 2002
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
18. Příloha: problematika výpočtů s numerickými hodnotami s plovoucí řádovou binární čárkou
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ů).
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.
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).
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é.
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 :-).
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 |
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ý.
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.
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.
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.
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 .
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.
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)
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.
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).
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.
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.
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.
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.
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).
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í.
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.
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.
16. Oddíl DATA DIVISION
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).
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
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
- Ankrum,T. Scott
COBOL – A Best Practice (Sept, 2001)
COBOLReport.com - Arranga,Edmund C.
The Viagrazation of COBOL
COBOLwebler.com - Arranga, Edmund C. & Price, Wilson
Fresh from Y2K, What's next for COBOL? (March/April 2000)
IEEE Software - Arranga et al
In COBOL's Defense : Roundtable Discussion (March/April 2000)
IEEE Software - Badower, Justin
COBOL: Foundation of the future
COBOLwebler.com - Brown, Gary DeWard
COBOL: The failure that wasn't
COBOLReport.com - Burger,Thomas Wolfgang
COBOL in an open source future (May 2000)
IBM developerWorks : Linux : Linux articles - Carr, Donald and Kizior, Ronald J.
The Case for Continued COBOL Education (March/April 2000)
IEEE Software - Feiman, J.
The Gartner Programming Language Survey (October 2001)
Gartner Advisory - Glass, Robert L.
Cobol – A Contradiction and an Enigma
COMMUNICATIONS OF THE ACM September 1997/Vol. 40, No. 9 - Jones, Capers
The global economic impact of the year 2000 software problem
(Jan, 1997) - Kappelman, Leon A.
Some Strategic Y2K Blessings (March/April 2000)
IEEE Software - Kizior, Dr. Ronald J. and Carr, Donald and Halpern, Dr. Paul
What Professionals think of the Future of COBOL? - Murach, Mike
Is COBOL Dying … or Thriving? (February 2001)
The Cobol Newswire - Pagnan, Martin
Can A Java Programmer Be Transitioned To Cobol? (Feb, 2002)
COBOLReport.com - Reimann, Artur
COBOL, Language of Choice – Then and Now (January, 2001)
COBOLReport.com - Sayles, Jonathan
COBOL and the Enterprise Business Application Programming Legacy
MicroFocus Ltd. - Silverberg, Fred
COBOL and the Business Programming Paradigm
(1996) - Sneed, Harry M.
The Evolution of COBOL
COBOLReport.com - Wilkinson,Stephanie
From the Dustbin, Cobol Rises (May, 2001)
eWeek
20. Odkazy na Internetu
- COBOL blues
http://fingfx.thomsonreuters.com/gfx/rngs/USA-BANKS-COBOL/010040KH18J/index.html - COBOL Is Everywhere. Who Will Maintain It?
https://thenewstack.io/cobol-everywhere-will-maintain/ - The Inevitable Return of COBOL
https://blog.hackerrank.com/the-inevitable-return-of-cobol/ - It’s COBOL all the way down
https://increment.com/programming-languages/cobol-all-the-way-down/ - Muller's Recurrence
https://scipython.com/blog/mullers-recurrence/ - Muller's Recurrence – roundoff gone wrong
https://latkin.org/blog/2014/11/22/mullers-recurrence-roundoff-gone-wrong/ - Lisp, Floating Points and Muller's Recurrence
https://breeko.github.io/post/2018–07–30_lisp-floating-points-and-muller-s-recurrence/ - Exactly what is COBOL and why is COBOL still a widely used language in IT?
https://freedomafterthesharks.com/2016/06/27/exactly-what-is-cobol-and-why-is-cobol-still-a-widely-used-language-in-it/ - COBOL: 10 Reasons the Old Language Is Still Kicking
https://www.eweek.com/development/cobol-10-reasons-the-old-language-is-still-kicking - Why COBOL Will Never Die
https://www.techwell.com/2012/10/why-cobol-will-never-die - The Inevitable Return of COBOL
https://blog.hackerrank.com/the-inevitable-return-of-cobol/ - Ancient programming language COBOL can make you bank, literally
https://thenextweb.com/finance/2017/04/10/ancient-programming-language-cobol-can-make-you-bank-literally/ - COBOL vs Python
https://stackshare.io/stackups/cobol-vs-python - Mainframes 360
http://www.mainframes360.com/2009/04/cobol-tutorials.html - Rosetta Code – Category:COBOL
http://rosettacode.org/wiki/Category:COBOL - COmmon Business Oriented Language
http://foldoc.org/COBOL - COBOL Compilers
http://www-01.ibm.com/software/awdtools/cobol/ - Cobol: Not Dead Yet
http://www.computerworld.com/s/article/266156/Cobol_Not_Dead_Yet?intsrc=kc_rfavs - The future's bright … the future's Cobol
http://features.techworld.com/applications/3056/the-futures-bright–the-futures-cobol/ - COBOL Example Programs
http://www.csis.ul.ie/COBOL/examples/default.htm - Introduction to COBOL
http://www.csis.ul.ie/COBOL/Course/COBOLIntro.htm - COBOL programming – tutorials, lectures, exercises, examples
http://www.csis.ul.ie/COBOL/ - Wikipedia: COBOL
http://en.wikipedia.org/wiki/COBOL - Humor on Computers, Systems and Programming
http://www-crypto.htw-saarland.de/weber/misc/programming.html - OpenCOBOL
http://en.wikipedia.org/wiki/OpenCOBOL - OpenCOBOL.org
http://opencobol.org/ - OpenCOBOL FAQ
http://opencobol.add1tocobol.com/ - TinyCOBOL
http://tiny-cobol.sourceforge.net/ - TinyCOBOL FAQ
http://tiny-cobol.sourceforge.net/docs/faq/ - JTC1/SC22/WG4 – COBOL
http://ra.dkuug.dk/jtc1/sc22/wg4/ - COBOL on COGS
http://www.coboloncogs.org/INDEX.HTM - Cobol Coders: Going, Going, Gone?
http://www.computerworld.com/s/article/266228/Cobol_Coders_Going_Going_Gone_ - UNIVAC II – Universal Automatic Computer Model II
http://ed-thelen.org/comp-hist/BRL61-u4.html - UNIVAC I Computer System
http://univac1.0catch.com/ - UNIVAC I Computer System
http://univac1.0catch.com/yellowpage.htm - UNIVAC (Wikipedia)
http://en.wikipedia.org/wiki/Univac - UNIVAC I (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_I - UNIVAC II (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_II - UNIVAC III (Wikipedia)
http://en.wikipedia.org/wiki/UNIVAC_III