SyntaxEdit
COBOL a une syntaxe de type anglais, qui est utilisée pour décrire presque tout dans un programme. Par exemple, une condition peut être exprimée comme x EST PLUS GRAND QUE y
ou de façon plus concise comme x PLUS GRAND y
ou x > y
. Des conditions plus complexes peuvent être «abrégées» en supprimant des conditions et des variables répétées. Par exemple, a > b AND a > c OU a = d
peut être raccourci en a > b AND c OR = d
. Pour prendre en charge cette syntaxe de type anglais, COBOL a plus de 300 mots-clés. Certains des mots-clés sont de simples orthographes alternatives ou plurielles du même mot, ce qui fournit des déclarations et des clauses plus anglaises; Par exemple, les mots clés IN
et OF
peuvent être utilisés de manière interchangeable, tout comme IS
et ARE
et VALUE
et VALEURS
.
Chaque programme COBOL est composé de quatre éléments lexicaux de base: mots, littéraux, chaînes de caractères d’image (voir § PICTURE clause) et séparateurs. Les mots incluent des mots réservés et des identificateurs définis par l’utilisateur. Ils comportent jusqu’à 31 caractères et peuvent inclure des lettres, des chiffres, des tirets et des traits de soulignement. Les littéraux incluent des chiffres (par exemple 12
) et des chaînes (par exemple "Hello!"
). Les séparateurs incluent le caractère espace et des virgules et des points-virgules suivis d’un espace.
Un programme COBOL est divisé en quatre divisions: la division d’identification, la division d’environnement, la division de données et la division de procédure. La division d’identification spécifie le nom et le type de l’élément source et c’est là que les classes et les interfaces sont spécifiées. La division de l’environnement spécifie toutes les fonctionnalités du programme qui dépendent du système qui l’exécute, telles que les fichiers et les jeux de caractères. La division des données est utilisée pour déclarer des variables et des paramètres. La division de procédure contient les instructions du programme. Chaque division est sous-divisée en sections, qui sont constituées de paragraphes.
MetalanguageEdit
La syntaxe de COBOL est généralement décrite avec un métalangage unique utilisant des accolades, des crochets, des barres et des soulignements. Le métalangage a été développé pour les spécifications COBOL originales. Bien que la forme Backus – Naur existait à l’époque, le comité n’en avait pas entendu parler.
Élément | Apparence | Fonction |
---|---|---|
Toutes les majuscules | EXEMPLE | Mot réservé |
Souligné | EXEMPLE | Le mot réservé est obligatoire |
Accolades | {} | Une seule option peut être sélectionnée |
Brackets | Aucune ou une option peut être sélectionnée | |
Ellipsis | … | L’élément précédent peut être répété |
Bars | {| |} | Une ou plusieurs options peuvent être sélectionnées. Toute option ne peut être sélectionnée qu’une seule fois. |
Aucune ou plusieurs options peuvent être sélectionnées. Toute option ne peut être sélectionnée que sélectionné une fois. |
À titre d’exemple, consi der la description suivante d’une instruction ADD
:
Cette description permet les variantes suivantes:
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"
Code formatEdit
COBOL peut être écrit dans deux formats: fixe (par défaut) ou libre. Dans un format fixe, le code doit être aligné pour tenir dans certaines zones (un retard de l’utilisation de cartes perforées).Jusqu’au COBOL 2002, il s’agissait de:
Nom | Colonne (s) | Utilisation |
---|---|---|
Zone de numéro de séquence | 1–6 | Initialement utilisé pour la carte / numéros de ligne (facilitant le tri mécanique des cartes perforées pour assurer la séquence de code de programme prévue après l’édition / la manipulation manuelle), cette zone est ignorée par le compilateur |
Zone d’indicateur | 7 | Les caractères suivants sont autorisés ici:
|
Zone A | 8–11 | Contient: DIVISION , SECTION et en-têtes de procédure; Numéros de niveau 01 et 77 et descripteurs de fichier / rapport |
Zone B | 12–72 | Tout autre code non autorisé dans la zone A |
Zone de nom de programme | 73– | Historiquement jusqu’à la colonne 80 pour les cartes perforées, elle sert à identifier le programme ou séquence à laquelle appartient la carte |
Dans COBOL 2002, les zones A et B étaient fusionné pour former la zone de texte du programme, qui se termine maintenant par une colonne définie par l’implémenteur.
COBOL 2002 a également introduit le code au format libre. Le code au format libre peut être placé dans n’importe quelle colonne du fichier, comme dans les nouveaux langages de programmation. Les commentaires sont spécifiés à l’aide de *>
, qui peut être placé n’importe où et peut également être utilisé dans un code source de format fixe. Les lignes de suite ne sont pas présentes et la directive >>PAGE
remplace l’indicateur /
.
Identification divisionEdit
La division d’identification identifie l’entité de code suivante et contient la définition d’une classe ou d’une interface.
Programmation orientée objetEdit
Les classes et interfaces sont en COBOL depuis 2002. Classes ont des objets d’usine, contenant des méthodes et des variables de classe, et des objets d’instance, contenant des méthodes et des variables d’instance. L’héritage et les interfaces fournissent le polymorphisme. La prise en charge de la programmation générique est fournie via des classes paramétrées, qui peuvent être instanciées pour utiliser n’importe quelle classe ou interface. Les objets sont stockés sous forme de références qui peuvent être limitées à un certain type. Il existe deux façons d’appeler une méthode: l’instruction INVOKE
, qui agit de la même manière que CALL
, ou via l’invocation de méthode en ligne, qui est analogue à l’utilisation de fonctions.
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOL ne fournit pas un moyen de masquer les méthodes. Cependant, les données de classe peuvent être masquées en les déclarant sans clause PROPERTY
, ce qui laisse l’utilisateur sans moyen d’y accéder. La surcharge de méthode a été ajoutée dans COBOL 2014.
Division EnvironnementEdit
La division Environnement contient la section de configuration et la section d’entrée-sortie. La section de configuration est utilisée pour spécifier des caractéristiques variables telles que les signes monétaires, les paramètres régionaux et les jeux de caractères. La section d’entrée-sortie contient des informations relatives aux fichiers.
FilesEdit
COBOL prend en charge trois formats de fichier, ou organisations: séquentiel, indexé et relatif. Dans les fichiers séquentiels, les enregistrements sont contigus et doivent être parcourus séquentiellement, de la même manière qu’une liste chaînée. Les fichiers indexés ont un ou plusieurs index qui permettent un accès aléatoire aux enregistrements et qui peuvent être triés sur eux. Chaque enregistrement doit avoir une clé unique, mais les autres clés d’enregistrement n’ont pas besoin d’être uniques. Les implémentations des fichiers indexés varient selon les fournisseurs, bien que les implémentations courantes, telles que C-ISAM et VSAM, soient basées sur l’ISAM d’IBM. Les fichiers relatifs, comme les fichiers indexés, ont une clé d’enregistrement unique, mais ils n’ont pas de clé alternative. A la clé de l’enregistrement relatif est sa position ordinale; par exemple, le 10e enregistrement a une clé de 10. Cela signifie que la création d’un enregistrement avec une clé de 5 peut nécessiter la création d’enregistrements précédents (vides). Les fichiers relatifs permettent également un accès séquentiel et aléatoire.
Une extension non standard courante est l’organisation séquentielle des lignes, utilisée pour traiter les fichiers texte. Les enregistrements dans un fichier se terminent par une nouvelle ligne et peuvent être de longueur variable.
Data divisionEdit
La division des données est divisée en six sections qui déclarent différents éléments: la section file, pour dossiers de fichiers; la section travail-stockage, pour les variables statiques; la section de stockage local, pour les variables automatiques; la section de liaison, pour les paramètres et la valeur de retour; la section rapport et la section écran, pour les interfaces utilisateur textuelles.
Données agrégéesEdit
Les éléments de données dans COBOL sont déclarés hiérarchiquement grâce à l’utilisation de numéros de niveau qui indiquent si un élément de données fait partie d’un autre. Un élément avec un numéro de niveau supérieur est subordonné à un élément avec un numéro inférieur. Les éléments de données de niveau supérieur, avec un numéro de niveau de 1, sont appelés enregistrements. Les éléments qui ont des données agrégées subordonnées sont appelés éléments de groupe; ceux qui ne le sont pas sont appelés éléments élémentaires. Les numéros de niveau utilisés pour décrire les éléments de données standard sont compris entre 1 et 49.
Dans l’exemple ci-dessus, l’élément élémentaire num
et l’élément de groupe the-date
sont subordonnés à l’enregistrement some-record
, tandis que les éléments élémentaires l'année
, le-mois
et le -day
font partie de l’élément de groupe the-date
.
Les éléments subordonnés peuvent être levés avec le IN
(ou OF
) mot-clé. Par exemple, considérez l’exemple de code ci-dessus avec l’exemple suivant:
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
Les noms l'année
, le-mois
et le-jour
sont ambigus en eux-mêmes, car plus d’un élément de données est défini avec ces noms. Pour spécifier un élément de données particulier, par exemple l’un des éléments contenus dans le groupe sale-date
, le programmeur utilisera l'année-date-de-vente
(ou l’équivalent l'année-date-de-vente
). (Cette syntaxe est similaire à la « notation par points » prise en charge par la plupart des langages contemporains.)
Autres niveaux de données Modifier
Un numéro de niveau de 66 est utilisé pour déclarer un re-groupement de éléments préalablement définis, quelle que soit la structure de ces éléments. Ce niveau de données, également désigné par la clause associée RENAMES
, est rarement utilisé et, vers 1988, se trouvait généralement dans les anciens programmes. Sa capacité à ignorer les données de la structure hiérarchique et logique signifiait que son utilisation n’était pas recommandée et de nombreuses installations en ont interdit l’utilisation.
Un numéro de niveau 77 indique que l’élément est autonome, et dans de telles situations équivaut à le numéro de niveau 01. Par exemple, le code suivant déclare deux éléments de données de niveau 77, nom-de-propriété
et sales-region
, qui sont des éléments de données hors groupe qui sont indépendants (et non subordonnés à) de tout autre élément de données:
77 property-name PIC X(80). 77 sales-region PIC 9(5).
Un numéro de niveau 88 déclare un nom de condition (un soi-disant niveau 88) qui est vrai lorsque son élément de données parent contient l’une des valeurs spécifiées dans son VALUE
. Par exemple, le code suivant définit deux éléments de nom de condition de niveau 88 qui sont vrais ou faux en fonction de la valeur actuelle des données de caractère de l’élément de données type de salaire
. Lorsque la donnée élémentaire contient une valeur de "H"
, le nom-condition salaire-est-horaire
est vrai, alors qu’il contient une valeur de "S"
ou "Y"
, le nom de la condition le salaire est annuel
est vrai. Si l’élément de données contient une autre valeur, les deux noms de condition sont faux.
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
Types de donnéesModifier
Le COBOL standard fournit les types de données suivants:
Type de données | Exemple de déclaration | Notes |
---|---|---|
Alphabétique | PIC A (30) |
Ne peut contenir que des lettres ou des espaces |
Alphanumérique | PIC X (30) |
Peut contenir n’importe quel caractère |
Booléen | PIC 1 USAGE BIT |
Données stockées sous forme de 0 et de 1, sous forme de nombre binaire |
Index | USAGE INDEX |
Utilisé pour référencer les éléments du tableau |
National | PIC N (30) |
Similaire à alphanumérique, mais utilisant un caractère étendu ensemble, par exemple UTF-8 |
Numérique | PIC 9 (5) V9 (5) |
Peut contenir uniquement des nombres |
Objet | RÉFÉRENCE D'OBJET D'UTILISATION |
Peut faire référence à un objet ou à NULL |
Pointeur | POINTEUR D'UTILISATION |
La sécurité de type est variable en COBOL.Les données numériques sont converties silencieusement entre différentes représentations et tailles et les données alphanumériques peuvent être placées dans n’importe quel élément de données pouvant être stocké sous forme de chaîne, y compris les données numériques et de groupe. En revanche, les références d’objet et les pointeurs ne peuvent être attribués qu’à partir d’éléments du même type et leurs valeurs peuvent être limitées à un certain type.
Clause PICTUREEdit
A PICTURE (ou PIC
) est une chaîne de caractères, chacun représentant une partie de l’élément de données et ce qu’il peut contenir. Certains caractères d’image spécifient le type de l’élément et le nombre de caractères ou de chiffres qu’il occupe en mémoire. Par exemple, un 9
indique un chiffre décimal et un S
indique que l’élément est signé. D’autres caractères d’image (appelés caractères d’insertion et d’édition) spécifient comment un élément doit être formaté. Par exemple, une série de caractères +
définissent la position des caractères ainsi que la manière dont un caractère de premier plan doit être positionné dans les données de caractères finales; le caractère non numérique le plus à droite contiendra le signe de l’élément, tandis que les autres positions de caractères correspondant à un +
à gauche de cette position contiendront un espace. Répété les caractères peuvent être spécifiés de manière plus concise en spécifiant un nombre entre parenthèses après un caractère d’image; par exemple, 9 (7)
équivaut à 9999999
. Spécifications de l’image contenant uniquement un chiffre ( 9
) et un signe ( Les caractères S
) définissent des éléments de données purement numériques, tandis que les spécifications d’image contiennent des caractères alphabétiques ( A
) ou alphanumériques ( X
) définissent les éléments de données alphanumériques. La présence d’autres caractères de formatage définit les éléments de données numériques ou alphanumériques modifiés.
Clause USAGEEdit
Le USAGE
déclare le format les données sont stockées dans. Selon le type de données, elles peuvent compléter ou être utilisées à la place d’une clause PICTURE
. Bien qu’il puisse être utilisé pour déclarer des pointeurs et des références d’objet, il est principalement orienté vers la spécification de types numériques. Ces formats numériques sont:
- Binaire, où une taille minimale est soit spécifiée par la clause
PICTURE
soit par uneUSAGE
clause telle queBINARY-LONG
. -
USAGE COMPUTATIONAL
, où les données peuvent être stocké dans le format fourni par l’implémentation; souvent équivalent àUSAGE BINARY
-
USAGE DISPLAY
, le format par défaut , où les données sont stockées sous forme de chaîne - Virgule flottante, dans un format dépendant de l’implémentation ou selon IEEE 754.
-
USAGE NATIONAL
, où les données sont stockées sous forme de chaîne à l’aide d’un jeu de caractères étendu -
USAGE PACKED-DECIMAL
, où data est stocké dans le plus petit format décimal possible (typiquement décimal codé en binaire compressé)
Report writerEdit
Le rédacteur de rapport est une fonction déclarative pour créer des rapports. Le programmeur n’a qu’à spécifier la mise en page du rapport et les données nécessaires pour le produire, ce qui lui évite d’avoir à écrire du code pour gérer des choses comme les sauts de page, le formatage des données, les en-têtes et les bas de page.
Les rapports sont associés au rapport fichiers, qui sont des fichiers qui ne peuvent être écrits que via des instructions de rédacteur de rapport.
FD report-out REPORT sales-report.
Chaque rapport est défini dans la section rapport de la division des données. Un rapport est divisé en groupes de rapports qui définissent les en-têtes, les bas de page et les détails du rapport. Les rapports contournent les interruptions de contrôle hiérarchiques. Les interruptions de contrôle se produisent lorsqu’une variable clé modifie sa valeur. Par exemple, lors de la création d’un rapport détaillant les commandes des clients, une rupture de contrôle peut se produire lorsque le programme atteint les commandes d’un autre client. Voici un exemple de description de rapport pour un rapport qui donne les ventes d’un vendeur et qui avertit de tout enregistrement non valide:
La description du rapport ci-dessus décrit la disposition suivante:
Quatre instructions contrôlent le rédacteur du rapport: INITIATE
, qui prépare le rédacteur du rapport pour l’impression; GENERATE
, qui imprime un groupe de rapports; SUPPRESS
, qui supprime l’impression d’un groupe de rapports; et TERMINATE
, qui met fin au traitement du rapport.Pour l’exemple de rapport de ventes ci-dessus, la division des procédures pourrait ressembler à ceci:
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 .
L’utilisation de la fonction Report Writer avait tendance à varier considérablement; certaines organisations l’ont largement utilisée et d’autres pas du tout. De plus, les implémentations de Report Writer étaient de qualité, celles du bas de gamme utilisant parfois des quantités excessives de mémoire lors de l’exécution.
Procedure divisionEdit
ProceduresEdit
Les sections et les paragraphes de la division de procédure (appelés collectivement procédures) peuvent être utilisés comme étiquettes et comme simples sous-programmes. Contrairement aux autres divisions, les paragraphes n’ont pas besoin d’être dans les sections.L’exécution passe par les procédures d’un programme jusqu’à ce qu’il soit terminé.Pour utiliser des procédures comme sous-programmes, le PERFORM
verbe est utilisé.
Une instruction PERFORM
ressemble quelque peu à un appel de procédure dans un langage moderne dans le sens où l’exécution renvoie au code suivant l’instruction PERFORM
à la fin du code appelé; cependant, il ne fournit aucun mécanisme pour passer des paramètres ou pour renvoyer une valeur de résultat. Si un sous-programme est appelé en utilisant une instruction simple comme PERFORM subroutine
, alors le contrôle retourne à la fin de la procédure appelée. Cependant, PERFORM
est inhabituel en ce qu’il peut être utilisé pour appeler une plage couvrant une séquence de plusieurs procédures adjacentes. Ceci est fait avec la construction PERFORM sub-1 THRU sub-n
:
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
Le résultat de ce programme sera: « AABC ».
PERFORM
diffère également des appels de procédure conventionnels dans qu’il n’y a, au moins traditionnellement, aucune notion de pile d’appels. En conséquence, des appels imbriqués sont possibles (une séquence de code étant PERFORM
« ed peut exécuter un PERFORM
lui-même), mais nécessite une attention particulière si des parties du même code sont exécutées par les deux appels. Le problème survient lorsque le code de l’appel interne atteint le point de sortie de l’appel externe. Plus formellement, si le contrôle passe par le point de sortie d’un appel PERFORM
qui a été appelé plus tôt mais qui n’est pas encore terminé, la norme COBOL 2002 stipule officiellement que le comportement n’est pas défini.
La raison en est que COBOL, plutôt qu’une « adresse de retour », fonctionne avec ce que l’on peut appeler une adresse de continuation. Lorsque le flux de contrôle atteint la fin d’une procédure, l’adresse de continuation est recherchée et le contrôle est transféré à cette adresse. Avant le programme s’exécute, l’adresse de continuation de chaque procédure est initialisée à l’adresse de début du pro cedure qui vient ensuite dans le texte du programme de sorte que, si aucune instruction PERFORM
ne se produit, contrôler les flux de haut en bas à travers le programme. Mais lorsqu’une instruction PERFORM
s’exécute, elle modifie l’adresse de continuation de la procédure appelée (ou la dernière procédure de la plage appelée, si PERFORM THRU
a été utilisé), de sorte que le contrôle reviendra au site d’appel à la fin. La valeur d’origine est enregistrée et restaurée par la suite, mais il n’y a qu’une seule position de stockage. Si deux invocations imbriquées opèrent sur du code qui se chevauchent, elles peuvent interférer mutuellement dans la gestion de l’adresse de continuation de plusieurs manières.
L’exemple suivant (tiré de Veerman & Verhoeven 2006) illustre le problème:
On pourrait s’attendre à ce que la sortie de ce programme soit « 1 2 3 4 3 »: Après avoir affiché « 2 », le deuxième PERFORM
provoque l’affichage de « 3 » et « 4 », puis le premier appel continue avec « 3 ». Dans les implémentations COBOL traditionnelles, ce n’est pas le cas. Au contraire, le premier PERFORM
définit l’adresse de continuation à la fin de LABEL3
afin qu’elle revienne au appeler le site à l’intérieur de LABEL1
. La deuxième instruction PERFORM
définit le retour à la fin de LABEL4
mais ne modifie pas l’adresse de continuation de LABEL3
, elle revient à la PERFORM
, et le programme cesse d’avoir imprimé juste « 1 2 3 ». D’un autre côté, dans certaines implémentations COBOL comme le compilateur open-source TinyCOBOL, les deux instructions PERFORM
n’interfèrent pas l’une avec l’autre et la sortie est en effet « 1 2 3 4 3 « .Par conséquent, le comportement dans de tels cas n’est pas seulement (peut-être) surprenant, il n’est pas non plus portable.
Une conséquence particulière de cette limitation est que PERFORM
ne peut pas être utilisé pour écrire du code récursif. Un autre exemple simple pour illustrer cela (légèrement simplifié de 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".
On peut s’attendre à ce que la sortie soit « 1 2 3 END END END », et en fait c’est ce que certains compilateurs COBOL produiront. Mais certains compilateurs, comme IBM COBOL, produiront du code qui imprime « 1 2 3 END END END END … » et ainsi de suite, imprimant « END » encore et encore dans une boucle sans fin. Comme l’espace de stockage des adresses de continuation de sauvegarde est limité, les sauvegardes sont écrasées au cours des appels récursifs, et tout ce qui peut être restauré est le retour à DISPLAY "END"
.
StatementsEdit
COBOL 2014 a 47 instructions (également appelées verbes), qui peuvent être regroupées dans les grandes catégories suivantes: flux de contrôle, E / S, manipulation de données et le rédacteur du rapport. Les instructions du rédacteur de rapport sont couvertes dans la section du rédacteur de rapport.
Control flowEdit
Les instructions conditionnelles de COBOL sont IF
et EVALUATE
. EVALUATE
est une instruction de type switch avec la capacité supplémentaire d’évaluer plusieurs valeurs et conditions. Cela peut être utilisé pour implémenter des tables de décision. Par exemple, ce qui suit peut être utilisé pour contrôler un tour 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
L’instruction PERFORM
est utilisée pour définir des boucles qui sont exécutées jusqu’à ce qu’une condition soit vraie (pas tant qu’elle est vraie, ce qui est plus courant dans d’autres langues). est également utilisé pour appeler des procédures ou des plages de procédures (voir la section procédures pour plus de détails). CALL
et INVOKE
appelle respectivement des sous-programmes et des méthodes. Le nom du sous-programme / de la méthode est contenu dans une chaîne qui peut être un littéral ou un élément de données. Les paramètres peuvent être passés par référence, par contenu (où une copie est passée par référence) ou par valeur (mais uniquement si un prototype est disponible). CANCEL
décharge les sous-programmes de mémoire. GO TO
fait passer le programme à une procédure spécifiée.
Le GOBACK
STOP
arrête le programme. L'instruction EXIT
a six formats différents: elle peut être utilisée comme une instruction return, une instruction break, une instruction continue, un marqueur de fin ou pour quitter une procédure.
Les exceptions sont levées par une instruction RAISE
et interceptées avec un gestionnaire, ou déclaratif, défini dans le DECLARATIVES
partie de la division de procédure. Les déclaratifs sont des sections commençant par une instruction USE
qui spécifie les erreurs à gérer. Les exceptions peuvent être des noms ou des objets. RESUME
est utilisé dans un déclaratif pour passer à l’instruction après celle qui a déclenché l’exception ou à une procédure en dehors de DÉCLARATIFS
. Contrairement à d’autres langages, les exceptions non interceptées peuvent ne pas terminer le programme et le programme peut continuer sans être affecté.
I / OEdit
Les E / S de fichier sont gérées par le OUVRIR
, CLOSE
, LIRE
, et WRITE
instructions avec trois autres instructions: REWRITE
, qui met à jour un enregistrement; START
, qui sélectionne les enregistrements suivants auxquels accéder en trouvant un enregistrement avec une certaine clé; et UNLOCK
, qui libère un verrou sur le dernier enregistrement accédé.
L’interaction de l’utilisateur se fait à l’aide de ACCEPTER
et DISPLAY
.
Manipulation des donnéesModifier
Les verbes suivants manipulent les données:
-
INITIALIZE
, qui définit les éléments de données sur leurs valeurs par défaut. -
MOVE
, qui attribue des valeurs aux éléments de données; MOVE CORRESPONDING assigne les champs de même nom correspondants. -
SET
, qui a 15 formats: il peut modifier les index, attribuer des références d’objet et modifier la table capacités, entre autres fonctions. -
AJOUTER
,SOUS-TIRER
,MULTIPLY
,DIVIDE
etCOMPUTE
, qui gèrent arithmétique (avecCOMPUTE
attribuant le résultat d’une formule à une variable). -
ALLOCATE
etFREE
, qui gèrent la mémoire dynamique. -
VALIDATE
, qui valide et distribue les données comme spécifié dans la description d’un élément dans la division des données. -
STRING
etUNSTRING
, qui concaténent et divisent respectivement les chaînes. -
INSPECT
, qui correspond ou remplace les instances des sous-chaînes spécifiées dans une chaîne. -
SEARCH
, qui recherche une table pour la première entrée satisfaisant à une condition.
Les fichiers et les tables sont triés en utilisant SORT
et MERGE
fusionne et trie les fichiers. Le verbe RELEASE
fournit les enregistrements à trier et RETURN
récupère les enregistrements triés dans l’ordre.
Portée terminaisonEdit
Certaines instructions, telles que IF
et READ
, peuvent eux-mêmes contenir des instructions. Ces instructions peuvent être terminées de deux manières: par un point (terminaison implicite), qui met fin à toutes les instructions non terminées contenues, ou par un terminateur de portée, qui termine l’instruction ouverte correspondante la plus proche.
Instructions imbriquées se terminant par un période sont une source courante de bogues. Par exemple, examinez le code suivant:
IF x DISPLAY y. DISPLAY z.
Ici, l’intention est d’afficher y
et z
si la condition x
est vraie. Cependant, z
sera affiché quelle que soit la valeur de x
car l’instruction IF
est terminée par un point erroné après DISPLAY y
.
Un autre bogue est le résultat du problème de balançoire else, lorsque deux IF
peuvent s’associer à un ELSE
.
IF x IF y DISPLAY aELSE DISPLAY b.
Dans le fragment ci-dessus, ELSE
s’associe à l’instruction IF y
au lieu de IF x , provoquant un bogue. Avant l’introduction de terminateurs de portée explicites, pour éviter cela, il faudrait placer ELSE NEXT SENTENCE
après le IF
interne .
CodeEdit auto-modifiable
La spécification COBOL originale (1959) supportait le tristement célèbre ALTER X POUR PROCÉDER À Y
instruction, pour laquelle de nombreux compilateurs ont généré du code auto-modifiable. X
et Y
sont des libellés de procédure, et l’unique ALLER À
instruction dans la procédure X
exécutée après une telle instruction ALTER
signifie ALLER À Y
à la place. De nombreux compilateurs le supportent encore, mais il a été jugé obsolète dans la norme COBOL 1985 et supprimé en 2002.
L’instruction ALTER
a été mal considérée parce qu’il sapait la «localité du contexte» et rendait la logique globale d’un programme difficile à comprendre. Comme l’écrivait l’auteur du manuel Daniel D. McCracken en 1976, lorsque «quelqu’un qui n’a jamais vu le programme auparavant doit se familiariser avec lui aussi vite que possible , parfois sous une pression de temps critique parce que le programme a échoué … la vue d’une déclaration GO TO dans un paragraphe à part, signalant comme elle le fait l’existence d’un nombre inconnu de déclarations ALTER à des endroits inconnus tout au long du programme, fait peur le cœur du programmeur le plus courageux. «
Bonjour, worldEdit
Un programme » Hello, world « en COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
Lorsque l’exemple de programme – désormais célèbre – « Hello, World! » dans The C Programming Language a été publié pour la première fois en 1978, un mai similaire L’échantillon de programme nframe COBOL aurait été soumis via JCL, très probablement à l’aide d’un lecteur de cartes perforées et de 80 cartes perforées à colonnes. La liste ci-dessous, avec une DATA DIVISION vide, a été testée en utilisant GNU / Linux et l’émulateur System / 370 Hercules exécutant MVS 3.8J. Le JCL, écrit en juillet 2015, est dérivé des tutoriels et exemples Hercules hébergés par Jay Moseley. Conformément à la programmation COBOL de cette époque, HELLO, WORLD est affiché dans toutes les lettres majuscules.
Après avoir soumis le JCL, la console MVS a affiché:
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
Ligne 10 de la liste de console ci-dessus est mis en évidence pour effet, la mise en évidence ne fait pas partie de la sortie réelle de la console.
La liste du compilateur associé générée sur quatre pages de détails techniques et d’informations sur l’exécution du travail, pour la seule ligne de sortie des 14 lignes de COBOL.