cv.cm

Programación · Lenguajes de programación

Tutorial de COBOL para principiantes

7 min de lectura

Respuesta corta

COBOL (Common Business-Oriented Language) es un lenguaje compilado diseñado para el procesamiento de datos empresariales: registros, archivos, informes y aritmética decimal exacta. Los programas se dividen en cuatro divisiones, los datos se describen con cláusulas PIC (picture) y el código se lee como frases en inglés, como ADD AMOUNT TO TOTAL. Todavía sostiene sistemas centrales de bancos, aseguradoras y gobiernos, sobre todo en mainframes de IBM. Puedes aprenderlo gratis con el compilador GnuCOBOL: cobc -x hello.cob.

Qué es COBOL y quién lo usa

COBOL fue diseñado en 1959 por el comité CODASYL, con una fuerte influencia del lenguaje anterior FLOW-MATIC de Grace Hopper. Está normalizado por ISO; los estándares posteriores añadieron programación estructurada, orientación a objetos y otras funciones, y la revisión más reciente se publicó en 2023.

COBOL se usa en sistemas de procesamiento por lotes y transaccionales: gestión de cuentas, nóminas, reclamaciones de seguros y sistemas de impuestos y prestaciones. Gran parte de este código se ejecuta en mainframes IBM Z con IBM Enterprise COBOL, junto con CICS para las transacciones y Db2 para los datos. Los empleos de mantenimiento y modernización de estos sistemas siguen siendo habituales.

Instala GnuCOBOL y ejecuta Hello, world

GnuCOBOL es un compilador gratuito que traduce COBOL a C y después a un programa nativo. Está disponible como el paquete gnucobol en muchas distribuciones de Linux y en Homebrew para macOS; los usuarios de Windows pueden usar WSL o un paquete precompilado.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       PROCEDURE DIVISION.
           DISPLAY "Hello, world!".
           STOP RUN.
cobc -x hello.cob
./hello
# Hello, world!

El código usa el formato fijo tradicional: las columnas 1 a 6 son para números de secuencia, la columna 7 marca los comentarios (*) o las líneas de continuación, el Área A (columnas 8 a 11) contiene los nombres de divisiones, secciones y párrafos, y el Área B (columnas 12 a 72) contiene las instrucciones. GnuCOBOL también acepta código fuente en formato libre con cobc -x -free. La opción -x genera un ejecutable en lugar de un módulo.

Las cuatro divisiones

DivisiónPropósito
IDENTIFICATION DIVISIONDa nombre al programa (PROGRAM-ID)
ENVIRONMENT DIVISIONConecta el programa con el exterior, por ejemplo qué archivos usa
DATA DIVISIONDeclara todos los datos: registros de archivo, almacenamiento de trabajo, parámetros
PROCEDURE DIVISIONLas instrucciones ejecutables, organizadas en párrafos

Toda variable debe declararse en la DATA DIVISION antes de usarse. La WORKING-STORAGE SECTION contiene las variables del programa, la FILE SECTION describe los registros de archivo y la LINKAGE SECTION describe los parámetros que pasa quien llama.

Datos y cláusulas PIC

COBOL describe los datos por su disposición exacta. Un número de nivel indica la jerarquía (01 es un registro, 05 un campo dentro de él) y una cláusula PIC da el formato: X es cualquier carácter, 9 es un dígito, S un signo y V una coma decimal implícita.

