Artikel top billede

(Foto: Computerworld)

Lær at skrive kode i Cobol

Få styr på det sprog, der snarere minder om prosa end om de fleste kodetypers fritskrabede meldinger.

Af Redaktionen, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Vores tema i dette nummer kunne ikke være mere anderledes. Cobol driver nemlig mange af nutidens kommercielle applikationer, men da de i mange tilfælde blev skrevet for flere årtier siden, er dette sprog temmelig ukendt.

Introduktion til Cobol

Cobol blev lanceret i 1959, og det er således et af de første højniveausprog. Af de sprog, der stadig er almindeligt udbredte, er kun Fortran ældre, idet det kom et par år før Cobol. Men disse to sprog er vidt forskellige.

I det videnskabelige sprog Fortran (og også i mange andre) ser sætningen, der beregner reaktansen for to parallelt forbundne kondensatorer, sådan ud:

XC = 1 / (OMEGA * (C1 + C2))

I Cobol skal vi imidlertid bruge denne kode:

ADD CAPACITANCE-1 TO CAPACI-
TANCE-2 GIVING TOTAL CAPACITANCE

MULTIPLY OMEGA BY TOTAL-CAPACI-
TANCE GIVING OMEGA-C.

DIVIDE 1 BY OMEGA-C GIVING

REACTANCE

Strengt taget kunne vi have brugt Cobol Compute-sætningen, der ville have gjort det muligt at foretage beregningen på en enkelt linje. Men pointen er, at Cobol er beregnet til at ligne det engelske sprog. Det bruger sågar punktummer ved slutningen af en sætning.

Der bliver ofte set skævt til Compute-sætningen, fordi den får koden til at virke mindre som sprog og mere som matematik. Siden Cobol blev udviklet, er det også kommet til at omfatte objektorientering, relationsdatabaser, .NET og meget mere. I denne artikel skal vi fokusere på »traditionel« Cobol.

Grunden til vores snævre fokus her hænger sammen med Cobols oprindelige applikation. Forretningsfolk er ofte ikke synderlig matematiske, og man besluttede, at en ikkeprogrammør skulle kunne se på et Cobolprogram og forstå, hvordan det virkede.

Med det in mente dropper vi den akavede proces, det er at knytte Cobol til videnskabelige applikationer, og koncentrerer os om den form for databehandlingsapplikationer, der i langt højere grad er Cobols force.

Det første program

Start Net Express og åbn programmet »PERSONNEL1.cbl«, der kan hentes på www.aod.dk. Du kan også selv skrive det ind i Net Express efter at have valgt »File | New | Program«. Hvis du vælger selv at oprette det, skal du sikre dig, at du skriver det hele i de rigtige spalter.

Programmet bliver brugt sammen med en datafil (»PERSONNEL1.dat«), der indeholder oplysninger om et fiktivt firmas ansatte – den skal ligge i samme mappe som PERSONNEL.cbl. Den kan hentes her.

Du kan også oprette din egen fil ved hjælp af Notesblok eller ved at skrive direkte ind i Net Express. Hvis du vælger at oprette filen selv, skal du blot vide, at hver linje indeholder et efternavn i kolonner på op til ti (med mellemrum til venstre, hvis navnet er på mindre end ti bogstaver), et fornavn i kolonnerne 11 til 20 og bogstavet M eller F i kolonne 21, der angiver, om personen er mand eller kvinde.

Skriv så mange mennesker ind, som du vil. Før du kan køre programmet, skal du først kompilere det. Det får Net Express til at gennemsøge programmet for fejl.

Hvis der ikke er nogen alvorlige fejl, bliver Cobol-koden konverteret til eksekverbar kode, der kan køre på en pc. Du kompilerer programmet ved simpelthen at klikke på det røde ikon i værktøjslinjen.

Der kommer en meddelelse nederst på skærmen, som fortæller, at det er sket. Hvis der er nogen fejl, bliver de også nævnt her.

Hvis du bruger det program, der ligger på her, er der ingen fejl, men hvis du selv har skrevet det ind, og du har begået en fejl, får du nu at vide, hvad du har gjort forkert.

Fejl bliver betegnet med et linje- og kolonnetal – (33,35) for eksempel – og der kommer også et rødt kryds i den pågældende linje foroven. Hvis der er fejl, skal du redigere programmet og prøve igen.

Når programmet er blevet kompileret korrekt, skal du køre det igen ved hjælp af det sorte ikon, der ligner en løbende skikkelse. I dialogboksen »Start Animating« vælger du »Browse« og derefter »PERSONNEL1.int«, der er den eksekverbare kode, som lige er blevet oprettet.

Når du klikker på »OK«, kommer et vindue med navnet Application Output frem. Det er her, du kan se outputtet af Cobol-programmet. Det bør indeholde navnene på alle de kvindelige ansatte på listen.

Programstruktur

