COBOL (Español)

SyntaxEdit

COBOL tiene una sintaxis similar al inglés, que se usa para describir casi todo en un programa. Por ejemplo, una condición se puede expresar como x ES MAYOR QUE y o de forma más concisa como x MAYOR y o x > y . Las condiciones más complejas se pueden «abreviar» eliminando condiciones y variables repetidas. Por ejemplo, a > by a > c O a = d se puede acortar a a > by c OR = d . Para admitir esta sintaxis similar al inglés, COBOL tiene más de 300 palabras clave. Algunas de las palabras clave son ortografías simples alternativas o pluralizadas de la misma palabra, lo que proporciona declaraciones y cláusulas más parecidas al inglés; Por ejemplo, las palabras clave IN y OF se pueden utilizar indistintamente, al igual que ES y SON y VALOR y VALUES .

Cada programa COBOL se compone de cuatro elementos léxicos básicos: palabras, literales, cadenas de caracteres de imágenes (ver § IMAGEN cláusula) y separadores. Las palabras incluyen palabras reservadas e identificadores definidos por el usuario. Tienen hasta 31 caracteres y pueden incluir letras, dígitos, guiones y guiones bajos. Los literales incluyen números (por ejemplo, 12 ) y cadenas (por ejemplo, "¡Hola!" ). Los separadores incluyen el carácter de espacio y las comas y puntos y coma seguidos de un espacio.

Un programa COBOL se divide en cuatro divisiones: la división de identificación, la división del entorno, la división de datos y la división de procedimiento. La división de identificación especifica el nombre y el tipo del elemento fuente y es donde se especifican las clases y las interfaces. La división de entorno especifica las características del programa que dependen del sistema que lo ejecuta, como archivos y juegos de caracteres. La división de datos se utiliza para declarar variables y parámetros. La división de procedimiento contiene las declaraciones del programa. Cada división se subdivide en secciones, que se componen de párrafos.

MetalanguageEdit

La sintaxis de COBOL generalmente se describe con un metalenguaje único que utiliza llaves, corchetes, barras y subrayado. El metalenguaje se desarrolló para las especificaciones originales de COBOL. Aunque la forma Backus-Naur existía en ese momento, el comité no había oído hablar de ella.

Elementos del metalenguaje de COBOL
Elemento Apariencia Función
Todas las mayúsculas EJEMPLO Palabra reservada
Subrayado EJEMPLO La palabra reservada es obligatorio
Braces {} Solo se puede seleccionar una opción
Corchetes Se pueden seleccionar cero o una opción
Elipsis El elemento anterior puede repetirse
Barras {| |} Se pueden seleccionar una o más opciones. Cualquier opción solo se puede seleccionar una vez.
Se pueden seleccionar cero o más opciones. Cualquier opción solo se puede seleccionar seleccionado una vez.

Como ejemplo, consi der la siguiente descripción de una ADD declaración:

Esta descripción permite las siguientes variantes:

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"

Formato de códigoEditar

COBOL se puede escribir en dos formatos: fijo (el predeterminado) o libre. En formato fijo, el código debe estar alineado para caber en ciertas áreas (una restricción del uso de tarjetas perforadas).Hasta COBOL 2002, estos eran:

Nombre Columna (s) Uso
Área de número de secuencia 1–6 Usado originalmente para tarjeta / números de línea (facilitando la clasificación mecánica de tarjetas perforadas para asegurar la secuencia de código de programa deseada después de la edición / manipulación manual), esta área es ignorada por el compilador
Área del indicador 7 Aquí se permiten los siguientes caracteres:

  • * – Línea de comentario
  • / – Línea de comentario que se imprimirá en una nueva página de una lista de fuentes
  • - – Línea de continuación, donde las palabras o literales del la línea anterior continúa
  • D – Línea habilitada en modo de depuración, que de lo contrario se ignora