DeclaraciónSignificadoValor de ejemplo
PIC X(10)10 caracteres, rellenados con espacios"Ana "
PIC 9(3)Número de 3 dígitos sin signo030
PIC S9(5)V99Con signo, 5 dígitos antes y 2 después del punto decimal-01234.50
PIC $ZZ,ZZ9.99Salida editada: signo de moneda, ceros iniciales como espacios$ 1,234.50
PIC S9(7)V99 COMP-3Decimal empaquetado, habitual en mainframesalmacenado en 5 bytes
88 IS-DONE VALUE "Y"Nombre de condición: una prueba booleana sobre su campo padreIF IS-DONE
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DATA-DEMO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-NAME        PIC X(10)      VALUE "Ana".
       01  WS-AGE         PIC 9(3)       VALUE 30.
       01  WS-PRICE       PIC S9(5)V99   VALUE 1234.50.
       01  WS-PRICE-OUT   PIC $ZZ,ZZ9.99.
       01  WS-CUSTOMER.
           05  WS-FIRST   PIC X(10).
           05  WS-LAST    PIC X(15).
       PROCEDURE DIVISION.
           MOVE WS-PRICE TO WS-PRICE-OUT
           DISPLAY WS-NAME "is " WS-AGE
           DISPLAY "Price: " WS-PRICE-OUT
           STOP RUN.
      *> Ana       is 030
      *> Price: $ 1,234.50

Los números se almacenan en decimal, así que 0.10 + 0.20 es exactamente 0.30, una de las razones por las que COBOL es adecuado para el dinero. WS-CUSTOMER es un elemento de grupo: puede moverse completo o campo por campo.

Control de flujo: IF, EVALUATE y PERFORM

       IDENTIFICATION DIVISION.
       PROGRAM-ID. CONTROL-DEMO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-I        PIC 99.
       01  WS-TOTAL    PIC 9(4) VALUE 0.
       01  WS-SCORE    PIC 999  VALUE 85.
       PROCEDURE DIVISION.
           PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 10
               ADD WS-I TO WS-TOTAL
           END-PERFORM
           DISPLAY "Total: " WS-TOTAL
           EVALUATE TRUE
               WHEN WS-SCORE >= 90
                   DISPLAY "A"
               WHEN WS-SCORE >= 80
                   DISPLAY "B"
               WHEN OTHER
                   DISPLAY "C"
           END-EVALUATE
           IF WS-TOTAL > 50
               DISPLAY "big"
           ELSE
               DISPLAY "small"
           END-IF
           STOP RUN.
      *> Total: 0055
      *> B
      *> big

PERFORM VARYING es el bucle con contador de COBOL y PERFORM UNTIL condition su bucle while. EVALUATE es una instrucción switch. Los terminadores de ámbito como END-IF y END-PERFORM cierran cada bloque; un punto termina la oración completa.

Párrafos, aritmética y tablas

COBOL no tiene funciones en el sentido habitual. Organizas la lógica en párrafos con nombre y los ejecutas con PERFORM; las unidades mayores se convierten en programas independientes a los que se llama con CALL "PROG" USING .... La aritmética usa verbos (ADD, SUBTRACT, MULTIPLY, DIVIDE) o COMPUTE con una fórmula. Los arreglos se llaman tablas y se declaran con OCCURS; sus índices empiezan en 1.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. PARA-DEMO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-PRICES.
           05  WS-PRICE   PIC 9(3)V99 OCCURS 3 TIMES.
       01  WS-I           PIC 9.
       01  WS-SUM         PIC 9(4)V99 VALUE 0.
       01  WS-SUM-OUT     PIC Z,ZZ9.99.
       PROCEDURE DIVISION.
       MAIN-PARA.
           MOVE 10.50 TO WS-PRICE(1)
           MOVE 4.25  TO WS-PRICE(2)
           MOVE 7.00  TO WS-PRICE(3)
           PERFORM ADD-PRICE VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
           COMPUTE WS-SUM = WS-SUM * 1.1
           MOVE WS-SUM TO WS-SUM-OUT
           DISPLAY "With 10% tax: " WS-SUM-OUT
           STOP RUN.
       ADD-PRICE.
           ADD WS-PRICE(WS-I) TO WS-SUM.
      *> With 10% tax:    23.92

La suma es 21.75; multiplicada por 1.1 da 23.925, y COBOL trunca a los dos decimales declarados (23.92) a menos que escribas COMPUTE ... ROUNDED.

Manejo de errores

