# COBOL

COBOL is een programmeertaal uit de jaren 60 die voornamelijk gebruikt wordt in zakelijke omgevingen. COBOL is de afkorting van COmmon Business Oriented Language (algemene zakelijk georiënteerde taal).

## Oorsprong en standaardisatie

COBOL is ontwikkeld in 1959 in opdracht van het Amerikaanse Department of Defense, onder meer door Grace Murray Hopper. Het moest een taal zijn die gemakkelijker te lezen, schrijven en onderhouden was dan de tot dan toe gangbare talen (assembleertaal en FORTRAN) en die daarnaast op meerdere typen computers inzetbaar moest zijn. De eerste versie van COBOL stamt uit 1960: COBOL-60.
De eis van computeronafhankelijkheid vormde een probleem, net als bij vrijwel elke computertaal. De thuisbasis van COBOL is het IBM-mainframe. Tegenwoordig draait COBOL daarnaast ook op onder meer Windows en Unix. In het verleden kwam COBOL tevens veel voor op Digital-computers als VAX en Alpha, met het besturingssysteem OpenVMS.
Van oudsher was de taal gericht op het makkelijk omspringen met (grote) gegevensbestanden in een batch-georiënteerde omgeving. Het gemak waarmee in COBOL de verwerking van gegevensbestanden wordt geprogrammeerd, maakt dat de taal tot op heden een koploperspositie inneemt op dit punt.
De groep die de eerste COBOL-versie opgezet had, CODASYL (Conference On DAta SYstem Languages), kwam in 1961 met een nieuwe versie, COBOL-61, en in 1962 en 1963 kwamen daar nog aanvullingen op: COBOL-61-extended. Vanaf die tijd nam het gebruik van de taal toe en was het ook niet meer beperkt tot de Amerikaanse markt.
De volgende versie, de COBOL-74-standaard, werd door Codasyl opgesteld in nauwe samenwerking met ANSI.
De internationalisering van het gebruik van COBOL maakte dat de discussie over wie bepaalt wat er in de standaard komt een probleem vormde. Immers, ANSI is een puur Amerikaans instituut. Op initiatief van de Nederlander Wim Ebbinkhuijsen richtte ISO in 1979 een COBOL-expertsgroep op die de standaardisatie moet bewaken. ISO bepaalde na de nodige discussie de inhoud van de nieuwe versie: COBOL-85, uitgebracht in 1985.
De volgende versie van de standaard werd gepubliceerd in 2002: COBOL 2002. In deze versie is COBOL een multi-paradigmaprogrammeertaal geworden, doordat het nu ook mogelijk is om er objectgeoriënteerd mee te programmeren. Tevens werden vele nieuwe faciliteiten toegevoegd, zoals user-defined functions en het VALIDATE statement om op een simpele manier gegevens-controle te kunnen uitvoeren.
De recentste gestandaardiseerde versie is die van 2014, waarin onder meer de mogelijkheid van dynamische tabellen aan de taal is toegevoegd.
Wereldwijd zijn nog veel bedrijfskritische toepassingen in COBOL ontwikkeld. Uit een onderzoek uit 2006 bleek echter dat 16% van de IT-managers COBOL onmiddellijk wilde uitfaseren, 36% geleidelijk uitfaseerde en nog eens 25% door kostenoverwegingen werd tegengehouden.

## Imago

COBOL heeft een ouderwets imago. Dat komt doordat heel veel COBOL-programmatuur tientallen jaren oud is. Door de vele aanpassingen in uiteenlopende stijlen en het vasthouden aan verouderde tradities is die programmatuur veelal omslachtig en zwaar gecodeerd. De programmeertaal zelf wordt voortdurend verder uitgebreid en ontwikkeld. Veel organisaties kiezen daarom tegenwoordig dan ook voor migratie van oude COBOL-programmatuur naar modern COBOL.
Tot op zekere hoogte heeft ook de kritiek van de theoreticus Edsger Dijkstra het imago van COBOL negatief beïnvloed. Dijkstra stelde in de jaren zeventig: "The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Deze uitspraak wordt soms beschouwd als een valide argument tegen COBOL.
Ondanks het ouderwetse imago zijn anno 2019 nog steeds COBOL-systemen in gebruik in Nederland, met name bij banken, verzekeraars en overheidsinstanties zoals AEGON, ING, ABN AMRO, Interpolis, RDW, DUO en de Gasunie. Zelfs sommige mobiele apps van banken draaien op de back-end in feite nog op COBOL.

## Boeken

