COBOL (Română)

SyntaxEdit

COBOL are o sintaxă în limba engleză, care este utilizată pentru a descrie aproape totul dintr-un program. De exemplu, o condiție poate fi exprimată ca x ESTE MAI MARE decât y sau mai concis ca x MAI MARE y sau x > y . Condițiile mai complexe pot fi „prescurtate” prin eliminarea condițiilor și variabilelor repetate. De exemplu, a > b ȘI a > c SAU a = d poate fi scurtat la a > b ȘI c OR = d . Pentru a susține această sintaxă asemănătoare englezei, COBOL are peste 300 de cuvinte cheie. Unele dintre cuvintele cheie sunt simple ortografii alternative sau pluralizate ale aceluiași cuvânt, care oferă mai multe afirmații și clauze asemănătoare cu cele ale limbii engleze; de exemplu, cuvintele cheie IN și OF pot fi utilizate în mod interschimbabil, la fel ca IS și ARE și VALUE și VALORI .

Fiecare program COBOL este alcătuit din patru elemente lexicale de bază: cuvinte, litere, șiruri de caractere de imagine (vezi § IMAGINE clauză) și separatoare. Cuvintele includ cuvinte rezervate și identificatori definiți de utilizator. Au o lungime de până la 31 de caractere și pot include litere, cifre, cratime și caractere de subliniere. Literalele includ cifre (de ex. 12 ) și șiruri (de ex. "Bună ziua!" ). Separatorii includ caracterul spațial și virgulele și punctele și virgulele urmate de un spațiu.

Un program COBOL este împărțit în patru divizii: diviziunea de identificare, diviziunea mediului, diviziunea datelor și diviziunea procedurii. Diviziunea de identificare specifică numele și tipul elementului sursă și este acolo unde sunt specificate clasele și interfețele. Divizia de mediu specifică orice caracteristici ale programului care depind de sistemul care îl rulează, cum ar fi fișierele și seturile de caractere. Împărțirea datelor este utilizată pentru a declara variabile și parametri. Diviziunea de procedură conține declarațiile programului. Fiecare diviziune este subdivizată în secțiuni, care sunt alcătuite din paragrafe.

MetalanguageEdit

Sintaxa COBOL este de obicei descrisă limbaj metalic unic folosind acolade, paranteze, bare și subliniere. Limbajul metalic a fost dezvoltat pentru specificațiile originale COBOL. Deși forma Backus – Naur exista la acea vreme, comitetul nu auzise de ea.

Elemente din metalimbajul COBOL
Element Aspect Funcție
Toate capitalele EXEMPLU Cuvânt rezervat
Subliniere EXEMPLU Cuvântul rezervat este obligatoriu
Paranteze {} O singură opțiune poate fi selectată
Paranteze Pot fi selectate zero sau una dintre opțiuni
Elipsă Elementul precedent poate fi repetat
Bare {| |} Poate fi selectată una sau mai multe opțiuni. Orice opțiune poate fi selectată o singură dată.
Pot fi selectate zero sau mai multe opțiuni. Orice opțiune poate fi selectat o dată.

De exemplu, consi după următoarea descriere a unei instrucțiuni ADD:

Această descriere permite următoarele variante:

ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"

Format formatEdit

COBOL poate fi scris în două formate: fix (implicit) sau gratuit. În format fix, codul trebuie aliniat pentru a se potrivi în anumite zone (o reținere de la utilizarea cărților perforate).Până la COBOL 2002, acestea erau:

Nume Coloană (s) Utilizare
Zona numărului de secvență 1-6 Folosit inițial pentru card / numere de linie (facilitând sortarea mecanică a cardurilor perforate pentru a asigura succesiunea programată a codului programului după editare / manipulare manuală), această zonă este ignorată de compilator
Zona indicatorului 7 Următoarele caractere sunt permise aici:

  • * – Linia de comentarii
  • / – Linie de comentariu care va fi tipărită pe o nouă pagină a listei sursă
  • - – Linie de continuare, unde cuvintele sau literele din linia anterioară este continuată
  • D – Linia activată în modul de depanare, care altfel este ignorată