Nu har vi brugt Net Express og kørt et simpelt program. Lad os se lidt mere detaljeret på koden for at stifte bekendtskab med strukturen i et Cobol-program.

Et Cobol-program er delt op i fire afdelinger. Selv om de har været valgfri i 20 år, nævner vi dem her for at få det hele med. Først er der Identification Division, der begynder med disse to ord (traditionelt med store bogstaver, men alle moderne Cobol-varianter er mindre nøjeregnende) efterfulgt af et punktum.

Den eneste sætning, der er obligatorisk i Identification Division, er PROGRAM-ID, der leverer programmets navn, selv om mange programmører også medtager AUTHOR-sætningen.

Dernæst kommer Environment Division, der giver information, som er specifik for den hardware, som programmet skal køre på. Vi bruger den til at give oplysninger om den datafil, der skal bruges af programmet.

Som det tredje bliver Data Division brugt til at definere de data, som programmet skal bearbejde. Den er delt op i flere sektioner, hvoraf de hyppigst brugte er File Section og Working-Storage Section.

Den sidstnævnte er dog ikke med i vores første program. File Section definerer strukturen for hver linje (eller »record«) i den datafil, som dette program bruger, som vi har beskrevet det tidligere.

Procedure Division er stedet, hvor de sætninger, der instruerer computeren til at gøre noget, kommer frem. Man kan være tilbøjelig til at betragte det som et rigtigt program, og det burde være ret indlysende, hvordan dette program udskriver navnene på de kvindelige ansatte i datafilen.

Næste trin

Nu, da du ved noget om strukturen i et Cobol-program, burde du være i stand til at skrive et, der kan noget lidt mere avanceret. Vi skal beregne gennemsnitslønnen for alle vores ansatte og vise tallet sammen med de højeste og de laveste lønninger.

Naturligvis indeholder filen »PERSONNEL1.dat« ingen oplysninger om lønninger, og programmet bruger derfor i stedet filen »PERSONNEL2.dat«. Hvis du gerne vil lave dine egne filer, er den identisk med PERSONNEL1.dat, bortset fra at den rummer en løn på seks cifre (med nuller – ikke mellemrum – hvor det er nødvendigt) i kolonnerne 22 til 27.

De to første ændringer, du skal lave, er trivielle. Først ændrer du PROGRAM-ID i linje to til PERSONNEL2. Dernæst ændrer du i linje syv navnet på datafilen til PERSONNEL2.DAT.

Den næste ændring forholder sig til, at dataformatet er anderledes; vi har lønoplysninger. I File Section under Data Division vil du bemærke, at der er en File Description (FD) for PERSONNEL-FILE.

Den linje, der begynder med 01 viser, at på højeste niveau indeholder hver linje en variabel, der hedder PERSONNEL-RECORD. De næste tre linjer, der begynder med 02, viser, at PERSONNEL-RECORD er delt op i tre felter, der hedder SURNAME, FIRST-NAME og SEX, der (i overensstemmelse med PIC-sætningerne) er henholdsvis 10 alfanumeriske, 10 alfanumeriske og 1 alfanumerisk variabel.

Til vores næste program skal vi bruge en ekstra 02-niveau-variabel, der hedder SALARY. PIC-sætningen bør være 9(6), hvilket betyder, at det er en numerisk variabel på seks cifre.

For første gang skal vi bruge nogle arbejdende variabler. Tilføj det følgende umiddelbart før Procedure Division, idet PIC 99 betyder det samme som PIC 9(2):

WORKING-STORAGE SECTION.

01 NUMBER-OF-EMPLOYEES PIC 99.

01 LOWEST PIC 9(6).

01 HIGHEST PIC 9(6).

01 TOTAL PIC 9(8).

01 AVERAGE PIC 9(6).

Til sidst skal vi ændre Procedure Division, så den udfører vores nye fordring. Først sætter vi LOWEST til en vilkårlig høj værdi, for eksempel 999999, ved hjælp af denne sætning:

MOVE 999999 to LOWEST.

Når det er gjort, skal vi også sætte HIGHEST til en vilkårlig lav værdi, for eksempel 0, og sætte både NUMBER-OF-EMPLOYEES og TOTAL til 0.

Så åbner vi filen og skriver en løkke, hvori vi indlæser tallene et ad gangen, ligesom vi gjorde i det første eksempel. Men denne gang skal vi i stedet for de to linjer, der fik navnene på de kvindelige ansatte frem, gøre det følgende:

1. ADD1 til NUMBER-OF-EMPLOYEES.
(Brug nøjagtig denne sætning).

2. ADD SALARY to TOTAL.
(Brug igen nøjagtig denne sætning).

3. Skift tallet for LOWEST til de aktuelle tal for SALARY, hvis det er lavere end LOWEST.

4. Til sidst ændrer du tallet for HIGHEST til det aktuelle tal for SALARY, hvis det er højere end HIGHEST.