Área A 8–11 Contiene: DIVISION, SECTION y encabezados de procedimiento; 01 y 77 números de nivel y descriptores de archivo / informe
Área B 12–72 Cualquier otro código no permitido en el Área A
Área de nombre del programa 73– Históricamente hasta la columna 80 para tarjetas perforadas, se utiliza para identificar el programa. o secuencia a la que pertenece la tarjeta

En COBOL 2002, las áreas A y B combinado para formar el área de texto del programa, que ahora termina en una columna definida por el implementador.

COBOL 2002 también introdujo código de formato libre. El código de formato libre se puede colocar en cualquier columna del archivo, como en los lenguajes de programación más nuevos. Los comentarios se especifican mediante *>, que se puede colocar en cualquier lugar y también se puede utilizar en código fuente de formato fijo. Las líneas de continuación no están presentes y la directiva >>PAGE reemplaza el indicador /.

Identification divisionEdit

La división de identificación identifica la siguiente entidad de código y contiene la definición de una clase o interfaz.

Programación orientada a objetosEditar

Las clases y las interfaces han estado en COBOL desde 2002. Clases tienen objetos de fábrica, que contienen variables y métodos de clase, y objetos de instancia, que contienen variables y métodos de instancia. La herencia y las interfaces proporcionan polimorfismo. El soporte para la programación genérica se proporciona a través de clases parametrizadas, que se pueden instanciar para usar cualquier clase o interfaz. Los objetos se almacenan como referencias que pueden estar restringidas a un cierto tipo. Hay dos formas de llamar a un método: la instrucción INVOKE , que actúa de manera similar a CALL , o mediante la invocación de un método en línea, que es análogo al uso de funciones.

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

COBOL no proporciona una forma de ocultar métodos. Sin embargo, los datos de la clase se pueden ocultar declarándolos sin una cláusula PROPERTY , lo que deja al usuario sin forma de acceder a ellos. La sobrecarga de métodos se agregó en COBOL 2014.

Environment divisionEdit

La división de entorno contiene la sección de configuración y la sección de entrada-salida. La sección de configuración se usa para especificar características variables como signos de moneda, configuraciones regionales y conjuntos de caracteres. La sección de entrada y salida contiene información relacionada con archivos.

FilesEdit

COBOL admite tres formatos de archivo u organizaciones: secuencial, indexado y relativo. En archivos secuenciales, los registros son contiguos y deben recorrerse secuencialmente, de manera similar a una lista vinculada. Los archivos indexados tienen uno o más índices que permiten acceder a los registros de forma aleatoria y que se pueden clasificar en ellos. Cada registro debe tener una clave única, pero las otras claves de registro alternativas no necesitan ser únicas. Las implementaciones de archivos indexados varían entre proveedores, aunque las implementaciones comunes, como C-ISAM y VSAM, se basan en ISAM de IBM. Los archivos relativos, como los archivos indexados, tienen una clave de registro única, pero no tienen claves alternativas. A La clave del registro relativo es su posición ordinal; por ejemplo, el décimo registro tiene una clave de 10. Esto significa que la creación de un registro con una clave de 5 puede requerir la creación de registros anteriores (vacíos). Los archivos relativos también permiten el acceso secuencial y aleatorio.

Una extensión no estándar común es la organización secuencial de líneas, que se utiliza para procesar archivos de texto. Los registros de un archivo terminan con una nueva línea y pueden tener una longitud variable.

Edición de división de datos

La división de datos se divide en seis secciones que declaran elementos diferentes: la sección de archivo, por registros de archivo; la sección de almacenamiento de trabajo, para variables estáticas; la sección de almacenamiento local, para variables automáticas; la sección de vinculación, para los parámetros y el valor de retorno; la sección de informe y la sección de pantalla, para interfaces de usuario basadas en texto.

DataEdit agregado

Los elementos de datos en COBOL se declaran jerárquicamente mediante el uso de números de nivel que indican si un elemento de datos es parte de otro. Un artículo con un número de nivel superior está subordinado a un artículo con uno más bajo. Los elementos de datos de nivel superior, con un número de nivel de 1, se denominan registros. Los elementos que tienen datos agregados subordinados se denominan elementos de grupo; los que no lo hacen se denominan elementos elementales. Los números de nivel utilizados para describir elementos de datos estándar están entre 1 y 49.