COBOL no tiene excepciones en el código cotidiano. En su lugar, las instrucciones tienen cláusulas condicionales: ON SIZE ERROR para el desbordamiento aritmético o la división por cero, AT END para el final de un archivo, INVALID KEY para archivos indexados y un campo FILE STATUS que recibe un código de dos caracteres tras cada operación con archivos ("00" significa éxito).

           DIVIDE WS-A BY WS-B GIVING WS-C
               ON SIZE ERROR
                   DISPLAY "Division failed"
               NOT ON SIZE ERROR
                   DISPLAY "Result: " WS-C
           END-DIVIDE

Un programa pequeño y completo: total de un archivo de ventas

Leer registros de disposición fija desde un archivo es un trabajo típico en COBOL. Este programa lee sales.txt, donde cada línea tiene un nombre de artículo de 10 caracteres seguido de un importe de 7 dígitos con dos decimales implícitos.

apples    0001250
pears     0000899
plums     0002000
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SALES-TOTAL.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-FILE ASSIGN TO "sales.txt"
               ORGANIZATION IS LINE SEQUENTIAL
               FILE STATUS IS WS-FS.
       DATA DIVISION.
       FILE SECTION.
       FD  SALES-FILE.
       01  SALES-REC.
           05  SR-ITEM     PIC X(10).
           05  SR-AMOUNT   PIC 9(5)V99.
       WORKING-STORAGE SECTION.
       01  WS-FS           PIC XX.
       01  WS-EOF          PIC X VALUE "N".
           88  NO-MORE-RECORDS       VALUE "Y".
       01  WS-TOTAL        PIC 9(7)V99 VALUE 0.
       01  WS-TOTAL-OUT    PIC Z,ZZZ,ZZ9.99.
       PROCEDURE DIVISION.
           OPEN INPUT SALES-FILE
           IF WS-FS NOT = "00"
               DISPLAY "Cannot open file, status " WS-FS
               STOP RUN
           END-IF
           PERFORM UNTIL NO-MORE-RECORDS
               READ SALES-FILE
                   AT END SET NO-MORE-RECORDS TO TRUE
                   NOT AT END ADD SR-AMOUNT TO WS-TOTAL
               END-READ
           END-PERFORM
           CLOSE SALES-FILE
           MOVE WS-TOTAL TO WS-TOTAL-OUT
           DISPLAY "Total sales: " WS-TOTAL-OUT
           STOP RUN.

Al ejecutarlo se imprime Total sales: seguido de 41.49 alineado a la derecha en el campo editado de 12 caracteres. LINE SEQUENTIAL significa un archivo de texto con un registro por línea; lo admiten GnuCOBOL y otros compiladores para PC, mientras que los programas de mainframe suelen leer conjuntos de datos de longitud fija definidos en JCL.

Adónde ir después

  • Las páginas del proyecto GnuCOBOL y su Programmer's Guide como referencia completa del lenguaje.
  • La documentación de IBM Enterprise COBOL for z/OS para COBOL de mainframe y el uso de CICS y Db2.
  • Practica la lectura y escritura de archivos, la ordenación con el verbo SORT y la generación de informes con formato.
  • Aprende las herramientas de mainframe que lo rodean (JCL, TSO/ISPF) si quieres trabajar en sistemas de producción.

Preguntas frecuentes

¿Se sigue usando COBOL?

Sí. Muchos bancos, aseguradoras y organismos públicos siguen ejecutando programas COBOL para el procesamiento central por lotes y transaccional, así que sigue habiendo demanda de desarrolladores que puedan mantenerlos y modernizarlos.

¿Es difícil aprender COBOL?

La sintaxis es verbosa pero sencilla, y la mayoría de los principiantes escriben programas funcionales rápidamente. Lo más difícil es el entorno de mainframe que lo rodea: JCL, conjuntos de datos, CICS y Db2.

¿Puedo aprender COBOL sin un mainframe?

Sí. GnuCOBOL funciona en Linux, macOS y Windows y admite COBOL estándar, así que puedes aprender el lenguaje en un ordenador normal antes de pasar a un mainframe.

¿Por qué COBOL usa números decimales?

Los datos empresariales, como el dinero, deben ser exactos. COBOL almacena los números como dígitos decimales con un número fijo de decimales, lo que evita los errores de redondeo del punto flotante binario.

Todos los tutoriales de programación