Zona A 8-11 Aceasta conține: DIVISION, SECTION și anteturile de procedură; Numere de nivel 01 și 77 și descriptori de fișiere / rapoarte
Zona B 12–72 Orice alt cod nu este permis în zonă A
Zona numelui programului 73– Din punct de vedere istoric, până la coloana 80 pentru cărțile perforate, este utilizată pentru a identifica programul sau secvența cărții aparține

În COBOL 2002, zonele A și B erau a fuzionat pentru a forma zona program-text, care se termină acum într-o coloană definită de implementator.

COBOL 2002 a introdus și codul în format liber. Codul în format liber poate fi plasat în orice coloană a fișierului, ca în limbajele de programare mai noi. Comentariile sunt specificate folosind *>, care poate fi plasat oriunde și poate fi utilizat și în codul sursă în format fix. Liniile de continuare nu sunt prezente și directiva >>PAGE înlocuiește indicatorul /.

Identificare diviziuneEdit

Diviziunea de identificare identifică următoarea entitate de cod și conține definiția unei clase sau a unei interfețe.

Programare orientată pe obiecte Editați

Clasele și interfețele sunt în COBOL din 2002. Clasele au obiecte din fabrică, care conțin metode și variabile de clasă, și obiecte de instanță, care conțin metode și variabile de instanță. Moștenirea și interfețele oferă polimorfism. Suportul pentru programarea generică este oferit prin clase parametrizate, care pot fi instanțiate pentru a utiliza orice clasă sau interfață. Obiectele sunt stocate ca referințe care pot fi restricționate la un anumit tip. Există două moduri de a apela o metodă: declarația INVOKE , care acționează similar cu CALL , sau prin invocarea metodei în linie, care este similară cu utilizarea funcțiilor.

*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation

COBOL nu oferă o modalitate de a ascunde metodele. Datele de clasă pot fi ascunse, totuși, declarându-le fără o clauză PROPRIETATE , care nu lasă utilizatorului nicio modalitate de acces. Supraîncărcarea metodei a fost adăugată în COBOL 2014.

Environment divisionEdit

Divizia de mediu conține secțiunea de configurare și secțiunea de intrare-ieșire. Secțiunea de configurare este utilizată pentru a specifica caracteristici variabile precum semnele valutare, setările locale și seturile de caractere. Secțiunea de intrare-ieșire conține informații despre fișiere.

FilesEdit

COBOL acceptă trei formate de fișiere sau organizații: secvențial, indexat și relativ. În fișierele secvențiale, înregistrările sunt contigue și trebuie parcurse secvențial, similar cu o listă legată. Fișierele indexate au unul sau mai mulți indexuri care permit accesarea aleatorie a înregistrărilor și care pot fi sortate pe ele. Fiecare înregistrare trebuie să aibă o cheie unică, dar alte chei de înregistrare alternative nu trebuie să fie unice. Implementările fișierelor indexate variază între furnizori, deși implementările obișnuite, cum ar fi C-ISAM și VSAM, se bazează pe ISAM IBM. Fișierele relative, precum fișierele indexate, au o cheie de înregistrare unică, dar nu au chei alternative. A cheia înregistrării relative este poziția sa ordinală; de exemplu, cea de-a 10-a înregistrare are o cheie 10. Aceasta înseamnă că crearea unei înregistrări cu o cheie de 5 poate necesita crearea unor înregistrări precedente (goale). Fișierele relative permit, de asemenea, atât accesul secvențial, cât și accesul aleatoriu.

O extensie comună non-standard este organizarea secvențială de linie, utilizată pentru procesarea fișierelor text. Înregistrările dintr-un fișier sunt terminate de o linie nouă și pot avea o lungime variabilă.

Data divisionEdit

Diviziunea de date este împărțită în șase secțiuni care declară elemente diferite: secțiunea fișier, pentru înregistrări de fișiere; secțiunea de lucru-stocare, pentru variabilele statice; secțiunea de stocare locală, pentru variabile automate; secțiunea de legătură, pentru parametri și valoarea returnată; secțiunea raport și secțiunea ecran, pentru interfețe de utilizator bazate pe text.

Aggregated dataEdit