Wim Ebbinkhuijsen heeft het Nederlandse standaardboek over COBOL geschreven en tot en met 2002 onderhouden. Ebbinkhuijsen hield zich strikt aan standaard COBOL. Het Duitstalige standaardwerk wordt onderhouden door Habib en Rozanski. Ook zij beperken zich tot exact de standaardtaal. Zij vermelden geen verschillen tussen eerdere ANSI-versies en vervallen reserved words worden ook niet genoemd.
In de Verenigde Staten vervullen Nancy en Robert Stern een vergelijkbare rol. Over verschillen tussen/met eerdere COBOL-versies verschaffen zij goed inzicht. Stern & Stern beperken zich strikt tot het platform IBM-mainframe. Het werk van Gary DeWard Brown bevat informatie over COBOL op zowel IBM-mainframe als op PC onder Windows. Het boek COBOL Unleashed bevat algemene informatie over COBOL-varianten voor allerlei platforms en interfaces.

## Versies en variaties

COBOL is een van de eerste programmeertalen. COBOL heeft veel concurrerende programmeertalen achter zich gelaten. Volgens schattingen was eind jaren tachtig ongeveer 80% van alle business-software in COBOL geprogrammeerd.
In 1989 zijn intrinsieke functies toegevoegd, waaronder enkele die de millenniumbug omzeilen; de noodzaak om van die functies gebruik te maken werd binnen bedrijfsleven en overheden pas later onderkend. Ook de toevoeging van wiskundige functies was een opmerkelijk novum.
In 2002 volgde de uitbreiding met objectgeoriënteerd COBOL, schermaansturing vanuit de COBOL-code (dus niet afhankelijk van het platform), de mogelijkheid om zelf functies te programmeren, bitwise operators, floating-point-variabelen en nog veel meer.
COBOL is sinds 1968 een gestandaardiseerde programmeertaal. Daarnaast zijn er in de loop der decennia varianten van deze programmeertaal gevormd die dialecten lijken: afwijkingen of uitbreidingen. Veel afwijkingen zijn ontstaan om geoptimaliseerd gebruik te maken van de omgeving waarin ze draaien (besturingssysteem) of de specifiek gebruikte hardware.
Veel van de vernieuwingen in COBOL 2002 waren eerder door compilerfabrikanten als uitbreidingen ingebouwd en waren daardoor al beproefd. De oudste en meest beproefde innovatie was de SCREEN SECTION die Micro Focus ooit had bedacht, waarmee schermaansturing vanuit COBOL zelf kan worden geprogrammeerd.
Hieronder een opsomming van de versies van de gestandaardiseerde versie van COBOL.
| Jaartal | Naam |
| 1959 | COBOL |
| 1960 | COBOL 60 |
| 1961 | COBOL 61 |
| 1962 | COBOL 61 EXTENDED |
| 1968 | COBOL 68 ANS |
| 1974 | COBOL 74 ANSI |
| 1985 | COBOL 85 ANSI/ISO |
| 1989 | Uitbreiding van COBOL 85 met de intrinsieke functies ANSI/ISO |
| 1997 | OO COBOL bij veel compilerfabrikanten |
| 2002 | COBOL 2002 ANSI/ISO |
Hieronder een opsomming van een aantal, deels historische, dialecten:
* IBM S/390 COBOL (VS COBOL II)
* IBM ILE COBOL
* IBM Visual Age COBOL
* HP COBOL II
* HP Micro Focus COBOL for HP UX
* Micro Focus Net Express
* MBP Visual COBOL
* AcuCorp COBOL
* CA Realia
* Liant RM COBOL
* Tandem SCOBOL (Screen COBOL)
* Tandem Non-Stop COBOL
* Fujitsu COBOL
* Data General ICOBOL
* Wang VS COBOL
* UNISYS COBOL
* Delta COBOL
De opensourcegemeenschap heeft ook een paar COBOL-compilerprojecten, te weten:
* OpenCOBOL
* TinyCOBOL

## Structuur

COBOL is een procedurele programmeertaal, een derde-generatie-programmeertaal (ook: 3GL, van het Engelse third-generation language). Sinds de meest recente ISO/ANSI-standaard, COBOL 2002, is COBOL uitgebreid met de mogelijkheid om object-georiënteerd te programmeren. Object-georiënteerde talen worden doorgaans gezien als vierde-generatie-programmeertaal. Net als bijvoorbeeld C++ is COBOL een multi-paradigmaprogrammeertaal: de programmeur kan zowel procedureel als object-georiënteerd de code structureren.
Net zoals dat bij andere 3GL-programmeertalen het geval is, bestaat een COBOL-programma uit statements die gebundeld zijn in blokken. De indeling in blokken statements vloeit voort uit decompositie van de functionaliteit van het programma.
Deze blokken statements zijn geen functies, zoals bijvoorbeeld in C. Dat wil zeggen: ze ontvangen geen parameters en geven geen returnwaarden. Parametrisering is alleen mogelijk tussen separate programma's en een programma omvat doorgaans exact één broncodebestand.
De manier waarop COBOL-programmeurs hun programma's indelen in blokken statements is wereldwijd in hoge mate uniform. Dat is het gevolg van de algemene acceptatie van Jackson Structured Programming (JSP) als dé standaard ontwerpmethode voor COBOL in de jaren zeventig. De originele methodiek van Jackson is in onbruik geraakt maar er zijn veel varianten ontwikkeld waarin verbeteringen zijn doorgevoerd.
De statements in COBOL zijn Engelstalige zinnetjes. Ze bestaan uit
* een werkwoord in de gebiedende wijs,
* dan een lijdend voorwerp
* en ten slotte eventueel een of meer bijwoordelijke bepalingen.
Een uitzondering op deze regel vormen conditie-statements (als - anders - dan en dergelijke). Doordat COBOL uit eenvoudig Engels bestaat, zijn de meeste statements voor niet-programmeurs direct leesbaar:
En hetzelfde zou ook als volgt kunnen worden geschreven:
Van oudsher wordt alle programmatekst in een COBOL-programma binnen de regels tussen de posities 8 en 72 geschreven en veel tekst mag pas beginnen op positie 12. "Alle tekst" wil zeggen de statements, de declaraties van variabelen, de koppeling met bestanden en dergelijke. Commentaartekst mag daarbuiten staan en letters die onbedoeld buiten de limiet staan, worden door de compiler niet als programmatekst verwerkt. Tegenwoordig dwingen de meeste compilers de traditionele positionering tussen schermkolom 8 en 72 en vanaf kolom 12 niet meer af. Vanwege de leesbaarheid echter houden veel programmeurs er toch graag aan vast.
De maximale regellengte was en is vaak nog 80 tekens. Dat is afkomstig van de beperkte breedte van ponskaarten die vroeger gebruikt werden om programma's in een computer te laden. De beeldschermen hadden dezelfde breedte van 80 tekens.
Terzijde: er is een oude, internationale traditie van COBOL-programmeurs om variabelen "velden" te noemen.
COBOL heeft een lange geschiedenis. Daardoor is er een grote kloof gegroeid tussen de doorsnee stijl in veel bestaande programmatuur en de stijl van hedendaags COBOL. Bestaande programmatuur is door de vele aanpassingen daaraan vaak in een wirwar van COBOL-stijlen geschreven.
Moderniseringen worden echter maar weinig toegepast en de verbreiding van COBOL 2002 is mondjesmaat. Een reden hiervoor is dat in oude COBOL-omgevingen vaak wordt vereist dat de programmeur in de oude stijl voortprogrammeert.

## Voorbeelden

Om een miniatuur-idee te geven van hoe de programmeertaal er qua structuur uitziet, volgen hieronder als voorbeeld twee uitwerkingen van een simpele “Hello world”-applicatie.
Voorbeeld 1: legacy-stijl COBOL
Voorbeeld 2: moderne stijl COBOL.
Als commentaarteken wordt in COBOL gebruikgemaakt van de asterisk (*) of de slash (/) op positie 7. Deze slash (/) gaat bij afdrukken gepaard met een bladsprong.
In traditionele COBOL wordt alle tekst voorbij positie 72 als commentaar behandeld. Een dash (-) in positie 7 geeft aan dat een tekstelement, over het algemeen een non-numeric literal, van de vorige regel voortgezet wordt.
Traditioneel wordt COBOL in uitsluitend hoofdletters geprogrammeerd, maar de taal is niet hoofdlettergevoelig. Sinds de jaren negentig neemt het gebruik van kleine letters toe. De punt aan het eind van een blok statements op een aparte regel zetten, is geen must, maar blijkt erg handig zodra er aan een paragraph statements worden toegevoegd.
In de moderne versie heeft het blok in de Procedure Division geen naam gekregen, omdat er slechts één blok is. Dan heeft een indeling in paragraphs of sections geen zin. De ENVIRONMENT DIVISION en de DATA DIVISION zijn weggelaten omdat zij niets hoeven te bevatten.
Vrijwel elke compiler accepteert de declaratie van SOURCE- en OBJECT-COMPUTER, maar die heeft alleen effect als de broncode en de compiler op een andere computer staan dan de computer waarop het resultaat van de compilatie komt te staan en er dus via een netwerk wordt gecompileerd. Dat is een uitzonderingssituatie. Toch staat die declaratie in heel veel legacy-broncodes, vaak puur als gevolg van copy-paste-werk (in COBOL-74 waren deze declaraties nog verplicht).
In de legacy-versie is een section te zien, MAIN-LOGIC SECTION, en deze is onderverdeeld in de paragraphs MAIN-LOGIC-BEGIN en MAIN-LOGIC-END. Dat is een totaal verouderd relict, maar zeker driekwart van de legacy-broncodes ziet er zo uit. Dat heeft twee oorzaken. Ten eerste zijn veel programmeurs vast blijven houden aan het oude idee van de indeling van sections in paragraphs, hoewel een JSP-ontwerp (Jackson Structured Programming) geen onderverdeling van blokken statements in subblokken toelaat. Ten tweede heeft deze opzet te maken met de vroegere gewoonte om met GO TO te werken, wat tegenwoordig in vrijwel elke programmeertaal als verwerpelijk geldt. De titel van een paragraph in COBOL is syntactisch identiek aan een go-to-label. Met "GO TO MAIN-LOGIC-END" kan vanuit elk willekeurig punt naar het eind van de section worden gesprongen en op soortgelijke wijze kan er worden teruggesprongen naar het begin.
Als de paragraph-koppen MAIN-LOGIC-BEGIN en MAIN-LOGIC-END worden weggelaten, verlopen compilatie en run eveneens foutloos. Nog handiger is het om dan maar een paragraph te maken van de section door de naam "MAIN-LOGIC SECTION" in te korten tot "MAIN-LOGIC".
De punten aan het eind van ieder statement stammen uit COBOL-74, maar komen in hedendaagse, al decennialang onderhouden COBOL-software nog veel voor. Alles wat er bij "DISPLAY" staat behalve "HELLO, WORLD!" stamt uit een afwijking van de COBOL-standaard.
Zoals de voorbeelden laten zien bestaat een COBOL-programma in principe uit vier Divisions, die op hun beurt onderverdeeld kunnen zijn in Sections (er zijn uitbreidingen in de handel waar meer hier niet genoemde secties en/of divisies mogelijk zijn, maar die behoren niet tot standaard-COBOL). Groepen statements zijn Paragraphs en elke regel is een sentence.
Statements werden vroeger afgesloten met een punt, maar een statement is iets anders dan een sentence. Een genest IF-statement, hoe diep ook, mocht nergens worden onderbroken door een punt. Sinds COBOL-85 zorgen de zogeheten scope terminators voor de nodige afgrenzingen en overzichtelijkheid. Dat zijn items die beginnen met END-: END-IF voor de afsluiting van een blok statements bij een IF-voorwaarde, END-READ voor de afsluiting van een of twee blokken statements binnen een READ-statement (namelijk bij AT END en NOT AT END), enzovoort.
* De Identification Division bevat algemene informatie over het programma: naam (verplicht), auteur, datum waarop het geschreven is, en er zijn nog enkele mogelijkheden.
* De Environment Division dient voor het leggen van koppelingen met de omgeving:
** Configuration Section - (rand)apparatuur, interfaces en andere technische zaken. In continentaal Europa omvat de “CONFIGURATION SECTION.” zeer algemeen een “SPECIAL-NAMES.”-paragraaf met daarin een “DECIMAL-POINT IS COMMA.”-clause. Hierdoor worden de Angelsaksische functies van “.” en “,” in numerieke velden omgewisseld.
** Input-Output Section - invoer- en uitvoerbestanden (afgezien van beeldscherm en toetsenbord).
* De Data Division bevat de declaraties van de velden (= variabelen) die het programma hanteert:
** File Section - specificatie van de bestandsstructuren, zoals de lengte van elke recordsoort en eventuele velddeclaraties;
** Working-Storage Section - kan de declaraties van de recordvelden bevatten, namelijk als de programmeur ervoor kiest om de records hierheen te kopiëren voor verwerking, en moet de declaraties van de programma-interne variabelen bevatten.
* Procedure Division bevat de eigenlijke instructies voor de processor, de statements:
** gestructureerd in blokken, dus paragraphs of sections, doorgaans conform een variant van Jackson Structured Programming.