En el ejemplo anterior, el elemento elemental num y el elemento de grupo la-fecha están subordinados al registro algún-registro , mientras que los elementos elementales el año , el mes y el -day son parte del elemento de grupo the-date .

Los elementos subordinados se pueden eliminar de la ambigüedad con IN (o OF ) palabra clave. Por ejemplo, considere el código de ejemplo anterior junto con el siguiente ejemplo:

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

Los nombres el año , el mes y el día son ambiguos por sí mismos, ya que más de un elemento de datos se define con esos nombres. Para especificar un elemento de datos en particular, por ejemplo, uno de los elementos contenidos en el grupo sale-date , el programador usaría el año de la fecha de venta (o el equivalente el año de la fecha de venta ). (Esta sintaxis es similar a la «notación de puntos» admitida por la mayoría de los lenguajes contemporáneos.)

Otros niveles de datosEditar

Un número de nivel de 66 se utiliza para declarar una reagrupación de elementos previamente definidos, independientemente de cómo estén estructurados esos elementos. Este nivel de datos, también conocido por la cláusula asociada RENAMES , se usa raramente y, alrededor de 1988, generalmente se encontraba en programas antiguos. Su capacidad para ignorar los datos de la estructura jerárquica y lógica significaba que su uso no era recomendado y muchas instalaciones prohibían su uso.

Un número de nivel 77 indica que el elemento es independiente, y en tales situaciones es equivalente a el número de nivel 01. Por ejemplo, el siguiente código declara dos elementos de datos de 77 niveles, nombre-de-propiedad y sales-region , que son elementos de datos que no pertenecen al grupo y que son independientes de (no subordinados a) cualquier otro elemento de datos:

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

Un número de nivel 88 declara un nombre de condición (el llamado nivel 88) que es verdadero cuando su elemento de datos principal contiene uno de los valores especificados en su cláusula VALUE . Por ejemplo, el siguiente código define dos elementos de nombre de condición de 88 niveles que son verdaderos o falsos según el valor de datos de carácter actual del elemento de datos tipo de salario . Cuando el elemento de datos contiene un valor de "H" , la condición-nombre salario-es-por-hora es verdadero, mientras que cuando contiene un valor de "S" o "Y" , la condición-nombre salario-anual es verdadera. Si el elemento de datos contiene algún otro valor, ambos nombres de condición son falsos.

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

Tipos de datosEditar

COBOL estándar proporciona los siguientes tipos de datos:

Tipo de datos Declaración de muestra Notas
Alfabético PIC A (30) Solo puede contener letras o espacios
Alfanumérico PIC X (30) Puede contener cualquier carácter
Booleano PIC 1 USAGE BIT Datos almacenados en forma de 0 y 1, como un número binario
Índice INDICE DE USO Se utiliza para hacer referencia a elementos de la tabla
Nacional PIC N (30) Similar a alfanumérico, pero con un carácter extendido establecer, p. ej. UTF-8
Numérico PIC 9 (5) V9 (5) Puede contener solo números
Objeto REFERENCIA DE OBJETO DE USO código> Puede hacer referencia a un objeto o NULL
Puntero PUNTERO DE USO

La seguridad de tipo es variable en COBOL.Los datos numéricos se convierten entre diferentes representaciones y tamaños de forma silenciosa y los datos alfanuméricos se pueden colocar en cualquier elemento de datos que se pueda almacenar como una cadena, incluidos los datos numéricos y de grupo. Por el contrario, las referencias a objetos y los punteros solo se pueden asignar desde elementos del mismo tipo y sus valores pueden estar restringidos a un tipo determinado.

PICTURE clauseEdit