Elementele de date din COBOL sunt declarate ierarhic prin utilizarea unor numere de nivel care indică dacă un element de date face parte dintr-un altul. Un articol cu un nivel de nivel mai mare este subordonat unui articol cu unul mai mic. Elementele de date de nivel superior, cu un număr de nivel 1, se numesc înregistrări. Elementele care au date agregate subordonate se numesc elemente de grup; cele care nu sunt numite elemente elementare. Numerele de nivel utilizate pentru a descrie elementele de date standard sunt cuprinse între 1 și 49.

În exemplul de mai sus, elementul elementar num și elementul de grup data sunt subordonate înregistrării some-record , în timp ce elementele elementare anul , luna și -day fac parte din elementul grupului data .

Elementele subordonate pot fi dezambiguizate cu IN (sau OF ). De exemplu, luați în considerare exemplul de cod de mai sus împreună cu următorul exemplu:

 01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.

Numele anul , luna și ziua sunt ambigue de la sine, deoarece mai multe elemente de date sunt definite cu aceste nume. Pentru a specifica un anumit articol de date, de exemplu unul dintre articolele conținute în grupul data de vânzare , programatorul ar folosi anul de vânzare IN-data (sau echivalentul anul OF-data de vânzare ). (Această sintaxă este similară cu „notația punctelor” acceptată de majoritatea limbajelor contemporane.)

Alte niveluri de date Editați

Un număr de nivel 66 este utilizat pentru a declara o re-grupare a elemente definite anterior, indiferent de modul în care acestea sunt structurate. Acest nivel de date, la care se face referire și prin clauza RENAMES asociată, este rar utilizat și, în jurul anului 1988, a fost de obicei găsit în programele vechi. Abilitatea sa de a ignora datele structurii ierarhice și logice a însemnat că utilizarea sa nu a fost recomandată și multe instalații au interzis utilizarea acesteia.

Un număr de nivel 77 indică faptul că elementul este autonom și în astfel de situații este echivalent numărul de nivel 01. De exemplu, următorul cod declară două elemente de date de 77 de niveluri, nume-proprietate și vânzări-regiune , care sunt elemente de date care nu fac parte din grup, care sunt independente de (nu sunt subordonate) oricărui alt element de date:

 77 property-name PIC X(80). 77 sales-region PIC 9(5).

Un număr de nivel 88 declară un nume de condiție (așa-numitul nivel 88), care este adevărat atunci când elementul său de date părinte conține una dintre valorile specificate în clauză VALUE . De exemplu, următorul cod definește două elemente cu nume de condiție de 88 de nivele, care sunt adevărate sau false, în funcție de valoarea curentă a datelor caracterelor elementului de date tip salariu . Când elementul de date conține o valoare "H" , numele condiției salariul este pe oră este adevărat, în timp ce când conține o valoare "S" sau "Y" , condiția-nume salariul este anual este adevărat. Dacă elementul de date conține o altă valoare, ambele nume de condiții sunt false.

 01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".

Tipuri de dateEdit

COBOL standard oferă următoarele tipuri de date:

Tip de date Exemplu de declarație Note
Alfabetic PIC A (30) Poate conține numai litere sau spații
Alfanumerice PIC X (30) Poate conține caractere
Boolean PIC 1 USAGE BIT Date stocate sub formă de 0s și 1s, ca număr binar
Index INDICE DE UTILIZARE Folosit pentru a face referire la elementele tabelului
Național PIC N (30) Similar cu alfanumeric, dar folosind un caracter extins set, de ex. UTF-8
Numeric PIC 9 (5) V9 (5) Poate conține numai numere
Obiect REFERINȚĂ DE OBIECT DE UTILIZARE Poate face referire fie la un obiect, fie la NULL
Pointer POINTER DE UTILIZARE

Siguranța tipului este variabilă în COBOL.Datele numerice sunt convertite între diferite reprezentări și dimensiuni în mod silențios, iar datele alfanumerice pot fi plasate în orice element de date care poate fi stocat ca un șir, inclusiv date numerice și de grup. În schimb, referințele și indicatoarele de obiecte pot fi atribuite numai din elemente de același tip, iar valorile lor pot fi limitate la un anumit tip.

PICTURE clauseEdit

A PICTURE (sau PIC ) clauza este un șir de caractere, fiecare dintre ele reprezentând o porțiune a elementului de date și ce poate conține. Unele caractere imagine specifică tipul elementului și câte caractere sau cifre ocupă în memorie. De exemplu, un 9 indică o cifră zecimală, iar un S indică faptul că elementul este semnat. Alte caractere imagine (numite caractere de inserare și editare) specifică modul în care trebuie formatat un element. De exemplu, o serie de caractere + definesc pozițiile caracterelor, precum și modul în care un caracter de semn principal trebuie poziționat în datele caracterului final; caracterul nenumeric din dreapta va conține semnul elementului, în timp ce alte poziții ale caracterelor corespunzătoare unui + din stânga acestei poziții vor conține un spațiu. Repetat caracterele pot fi specificate mai concis specificând un număr între paranteze după un caracter imagine; de exemplu, 9 (7) este echivalent cu 9999999 . Specificațiile imaginii care conțin doar cifre ( 9 ) și semn ( S ) caracterele definesc elemente de date pur numerice, în timp ce specificațiile de imagine care conțin alfabetic ( A ) sau alfanumeric ( X ) caracterele definesc elemente de date alfanumerice. Prezența altor caractere de formatare definesc elemente de date numerice sau alfanumerice editate.

Clauza USAGEEdit

USAGE declară formatul datele sunt stocate în. În funcție de tipul de date, acestea pot fi completate sau utilizate în locul unei clauze PICTURE . Deși poate fi folosit pentru a declara indicii și referințe la obiecte, este orientat în principal spre specificarea tipurilor numerice. Aceste formate numerice sunt:

  • Binar, unde o dimensiune minimă este fie specificată prin clauza PICTURE, fie printr-o USAGE clauză, cum ar fi BINARY-LONG.
  • UTILIZARE COMPUTAȚIONALĂ , unde pot fi date stocate în orice format oferă implementarea; de multe ori echivalent cu USAGE BINARY
  • USAGE DISPLAY , formatul implicit , în cazul în care datele sunt stocate ca un șir
  • în virgulă mobilă, fie într-un format dependent de implementare, fie conform IEEE 754.
  • USAGE NATIONAL , unde datele sunt stocate ca un șir folosind un set de caractere extins
  • USAGE PACKED-DECIMAL , unde datele este stocat în cel mai mic format zecimal posibil (tipic zecimal codat binar)

Report writerEdit

Report writer este o facilitate declarativă pentru crearea de rapoarte. Programatorul trebuie să specifice doar aspectul raportului și datele necesare pentru a-l produce, eliberându-i de nevoia de a scrie cod pentru a gestiona lucruri precum întreruperile de pagină, formatarea datelor și titlurile și subsolurile.

Rapoartele sunt asociate cu raportul fișiere, care sunt fișiere cărora li se poate scrie numai prin declarații de scriere a rapoartelor.

 FD report-out REPORT sales-report.

Fiecare raport este definit în secțiunea raportului a diviziunii de date. Un raport este împărțit în grupuri de rapoarte care definesc titlurile, subsolurile și detaliile raportului. Rapoartele se bazează pe pauze de control ierarhic. Pauzele de control apar atunci când o variabilă cheie își modifică valoarea; de exemplu, atunci când creați un raport care detaliază comenzile clienților, un întreruperea controlului ar putea apărea atunci când programul ajunge la comenzile unui client diferit. Iată un exemplu de descriere a raportului pentru un raport care oferă vânzările unui vânzător și care avertizează cu privire la orice înregistrări nevalide:

Descrierea raportului de mai sus descrie următorul aspect:

Patru afirmații controlează scriitorul de raport: INITIATE , care pregătește scriitorul de rapoarte pentru tipărire; GENERATE , care tipărește un grup de rapoarte; SUPPRESS , care suprimă tipărirea unui grup de rapoarte; și TERMINATE , care pune capăt procesării raportului.Pentru exemplul raportului de vânzări de mai sus, divizarea procedurii ar putea arăta astfel:

 OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .

Utilizarea facilității Report Writer a avut tendința de a varia considerabil; unele organizații l-au folosit pe scară largă și altele deloc. În plus, implementările de Report Writer au variat în calitate, iar cele de la capătul inferior folosesc uneori cantități excesive de memorie în timpul rulării.

Procedura diviziune Editare

ProceduriEdit

Secțiunile și paragrafele din diviziunea de proceduri (denumite în mod colectiv proceduri) pot fi utilizate ca etichete și ca subrutine simple. Spre deosebire de alte diviziuni, paragrafele nu trebuie să fie în secțiuni. Execuția coboară prin procedurile unui program până la terminarea acestuia. Pentru a utiliza proceduri ca subrutine, PERFORM verb este folosit.

O instrucțiune PERFORM seamănă într-o oarecare măsură cu un apel de procedură într-un limbaj modern în sensul că executarea revine la cod urmând instrucțiunea PERFORM de la sfârșitul codului apelat; cu toate acestea, nu oferă niciun mecanism pentru trecerea parametrilor sau pentru returnarea unei valori de rezultat. Dacă un subrutină este invocată folosind o declarație simplă precum PERFORM subrutină , atunci controlul revine la sfârșitul procedurii apelate. Cu toate acestea, PERFORM este neobișnuit prin faptul că poate fi folosit pentru a apela o gamă care acoperă o secvență de mai multe proceduri adiacente. Acest lucru se face cu PERFORM sub-1 THRU sub-n construct:

PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".

Ieșirea acestui program va fi: „AABC”.

PERFORM diferă, de asemenea, de apelurile de procedură convenționale din că nu există, cel puțin în mod tradițional, o noțiune de stivă de apeluri. În consecință, invocările imbricate sunt posibile (o secvență de cod care este PERFORM „ed poate executa un PERFORM în sine), dar necesită o atenție suplimentară dacă părți ale aceluiași cod sunt executate de ambele invocații. Problema apare atunci când codul din invocația interioară ajunge la punctul de ieșire al invocației externe. Mai formal, dacă controlul trece prin punctul de ieșire al unei invocații PERFORM care a fost apelată mai devreme, dar care nu s-a finalizat încă, standardul COBOL 2002 stipulează oficial că comportamentul este nedefinit.

Motivul este că COBOL, mai degrabă decât o „adresă de returnare”, funcționează cu ceea ce poate fi numit o adresă de continuare. Când fluxul de control ajunge la sfârșitul oricărei proceduri, adresa de continuare este căutată și controlul este transferat la acea adresă. programul rulează, adresa de continuare a fiecărei proceduri este inițializată la adresa de început a pro cedare care urmează în textul programului, astfel încât, dacă nu apar instrucțiuni PERFORM , controlul circulă de sus în jos prin program. Dar când se execută o instrucțiune PERFORM , aceasta modifică adresa de continuare a procedurii apelate (sau ultima procedură din intervalul apelat, dacă PERFORM THRU a fost utilizat), astfel încât controlul să revină la site-ul apelului la sfârșit. Valoarea inițială este salvată și se restabilește ulterior, dar există o singură poziție de stocare. Dacă două invocații imbricate operează pe cod suprapus, acestea pot interfera în gestionarea reciprocă a adresei de continuare în mai multe moduri.

Următorul exemplu (preluat de la Veerman & Verhoeven 2006) ilustrează problema:

S-ar putea aștepta ca rezultatul acestui program să fie „1 2 3 4 3”: După afișarea „2”, al doilea PERFORM determină afișarea „3” și „4”, apoi prima invocare continuă cu „3”. În implementările tradiționale COBOL, acest lucru nu este cazul. Mai degrabă, primul PERFORM stabilește adresa de continuare la sfârșitul LABEL3 , astfel încât să revină la site-ul de apel din interiorul LABEL1 . A doua instrucțiune PERFORM stabilește returnarea la sfârșitul LABEL4 dar nu modifică adresa de continuare a LABEL3 , așteptându-se să fie continuarea implicită. Astfel, când invocarea interioară ajunge la sfârșitul LABEL3 , ea sare înapoi la PERFORM statement, iar programul nu mai imprimă doar „1 2 3”. Pe de altă parte, în unele implementări COBOL, cum ar fi compilatorul open source TinyCOBOL, cele două instrucțiuni PERFORM nu interferează una cu cealaltă, iar ieșirea este într-adevăr "1 2 3 4 3 ".Prin urmare, comportamentul în astfel de cazuri nu este doar (poate) surprinzător, nu este portabil.

O consecință specială a acestei limitări este că PERFORM nu poate fi folosit pentru a scrie cod recursiv. Un alt exemplu simplu pentru a ilustra acest lucru (ușor simplificat din Veerman & Verhoeven 2006):

 MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".

Ne-am putea aștepta ca rezultatul să fie „1 2 3 END END END” și, de fapt, asta vor produce unele compilatoare COBOL. Dar unele compilatoare, cum ar fi IBM COBOL, vor produce cod care imprimă „1 2 3 END END END END …” și așa mai departe, imprimând „END” de mai multe ori într-o buclă nesfârșită. Deoarece există spațiu limitat pentru stocarea adreselor de continuare a copiilor de rezervă, copiile de siguranță sunt suprascrise în timpul invocațiilor recursive și tot ce poate fi restaurat este săritura înapoi la DISPLAY "END" .

StatementsEdit

COBOL 2014 are 47 enunțuri (numite și verbe), care pot fi grupate în următoarele categorii largi: flux de control, I / O, manipulare date și scriitorul de rapoarte. Declarațiile scriitorului de rapoarte sunt acoperite în secțiunea scriitorului de rapoarte.

Control flowEdit

Instrucțiunile condiționale ale COBOL sunt IF și EVALUATE . EVALUATE este o declarație de tip switch cu capacitatea adăugată de a evalua mai multe valori și condiții. Aceasta poate fi utilizată pentru implementarea tabelelor de decizie. De exemplu, următoarele ar putea fi utilizate pentru a controla un strung CNC:

EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE

Instrucțiunea PERFORM este utilizată pentru a defini bucle care sunt executate până când o condiție este adevărată (nu în timp ce este adevărată, ceea ce este mai frecvent în alte limbi). este, de asemenea, utilizat pentru a apela proceduri sau game de proceduri (consultați secțiunea de proceduri pentru mai multe detalii). CALL și INVOCĂ subprogramele și respectiv metodele de apelare. Numele subprogramului / metodei este conținut într-un str care poate fi un literal sau un element de date. Parametrii pot fi trecuți prin referință, prin conținut (în cazul în care o copie este transmisă prin referință) sau prin valoare (dar numai dacă este disponibil un prototip). CANCEL descarcă subprogramele din memorie. GO TO face ca programul să treacă la o procedură specificată.

GOBACK este o instrucțiune return și instrucțiunea STOP oprește programul. Instrucțiunea EXIT are șase formate diferite: poate fi utilizată ca instrucțiune return, declarație break, declarație continue, marker final sau pentru a părăsi o procedură.

Excepțiile sunt ridicate de o instrucțiune RAISE și captate cu un handler, sau declarativ, definit în DECLARATIVE parte a diviziunii procedurii. Declarațiile sunt secțiuni care încep cu o instrucțiune USE care specifică erorile de gestionat. Excepțiile pot fi nume sau obiecte. RESUME este utilizat într-o declarație pentru a trece la declarația după cea care a ridicat excepția sau la o procedură în afara DECLARAȚII . Spre deosebire de alte limbi, excepțiile neprinse nu pot termina programul și programul poate continua neafectat.

I / OEdit

I / O fișierul este gestionat de OPEN , CLOSE , CITIȚI , și instrucțiunile WRITE împreună cu alte trei: REWRITE , care actualizează o înregistrare; START , care selectează înregistrările ulterioare pentru a le accesa găsind o înregistrare cu o anumită cheie; și UNLOCK , care eliberează o blocare la ultima înregistrare accesată.

Interacțiunea cu utilizatorul se face folosind ACCEPT și DISPLAY .

Manipulare date Editare

Următoarele verbe manipulează date:

  • INITIALIZE , care setează elementele de date la valorile lor implicite.
  • MOVE , care atribuie valori elementelor de date; MOVE CORRESPONDING atribuie câmpuri asemănătoare corespunzătoare.
  • SET , care are 15 formate: poate modifica indici, atribui referințe de obiect și modifica tabelul capacități, printre alte funcții.
  • ADAUGĂ , SUBTRACT , MULTIPLY , DIVIDE și COMPUTE , care gestionează aritmetică (cu COMPUTE atribuirea rezultatului unei formule unei variabile).
  • ALOCARE și GRATUIT , care gestionează memoria dinamică.
  • VALIDARE , care validează și distribuie datele așa cum este specificat în descrierea unui articol din diviziunea de date.
  • STRING și UNSTRING , care concatenează și împarte șiruri, respectiv.
  • INSPECT , care se potrivește sau înlocuiește instanțele de șiruri specificate într-un șir.
  • CĂUTARE , care caută un tabel pentru prima intrare care îndeplinește o condiție.

Fișierele și tabelele sunt sortate folosind SORT și MERGE verbul îmbină și sortează fișierele. Verbul RELEASE oferă înregistrări pentru sortare și RETURN recuperează înregistrările sortate în ordine.

Scope terminationEdit

Unele afirmații, cum ar fi IF și CITIȚI , pot conține ele însele declarații. Astfel de declarații pot fi terminate în două moduri: printr-o perioadă (terminare implicită), care termină toate instrucțiunile necontenite conținute, sau printr-un terminator de scop, care termină cea mai apropiată instrucțiune deschisă de potrivire.

Instrucțiuni imbricate terminate cu un perioadă sunt o sursă comună de bug-uri. De exemplu, examinați următorul cod:

IF x DISPLAY y. DISPLAY z.

Aici, intenția este de a afișa y și z dacă condiția x este adevărată. Cu toate acestea, z va fi afișat indiferent de valoarea x deoarece declarația IF este terminată printr-o perioadă eronată după DISPLAY y .

O altă eroare este un rezultat al problemei care atârnă altceva, când două se pot asocia cu un ELSE.

IF x IF y DISPLAY aELSE DISPLAY b.

În fragmentul de mai sus, ELSE se asociază cu declarația IF y în loc de Instrucțiune IF x , provocând o eroare. Înainte de introducerea terminatorilor de scopuri explicite, prevenirea acestuia ar necesita ELSE NEXT SENTENCE pentru a fi plasat după IF .

Auto-modificarea codeEdit

Specificația originală (1959) COBOL a acceptat infamul ALTER X pentru a trece la Y declarație, pentru care mulți compilatori au generat cod auto-modificat. X și Y sunt etichete de procedură și singura ACCESĂ declarație în procedura X executată după o astfel de instrucțiune ALTER înseamnă Mergeți la Y . Mulți compilatori încă îl acceptă, dar a fost considerat învechit în standardul COBOL 1985 și șters în 2002.

Declarația ALTER a fost prost considerată pentru că a subminat „localitatea contextului” și a făcut dificil de înțeles logica generală a unui program. Așa cum a scris autorul manualului Daniel D. McCracken în 1976, când „cineva care nu a mai văzut programul înainte trebuie să se familiarizeze cu el cât mai repede posibil , uneori sub presiune critică a timpului, deoarece programul a eșuat … vizualizarea unei declarații GO TO într-un paragraf de la sine, semnalând existența unui număr necunoscut de declarații ALTER în locații necunoscute de-a lungul programului, lovește teama în inima celui mai curajos programator. „

Hello, worldEdit

Un program” Hello, world „în COBOL:

 IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .

Când – acum faimosul – exemplu de program „Bună ziua, lume!” din Limbajul de programare C a fost publicat pentru prima dată în 1978 un mai similar Eșantionul de program nframe COBOL ar fi fost trimis prin JCL, foarte probabil folosind un cititor de carduri perforate și 80 de coloane carduri perforate. Lista de mai jos, cu o DIVIZIE DE DATE goală, a fost testată folosind GNU / Linux și emulatorul System / 370 Hercules care rulează MVS 3.8J. JCL, scris în iulie 2015, este derivat din tutorialele și exemplele Hercules găzduite de Jay Moseley. În conformitate cu programarea COBOL din acea epocă, BUNA, LUMEA este afișată cu toate literele mari.

După trimiterea JCL, consola MVS a afișat:

 19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED

Linia 10 a listei consolei de mai sus este evidențiat pentru efect, evidențierea nu face parte din ieșirea reală a consolei.

Lista compilatorului asociat a generat peste patru pagini de detalii tehnice și informații despre executarea lucrărilor, pentru linia unică de ieșire din cele 14 linii COBOL.

Leave a Reply

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *