Programování mainframů: COBOL

Pavel Tišnovský 15. 12. 2009

V předchozí části seriálu o historii výpočetní techniky jsme si stručně popsali tři programovací jazyky, které byly vytvořeny v průběhu padesátých let minulého století. Jednalo se o ALGOL, FORTRAN a LISP. Na mainframech se však záhy začaly používat i další programovací jazyky, především COBOL, jehož popisem se budeme zabývat dnes.

Obsah

1. Stručná historie programovacího jazyka COBOL

2. Vlastnosti programovacího jazyka COBOL

3. Struktura programů zapisovaných v COBOLu

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

5. Oddíl DATA DIVISION

6. Oddíl PROCEDURE DIVISION

7. Demonstrační příklad – vynásobení dvou čísel

8. Literatura

9. Odkazy na Internetu

1. Stručná historie programovacího jazyka COBOL

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

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 minule popsaného Fortranu a LISPu) o jeden z nejstarších dodnes používaných programovacích jazyků. V roce 1959 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 CODASYL (Conference on Data Systems Languages). Výsledkem práce těchto komisí byla mj. i publikace 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.

ibm6

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

Na strukturu COBOLu popsaného v COBOL-60 měly velký vliv již tehdy existující systémy, zejména 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, kterou jsme si přiblížili v prvních částech tohoto seriálu), 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). 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.

ibm6

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

2. Vlastnosti programovacího jazyka COBOL

„In 1997 they (Gartner, pozn. autora) 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.“

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 3: S rozvojem relačních databází vybavených jazykem SQL se v COBOLu začala objevovat podpora i pro tento typ databází.

V současnosti je programovací jazyk COBOL i přes jeho technologickou zastaralost stále používán – jak jsme si již řekli v předchozí části tohoto seriálu, je v COBOLu naprogramováno více než 70% dnes běžících transakčních systémů a i celkový počet programových řádků napsaných v COBOLu je (alespoň podle průzkumu firmy Gartner) mnohem vyšší, než u dnes populárních programovacích jazyků, což ovšem není dáno vlastnostmi tohoto jazyka, ale spíše tím, ž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).

ibm6

Obrázek 4: Zatímco mnoho jiných programovacích jazyků se lze skutečně naučit za 21 dní (cca 1 pracovní měsíc), u COBOLu to prakticky není v dostatečné kvalitě možné, což je mj. dáno i jeho 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.

3. Struktura programů zapisovaných v COBOLu

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

Programy 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ý program 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.

ibm6

Obrázek 5: Editor (vzdáleně přístupný přes konzoli) určený pro editaci 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.

4. 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.

ibm6

Obrázek 6: Program typu „Hello World!“ zapsaný v COBOLu. Tento screenshot ukazuje obrazovku terminálu připojeného k mainframu.

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, čísla řádků nejsou uvedena (lze je zapsat na první až šestý sloupec každého řádku):

        IDENTIFICATION DIVISION.
        PROGRAM-ID. SmallestProgram.
        PROCEDURE DIVISION.
        DisplayGreeting.
           DISPLAY "Hello world".
           RUN.

5. Oddíl DATA DIVISION

Je Java novým COBOLem? Autor tohoto obrázku si myslí, že zná odpověď :-)

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

ibm6

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

6. 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 LESS THAN 0
* popr.
  PERFORM proved-platbu UNTIL zustatek IS NEGATIVE

COBOL taktéž obsahuje, ostatně jako prakticky každý vyšší programovací jazyk vyvinutý v padesátých a na 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 8: Další pohled na vývojové prostředí Eclipse s přídavným modulem pro podporu vývoje v COBOLu.

7. Demonstrační příklad – vynásobení dvou čísel

„Gartner estimates for 2002 that there are about two million COBOL programmers world-wide compared to about about one million Java programmers and one million C++ programmers.“

V demonstračním příkladu vypsaném níže je ukázán způsob zápisu celého (i když velmi jednoduchého) programu v COBOLu. Povšimněte si odsazení programového kódu od levého okraje (na prvních šesti sloupcích se mohou nacházet čísla řádků, v sedmém sloupci pak začátek komentáře či znak specifikující pokračování předchozího řádku), rozdělení celého programu do tří oddílů (čtvrtý oddíl je nepovinný), zápisu jednotlivých vět složených z frází i toho, jakým způsobem programátor specifikoval, že čísla, která se mají vynásobit, mohou mít pouze jednu cifru a výsledek má být maximálně dvouciferný:

       $ 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.

Popř. lze doplnit i čísla programových řádků pro kompatibilitu se staršími překladači:

000100 $ SET SOURCEFORMAT"FREE"
000200 IDENTIFICATION DIVISION.
000300 PROGRAM-ID.  Multiplier.
000400 AUTHOR.  Michael Coughlan.
000500* Example program using ACCEPT, DISPLAY and MULTIPLY to
000600* get two single digit numbers from the user and multiply them
000700* together
000800
000900 DATA DIVISION.
001000
001100 WORKING-STORAGE SECTION.
001200 01  Num1                                PIC 9  VALUE ZEROS.
100000 01  Num2                                PIC 9  VALUE ZEROS.
100100 01  Result                              PIC 99 VALUE ZEROS.
100200
100300 PROCEDURE DIVISION.
100400 DISPLAY "Enter first number  (1 digit) : " WITH NO ADVANCING.
100500 ACCEPT Num1.
100600 DISPLAY "Enter second number (1 digit) : " WITH NO ADVANCING.
100700 ACCEPT Num2.
100800 MULTIPLY Num1 BY Num2 GIVING Result.
100900 DISPLAY "Result is = ", Result.
100999 STOP RUN.

8. 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

9. Odkazy na Internetu

  1. Rosetta Code – Category:COBOL
    http://rosettacode.org/…tegory:COBOL
  2. COmmon Business Oriented Language
    http://foldoc.org/COBOL
  3. COBOL Compilers
    http://www-01.ibm.com/…tools/cobol/
  4. Cobol: Not Dead Yet
    http://www.computerworld.com/…Not_Dead_Yet?…
  5. The future's bright … the future's Cobol
    http://features.techworld.com/…tures-cobol/
  6. COBOL Example Programs
    http://www.csis.ul.ie/…/default.htm
  7. Introduction to COBOL
    http://www.csis.ul.ie/…BOLIntro.htm
  8. COBOL programming – tutorials, lectures, exercises, examples
     http://www.csis.ul.ie/COBOL/
  9. Wikipedia: COBOL
    http://en.wikipedia.org/wiki/COBOL
  10. Humor on Computers, Systems and Programming
    http://www-crypto.htw-saarland.de/…ramming.html
  11. OpenCOBOL
    http://en.wikipedia.org/wiki/OpenCOBOL
  12. OpenCOBOL.org
    http://opencobol.org/
  13. OpenCOBOL FAQ
    http://opencobol.add1tocobol.com/
  14. TinyCOBOL
    http://tiny-cobol.sourceforge.net/
  15. TinyCOBOL FAQ
    http://tiny-cobol.sourceforge.net/docs/faq/
  16. JTC1/SC22/WG4 – COBOL
    http://ra.dkuug.dk/jtc1/sc22/wg4/
  17. COBOL on COGS
    http://www.coboloncogs.org/INDEX.HTM
  18. Cobol Coders: Going, Going, Gone?
    http://www.computerworld.com/…_Going_Gone_
Našli jste v článku chybu?
DigiZone.cz: Brexit na ČT 24? Skoro 2 miliony...

Brexit na ČT 24? Skoro 2 miliony...

120na80.cz: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

DigiZone.cz: Světlé zítřky gaučových sportovců

Světlé zítřky gaučových sportovců

DigiZone.cz: Boj Markízy a Novy o federální trh vrcholí

Boj Markízy a Novy o federální trh vrcholí

DigiZone.cz: Prima Max bude mít letní kino. Na střeše...

Prima Max bude mít letní kino. Na střeše...

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...

DigiZone.cz: Soud zakázal šíření TV Markíza v ČR

Soud zakázal šíření TV Markíza v ČR

DigiZone.cz: Pardubicko: Výrazně posílen Mux 3

Pardubicko: Výrazně posílen Mux 3

120na80.cz: Jsou opalovací krémy pro děti jiné?

Jsou opalovací krémy pro děti jiné?

120na80.cz: Léky a dietní opatření při kopřivce

Léky a dietní opatření při kopřivce

Měšec.cz: Co s reklamací, když e-shop krachuje?

Co s reklamací, když e-shop krachuje?

Podnikatel.cz: Oblíbené Babišovo reverse charge. Potopilo je?

Oblíbené Babišovo reverse charge. Potopilo je?

DigiZone.cz: Noxon iRadio 1 W bude za pár měsíců

Noxon iRadio 1 W bude za pár měsíců

DigiZone.cz: Nova: technické pauzy každé 1. pondělí

Nova: technické pauzy každé 1. pondělí

120na80.cz: Krémy, nebo spreje na opalování?

Krémy, nebo spreje na opalování?

Vitalia.cz: Máte chutě? Nejezděte do světa, ale do Dobřichovic

Máte chutě? Nejezděte do světa, ale do Dobřichovic

Vitalia.cz: 5 porcí ovoce a zeleniny: no ale jak na to?

5 porcí ovoce a zeleniny: no ale jak na to?

DigiZone.cz: Dabingové ceny znají letošní nominace

Dabingové ceny znají letošní nominace

Root.cz: Quake slaví 20 let novou epizodou zdarma

Quake slaví 20 let novou epizodou zdarma

Lupa.cz: Nej aplikace? Vodafone, Mozkovna, Záchranka

Nej aplikace? Vodafone, Mozkovna, Záchranka