Du får selv lov til at regne ud, hvilke sætninger der skal udføre punkterne 3 og 4, for du har allerede set et eksempel på IF-sætningen.

Efter den sætning, der skal lukke filen, skal du beregne gennemsnittet ved hjælp af en DIVIDE-sætning (vi så et eksempel på en på første side i denne artikel). Til sidst skal du bruge tre DISPLAY-sætninger til at præsentere resultaterne. Hvis du vil vise den laveste løn, skal du for eksempel bruge denne sætning:

DISPLAY »The lowest salary is«, LOWEST

Når du har indført ændringerne, skal du prøve at kompilere programmet. Når du har ryddet op i eventuelle fejl, skal du køre det. Hvis alt er godt, burde du få korrekte resultater. Bevares, tallene har nuller, der ikke pynter, men vi lader det være op til dig selv at finde en løsning på det.

Nyere udgaver af Cobol er langt mindre strukturerede, når det gælder kolonner, og gør det muligt at bruge kildekode i helt frie formater. Men tidligere skulle Cobol-programmer skrives ind i specifikke kolonner. Her beskriver vi, hvad der skal hvorhen.

Hvis du åbner et af prøveprogrammerne herfra, vil du bemærke, at der intet sker i kolonnerne et til seks for hver linje. I hulkortets dage (se Spot på... Mainframes) indeholdt disse kolonner sekvenstal, der gjorde det muligt at sortere kortene, hvis man kom til at tabe dem på gulvet.

Da programmer i dag bliver indlæst fra filer, bruger man normalt ikke disse sekvenstal. Kolonne syv er normalt også tom, men man kan sætte en asterisk her for at angive, at resten af linjen er en kommentar.

Område A begynder i kolonne otte, mens Område B begynder i kolonne 12 og kører til kolonne 72. De fleste sætninger går til Område B (og de begynder derfor i kolonne 12), men der er nogle få undtagelser, der begynder i kolonne otte. Det drejer sig om overskrifter til afdelinger, sektioner og afsnit plus niveau 01 og 77-definitioner i Data Division.

Det gælder for de fleste programmeringssprog, at hvis man har brug for at vise en liste i stigende eller faldende rækkefølge, er man nødt til selv at skrive koden. Det er ikke svært, men det kræver nogle sætninger, og man kan godt komme ud for at skulle prøve nogle gange, før det virker.

Da den form for sortering er er udbredt krav i den slags applikationer, som Cobol var beregnet til, indeholder sproget faktisk en SORT-sætning.

Hvis du vil have styr på denne effektive funktion, får du her en øvelse, som du kan prøve kræfter med.

Først skal du skrive en fødselsdato i formen YYMMDD for hver post i datafilen. Dernæst skal du ved hjælp af SORT-sætningen sortere listen over ansatte i stigende rækkefølge efter alder og vise den sorterede liste, idet man ser både navn og fødselsdag for hver ansat.

Hvis du i FD bruger en niveau-02-variabel ved navn DATE-OF-BIRTH og underinddeler den i tre niveau-03-variabler ved navn DOB-YEAR, DOB-MONTH og DOB-DAY, kan du vise datoen i et fornuftigt format såsom 12/01/69 i stedet for 690112, som den vil fremstå i datafilen.

Når du har sået dette frø, overlader vi det til dig at finde ud af, hvordan du selv bruger SORT-sætningen. Du vil opdage, at det myldrer med nyttige guider på nettet.

Moderne programmeringssprog såsom Java så oprindelig dagens lys i pc’ens æra – og BASIC blev først brugt på 1960’ernes og 1970’ernes minicomputere.

Cobol blev derimod oprindelig brugt på mainframesystemer, og det fik indflydelse på mange af sprogets egenskaber (som for eksempel at kolonne et til seks var forbeholdt sekvenstal). Resultatet er, at den metode, man brugte til at udvikle et program, var helt anderledes end den teknik, vi har brugt her.

Terminaler, som programmørerne kunne bruge til at interagere direkte med computeren, var sjældne i mainframesystemernes barndom. I stedet brugte man hulkort, der blev forberedt offline ved hjælp af et elektromekanisk kortstempel. Hvert kort havde 80 kolonner og repræsenterede en enkelt linje i et Cobol-program. Programmet blev indlæst som en stak kort, der ofte var flere centimeter høj.

Når det var blevet indlæst via en kortlæser, stod programmet i kø på mainframecomputeren og ventede på, at der blev tid til at kompilere og køre det. Ventetiden afhang af, hvor mange andre opgaver, der stod og ventede i køen, men der kunne gå både minutter og timer, før det endelige resultat kom ud af linjeprinteren i form af en bane leporellopapir med 132 kolonner.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Det skal du bruge…

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

Fejlmeddelelser

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

Resultater i ren tekst

[/themepacific_accordion_section]
[/themepacific_accordion]