A PICTURE (o PIC ) es una cadena de caracteres, cada uno de los cuales representa una parte del elemento de datos y lo que puede contener. Algunos caracteres de imagen especifican el tipo de elemento y cuántos caracteres o dígitos ocupa en la memoria. Por ejemplo, un 9 indica un dígito decimal y una S indica que el elemento es firmado. Otros caracteres de imagen (llamados caracteres de inserción y edición) especifican cómo se debe formatear un elemento. Por ejemplo, una serie de + caracteres definen las posiciones de los caracteres, así como la forma en que un carácter de signo inicial debe colocarse dentro de los datos de caracteres finales; el carácter no numérico más a la derecha contendrá el signo del elemento, mientras que otras posiciones de caracteres correspondientes a un + a la izquierda de esta posición contendrán un espacio. Repetido los caracteres se pueden especificar de forma más concisa especificando un número entre paréntesis después de un carácter de imagen; por ejemplo, 9 (7) es equivalente a 9999999 . Especificaciones de imagen que contienen solo dígitos ( 9 ) y signo ( Los caracteres S ) definen elementos de datos puramente numéricos, mientras que las especificaciones de imágenes que contienen caracteres alfabéticos ( A ) o alfanuméricos ( X ) definen elementos de datos alfanuméricos. La presencia de otros caracteres de formato definen elementos de datos numéricos o alfanuméricos editados.

Cláusula USAGEEdit

El USAGE declara el formato Los datos se almacenan en. Dependiendo del tipo de datos, pueden complementar o usarse en lugar de una cláusula PICTURE . Si bien se puede utilizar para declarar punteros y referencias a objetos, está principalmente orientado a especificar tipos numéricos. Estos formatos numéricos son:

  • Binario, donde un tamaño mínimo está especificado por la cláusula PICTURE o por una USAGE cláusula como BINARY-LONG.
  • USO COMPUTACIONAL , donde los datos pueden ser almacenados en cualquier formato que proporcione la implementación; a menudo equivalente a USAGE BINARY
  • USAGE DISPLAY , el formato predeterminado , donde los datos se almacenan como una cadena
  • Punto flotante, en un formato dependiente de la implementación o de acuerdo con IEEE 754.
  • USAGE NATIONAL , donde los datos se almacenan como una cadena con un conjunto de caracteres extendido
  • USAGE PACKED-DECIMAL , donde los datos se almacena en el formato decimal más pequeño posible (normalmente decimal codificado en binario empaquetado)

Report WriterEdit

El redactor de informes es una función declarativa para crear informes. El programador solo necesita especificar el diseño del informe y los datos necesarios para producirlo, liberándolo de tener que escribir código para manejar cosas como saltos de página, formato de datos y encabezados y pies.

Los informes están asociados con el informe. archivos, que son archivos en los que solo se puede escribir a través de declaraciones del redactor de informes.

 FD report-out REPORT sales-report.

Cada informe se define en la sección del informe de la división de datos. Un informe se divide en grupos de informes que definen los encabezados, las bases y los detalles del informe. Los informes funcionan en torno a las interrupciones de control jerárquicas. Las interrupciones de control se producen cuando una variable clave cambia su valor; por ejemplo, al crear un informe que detalla los pedidos de los clientes, La interrupción del control podría ocurrir cuando el programa llega a los pedidos de un cliente diferente. A continuación, se muestra una descripción de informe de ejemplo para un informe que brinda las ventas de un vendedor y advierte de cualquier registro no válido:

La descripción del informe anterior describe el siguiente diseño:

Cuatro declaraciones controlan el redactor del informe: INITIATE , que prepara al redactor del informe para la impresión; GENERAR , que imprime un grupo de informes; SUPRIMIR , que suprime la impresión de un grupo de informes; y TERMINATE , que finaliza el procesamiento del informe.Para el ejemplo de informe de ventas anterior, la división de procedimientos podría verse así:

 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 .

El uso de la función Report Writer tendía a variar importantemente; algunas organizaciones lo utilizaron ampliamente y otras no lo utilizaron en absoluto. Además, las implementaciones de Report Writer variaron en calidad, y las del extremo inferior a veces usan cantidades excesivas de memoria en tiempo de ejecución.

Procedimiento de división de edición

Procedimientos de edición

Las secciones y párrafos de la división de procedimientos (denominados colectivamente procedimientos) se pueden utilizar como etiquetas y como subrutinas simples. A diferencia de otras divisiones, los párrafos no necesitan estar en secciones. La ejecución pasa por los procedimientos de un programa hasta que se termina. Para usar procedimientos como subrutinas, el PERFORM código> verbo.

Una instrucción PERFORM se parece un poco a una llamada a procedimiento en un lenguaje moderno en el sentido de que la ejecución regresa al código siguiendo la instrucción PERFORM al final del código llamado; sin embargo, no proporciona ningún mecanismo para pasar parámetros o devolver un valor de resultado. Si se invoca una subrutina usando una declaración simple como PERFORM subrutina , el control regresa al final del procedimiento llamado. Sin embargo, PERFORM es inusual porque puede usarse para llamar a un rango que abarca una secuencia de varios procedimientos adyacentes. Esto se hace con la construcción 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".

La salida de este programa será: «AABC».

PERFORM también difiere de las llamadas a procedimientos convencionales en que, al menos tradicionalmente, no existe una noción de pila de llamadas. Como consecuencia, las invocaciones anidadas son posibles (una secuencia de código que sea PERFORM «ed puede ejecutar un PERFORM instrucción en sí), pero requieren un cuidado especial si ambas invocaciones ejecutan partes del mismo código. El problema surge cuando el código en la invocación interna alcanza el punto de salida de la invocación externa. Más formalmente, si el control pasa a través del punto de salida de una invocación PERFORM que se llamó anteriormente pero que aún no se ha completado, el estándar COBOL 2002 estipula oficialmente que el comportamiento no está definido.

La razón es que COBOL, en lugar de una «dirección de retorno», opera con lo que podría llamarse una dirección de continuación. Cuando el flujo de control llega al final de cualquier procedimiento, se busca la dirección de continuación y el control se transfiere a esa dirección. el programa se ejecuta, la dirección de continuación para cada procedimiento se inicializa a la dirección de inicio del pro cedura que viene a continuación en el texto del programa de modo que, si no ocurren sentencias PERFORM , el control fluye de arriba hacia abajo a través del programa. Pero cuando se ejecuta una instrucción PERFORM , modifica la dirección de continuación del procedimiento llamado (o el último procedimiento del rango llamado, si PERFORM THRU se utilizó), por lo que el control volverá al sitio de la llamada al final. El valor original se guarda y luego se restaura, pero solo hay una posición de almacenamiento. Si dos invocaciones anidadas operan en código superpuesto, pueden interferir en la gestión mutua de la dirección de continuación de varias formas.

El siguiente ejemplo (tomado de Veerman & Verhoeven 2006) ilustra el problema:

Uno podría esperar que la salida de este programa fuera «1 2 3 4 3»: Después de mostrar «2», el segundo PERFORM hace que se muestren «3» y «4», y luego la primera invocación continúa con «3». En las implementaciones tradicionales de COBOL, este no es el caso. Más bien, la primera PERFORM establece la dirección de continuación al final de LABEL3 para que salte de nuevo al llamar al sitio dentro de LABEL1 . La segunda instrucción PERFORM establece el retorno al final de LABEL4 pero no modifica la dirección de continuación de LABEL3 , esperando que sea la continuación predeterminada. Por lo tanto, cuando la invocación interna llega al final de LABEL3 , regresa al PERFORM declaración, y el programa deja de imprimir sólo «1 2 3». Por otro lado, en algunas implementaciones de COBOL como el compilador de código abierto TinyCOBOL, las dos instrucciones PERFORM no interfieren entre sí y la salida es de hecho «1 2 3 4 3 «.Por lo tanto, el comportamiento en tales casos no solo es (quizás) sorprendente, tampoco es portátil.

Una consecuencia especial de esta limitación es que PERFORM no se puede utilizar para escribir código recursivo. Otro ejemplo simple para ilustrar esto (ligeramente simplificado 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".

Uno podría esperar que la salida sea «1 2 3 END END END», y de hecho eso es lo que producirán algunos compiladores COBOL. Pero algunos compiladores, como IBM COBOL, producirán código que imprima «1 2 3 END END END END …» y así sucesivamente, imprimiendo «END» una y otra vez en un bucle sin fin. Dado que hay espacio limitado para almacenar las direcciones de continuación de la copia de seguridad, las copias de seguridad se sobrescriben en el transcurso de las invocaciones recursivas y todo lo que se puede restaurar es volver a DISPLAY "END" .

StatementsEdit

COBOL 2014 tiene 47 declaraciones (también llamadas verbos), que se pueden agrupar en las siguientes categorías generales: flujo de control, E / S, manipulación de datos y el redactor del informe. Las declaraciones del redactor del informe se tratan en la sección del redactor del informe.

Control flowEdit

Las declaraciones condicionales de COBOL son IF y EVALUATE . EVALUATE es una declaración similar a un interruptor con la capacidad adicional de evaluar múltiples valores y condiciones. Esto se puede usar para implementar tablas de decisión. Por ejemplo, lo siguiente podría usarse para controlar un torno 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

La instrucción PERFORM se usa para definir bucles que se ejecutan hasta que una condición es verdadera (no mientras sea verdadera, que es más común en otros idiomas). también se utiliza para llamar a procedimientos o rangos de procedimientos (consulte la sección de procedimientos para obtener más detalles). CALL y INVOKE llama a subprogramas y métodos, respectivamente. El nombre del subprograma / método está contenido en una cadena ing que puede ser un literal o un elemento de datos. Los parámetros se pueden pasar por referencia, por contenido (donde se pasa una copia por referencia) o por valor (pero solo si hay un prototipo disponible). CANCEL descarga subprogramas de memoria. GO TO hace que el programa salte a un procedimiento específico.

El GOBACK es una sentencia de retorno y la sentencia STOP detiene el programa. La instrucción EXIT tiene seis formatos diferentes: se puede usar como instrucción de retorno, instrucción de interrupción, instrucción de continuación, marcador de fin o para salir de un procedimiento.

Las excepciones se generan mediante una instrucción RAISE y se detectan con un controlador, o declarativo, definido en DECLARATIVES parte de la división del procedimiento. Los declarativos son secciones que comienzan con una instrucción USE que especifican los errores a manejar. Las excepciones pueden ser nombres u objetos. RESUME se usa en un declarativo para saltar a la declaración después de la que generó la excepción o a un procedimiento fuera de DECLARATIVOS . A diferencia de otros lenguajes, las excepciones no detectadas pueden no terminar el programa y el programa puede continuar sin verse afectado.

I / OEdit

La E / S de archivos es manejada por la autodescripción ABRIR , CERRAR , LEER , y WRITE declaraciones junto con otras tres: REWRITE , que actualiza un registro; START , que selecciona los registros posteriores para acceder al buscar un registro con una determinada clave; y UNLOCK , que libera un bloqueo en el último registro accedido.

La interacción del usuario se realiza usando ACCEPT y DISPLAY .

Data manipulationEdit

Los siguientes verbos manipulan datos:

  • INITIALIZE , que establece los elementos de datos en sus valores predeterminados.
  • MOVE , que asigna valores a elementos de datos; MOVE CORRESPONDING asigna los campos correspondientes con nombres similares.
  • SET , que tiene 15 formatos: puede modificar índices, asignar referencias de objetos y alterar tablas capacidades, entre otras funciones.
  • AÑADIR , RESTA , MULTIPLY , DIVIDE y COMPUTE , que manejan aritmética (con COMPUTE asignando el resultado de una fórmula a una variable).
  • ALLOCATE y FREE , que manejan la memoria dinámica.
  • VALIDATE , que valida y distribuye datos como se especifica en la descripción de un elemento en la división de datos.
  • STRING y UNSTRING , que concatenan y dividen cadenas, respectivamente.
  • INSPECT , que concuerda o reemplaza instancias de subcadenas especificadas dentro de una cadena.
  • SEARCH , que busca en una tabla la primera entrada satisfaciendo una condición.

Los archivos y tablas se ordenan usando SORT y MERGE fusiona y clasifica archivos. El verbo RELEASE proporciona registros para ordenar y RETURN recupera registros ordenados en orden.

Scope terminationEdit

Algunas declaraciones, como IF y READ , pueden contener declaraciones. Tales declaraciones pueden terminarse de dos maneras: por un período (terminación implícita), que termina todas las declaraciones no terminadas contenidas, o por un terminador de alcance, que termina la declaración abierta coincidente más cercana.

Las declaraciones anidadas terminadas con un período son una fuente común de errores. Por ejemplo, examine el siguiente código:

IF x DISPLAY y. DISPLAY z.

Aquí, la intención es mostrar y y z si la condición x es verdadera. Sin embargo, z se mostrará cualquiera que sea el valor de x porque la instrucción IF está terminada. por un período erróneo después de DISPLAY y .

Otro error es el resultado del problema colgando else, cuando dos pueden asociarse con un ELSE.

IF x IF y DISPLAY aELSE DISPLAY b.

En el fragmento anterior, la ELSE se asocia con la instrucción IF y en lugar de la IF x declaración, que provoca un error. Antes de la introducción de terminadores de alcance explícitos, su prevención requeriría que ELSE NEXT SENTENCE se coloque después del IF interno .

Código de modificación automáticaEditar

La especificación COBOL original (1959) admitía el infame ALTER X PARA PROCEDER A Y declaración, para la cual muchos compiladores generaron código auto-modificable. X y Y son etiquetas de procedimiento, y la única IR A instrucción en el procedimiento X ejecutada después de dicha instrucción ALTER significa IR A Y en su lugar. Muchos compiladores aún lo admiten, pero se consideró obsoleto en el estándar COBOL 1985 y se eliminó en 2002.

La declaración ALTER no se consideró bien porque socavaba la «localidad del contexto» y hacía que la lógica general de un programa fuera difícil de comprender. Como escribió el autor de un libro de texto Daniel D. McCracken en 1976, cuando «alguien que nunca ha visto el programa antes debe familiarizarse con él lo más rápido posible , a veces bajo una presión de tiempo crítica porque el programa ha fallado … la visión de una declaración GO TO en un párrafo por sí sola, que indica la existencia de un número desconocido de declaraciones ALTER en lugares desconocidos a lo largo del programa, infunde temor en el corazón del programador más valiente. «

Hola, worldEdit

Un programa» Hola, mundo «en COBOL:

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

Cuando el – ahora famoso – ejemplo de programa «¡Hola, mundo!» en El lenguaje de programación C se publicó por primera vez en 1978, un mai similar La muestra del programa nframe COBOL se habría enviado a través de JCL, muy probablemente utilizando un lector de tarjetas perforadas y tarjetas perforadas de 80 columnas. La siguiente lista, con una DIVISIÓN DE DATOS vacía, se probó usando GNU / Linux y el emulador System / 370 Hercules con MVS 3.8J. El JCL, escrito en julio de 2015, se deriva de los tutoriales y ejemplos de Hercules alojados por Jay Moseley. De acuerdo con la programación COBOL de esa época, HOLA, MUNDO se muestra en letras mayúsculas.

Después de enviar el JCL, la consola MVS mostró:

 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

Línea 10 de la lista de la consola anterior está resaltado para el efecto, el resaltado no es parte de la salida real de la consola.

La lista del compilador asociado generó más de cuatro páginas de detalles técnicos e información de ejecución de trabajos, para la única línea de salida de las 14 líneas de COBOL.

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *