Cómo empezar con COBOL: instalarlo, el primer programa y los errores típicos

COBOL tiene fama de lenguaje inaccesible: parece que hace falta un mainframe de IBM, una cuenta en un banco y muchos años de experiencia para escribir la primera línea. No es así. Con un ordenador normal y un compilador gratuito puedes aprender el lenguaje en unas semanas, y hay entornos gratuitos para practicar después en un mainframe de verdad. Esta guía explica cómo empezar con COBOL desde cero: te lleva hasta tu primer programa que lee un archivo, con los errores que te vas a encontrar por el camino, y te cuenta qué más hay que aprender para trabajar con él. Si antes quieres saber de dónde viene y si merece la pena, lo contamos en COBOL: historia, dónde se usa y si conviene aprenderlo.

Lo que necesitas (y lo que no)

  • Un ordenador cualquiera con Windows, macOS o Linux.
  • GnuCOBOL, un compilador libre y gratuito del proyecto GNU. Su versión actual es la 3.2, de julio de 2023, y entiende el COBOL estándar y buena parte de los dialectos de IBM y de Micro Focus.
  • Un editor de texto. Cualquiera sirve; con VS Code y una extensión de COBOL es más cómodo.

Lo que no necesitas para empezar: un mainframe, una licencia de pago ni saber otro lenguaje. Saber programar en otro ayuda, pero COBOL se escribe casi en inglés y es de los lenguajes más fáciles de leer.

Instalar GnuCOBOL

En los tres sistemas se instala desde el gestor de paquetes habitual. Todos instalan la orden cobc, que es el compilador.

Linux

# Debian, Ubuntu y derivados
sudo apt install gnucobol

# Fedora
sudo dnf install gnucobol

Debian 13 y Ubuntu 26.04 instalan la versión 3.2. Debian 12 y Ubuntu 24.04 se quedan en la 3.1.2, que también sirve para todo lo de esta guía.

macOS

Con Homebrew instalado:

brew install gnucobol

Windows

Hay dos caminos. El más sencillo es WSL, el Linux que Windows trae integrado: abre PowerShell como administrador, escribe wsl --install, reinicia, y dentro de la ventana de Ubuntu que aparece sigue los pasos de Linux. El otro es MSYS2, si prefieres programas nativos de Windows: en su terminal UCRT64, la orden es esta:

pacman -S mingw-w64-ucrt-x86_64-gnucobol

Comprobar que funciona

cobc --version
La primera línea de la respuestacobc (GnuCOBOL) 3.2.0
Dos avisos que puedes ignorar. Con el paquete de Ubuntu 26.04, cada compilación escribe warning: '_FORTIFY_SOURCE' redefined; con el de Debian 13, cada ejecución escribe Warning: program compiled against libxml 212 using older 209. Son detalles de cómo se empaquetó GnuCOBOL en esas distribuciones: el programa funciona igual. Las salidas de esta guía son de Fedora 43, que no escribe ninguno de los dos.

El editor

Puedes escribir COBOL en el Bloc de notas, pero un editor que colorea el código y marca las columnas te ahorrará muchos errores. En VS Code, las extensiones más útiles para empezar son COBOL, de Bitlang (la más instalada, con unas 204,000 instalaciones), y SuperBOL Studio, de OCamlPro, pensada para trabajar con GnuCOBOL. Cuando pases al mainframe, se añaden IBM Z Open Editor y Zowe Explorer, que veremos al final.

Tu primer programa

Crea un archivo llamado hola.cob con este contenido. Copia también los espacios del principio de cada línea: importan, y enseguida verás por qué.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HOLA.
       PROCEDURE DIVISION.
           DISPLAY "Hola, mundo".
           STOP RUN.

Para compilarlo y ejecutarlo:

cobc -x hola.cob
./hola
SalidaHola, mundo

La opción -x le pide a cobc un ejecutable, un programa que se lanza solo. Sin ella, crea un módulo (hola.so en Linux) que está pensado para que lo llame otro programa. En Windows con MSYS2 el ejecutable se llama hola.exe y se lanza con ./hola.exe.

Las columnas: herencia de las tarjetas perforadas

Los espacios del principio están ahí porque COBOL nació en 1959, cuando los programas se escribían en tarjetas perforadas de 80 columnas, una línea por tarjeta. Cada zona de la tarjeta tenía su función, y el llamado formato fijo lo sigue respetando:

Regla de 80 columnas del formato fijo de COBOL con un programa de ejemplo: las columnas 1 a 6 llevan el número de secuencia, la 7 el indicador de comentario, la 8 a la 11 el área A con las divisiones, la 12 a la 72 el área B con las instrucciones, y lo que va de la 73 a la 80 se ignoraEl formato fijo: cada cosa en su columna1-68-1112-7273-807000100IDENTIFICATION DIVISION.000200PROGRAM-ID. HOLA.000300*Comentario: asterisco en la columna 7000400PROCEDURE DIVISION.000500DISPLAY "Hola, mundo".000600STOP RUN.HOLA06001-6número de secuencia: opcional; antes, el orden de las tarjetas7indicador: asterisco o barra para comentar, guion para seguir8-11área A: divisiones, secciones, párrafos y niveles 0112-72área B: las instrucciones y el resto de los datos73-80se ignora: el compilador ni lo mira

Las 80 columnas del formato fijo. Este programa, con números de secuencia, un comentario y texto en las columnas 73 a 80, compila y escribe «Hola, mundo». Esquema: decodigo.com.

En la práctica, para empezar basta con recordar dos reglas: las instrucciones empiezan en la columna 12 (con once espacios delante) y nada puede pasar de la columna 72. Las divisiones, las secciones y los niveles 01 empiezan en la columna 8 (siete espacios). Un buen editor dibuja líneas verticales en esas columnas para que no tengas que contar.

Existe también el formato libre, sin columnas, que el estándar admite desde 2002. Con GnuCOBOL se activa con la opción -free:

*> Formato libre: sin columnas fijas (cobc -free)
identification division.
program-id. libre.
procedure division.
    display "Esto tambien es COBOL, en formato libre".
    stop run.
cobc -x -free libre.cob
./libre
SalidaEsto tambien es COBOL, en formato libre

Es más cómodo, pero si tu objetivo es trabajar con COBOL, acostúmbrate al formato fijo: es el que vas a encontrar en los programas de los bancos y las aseguradoras, y el que exigen los compiladores del mainframe.

Las cuatro divisiones

Todo programa COBOL se organiza en cuatro bloques llamados divisiones, siempre en el mismo orden. Es como una receta: primero el título, luego el material, después los ingredientes y por último los pasos.

Las cuatro divisiones de COBOL en orden: IDENTIFICATION con el nombre del programa, como la portada; ENVIRONMENT con los archivos, como el material; DATA con las variables, como los ingredientes; y PROCEDURE con las instrucciones, como los pasos de la receta. Solo la primera y la última son obligatoriasLas cuatro divisiones de un programa COBOLIDENTIFICATION DIVISION.el nombre del programala portadaobligatoriaENVIRONMENT DIVISION.qué archivos usa y dónde estánel materialsi hace faltaDATA DIVISION.todas las variables, con su tamañolos ingredientessi hace faltaPROCEDURE DIVISION.las instrucciones, en ordenlos pasos de la recetaobligatoriaVan siempre en este orden. Un programa mínimo solo necesita la primera y la última.

Las divisiones de COBOL y su equivalente en una receta. Esquema: decodigo.com.

Este programa usa tres de ellas. Pide un nombre y una edad, y responde:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SALUDO.
      *> Pide un nombre y una edad, y responde.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  NOMBRE        PIC X(20).
       01  EDAD          PIC 999.
       01  EN-DIEZ       PIC ZZ9.
       PROCEDURE DIVISION.
           DISPLAY "Como te llamas? " WITH NO ADVANCING
           ACCEPT NOMBRE
           DISPLAY "Cuantos anos tienes? " WITH NO ADVANCING
           ACCEPT EDAD
           COMPUTE EN-DIEZ = EDAD + 10
           DISPLAY "Hola, " FUNCTION TRIM(NOMBRE) "."
           DISPLAY "Dentro de diez anos tendras "
                   FUNCTION TRIM(EN-DIEZ) "."
           STOP RUN.
Salida, escribiendo Marta y 34Como te llamas? Cuantos anos tienes? Hola, Marta.
Dentro de diez anos tendras 44.

Lo que hay que saber para leerlo:

  • La DATA DIVISION declara todas las variables antes de usarlas. Dentro, la WORKING-STORAGE SECTION es la memoria de trabajo del programa. El 01 es el nivel: indica que es una variable completa, no una parte de otra.
  • PIC (de picture, «dibujo») dice qué cabe en la variable: X(20) son 20 caracteres y 999 un número de tres cifras.
  • Las instrucciones son casi frases en inglés: DISPLAY escribe, ACCEPT lee del teclado y COMPUTE calcula. Las palabras se pueden escribir en mayúsculas o en minúsculas.
  • El punto cierra una frase. Dentro de la PROCEDURE DIVISION se puede poner un punto al final de cada instrucción o solo al final de un párrafo, como aquí.
  • FUNCTION TRIM quita los espacios de relleno: «Marta» ocupa 5 de los 20 caracteres de NOMBRE, y sin TRIM se escribirían los otros 15 como espacios.
¿Por qué «anos» y no «años»? En COBOL, PIC X(20) cuenta bytes, no letras. En UTF-8, la codificación de casi todos los sistemas actuales, la ñ y las vocales con tilde ocupan dos bytes, así que los textos con ellas se descuadran o se cortan. Los mainframes usan EBCDIC, otra codificación con un byte por letra. Para practicar, lo más sencillo es escribir los textos sin tildes.

Los datos: PIC y los decimales exactos

La cláusula PIC es el corazón de COBOL. Cada símbolo dice qué hay en cada posición:

  • 9: una cifra. 9(7) son siete cifras.
  • X: un carácter cualquiera.
  • V: dónde va la coma decimal. No ocupa espacio: 9(7)V99 son nueve cifras, dos de ellas decimales.
  • S: el número lleva signo.
  • Z, $, ,, . y CR: símbolos de edición, para mostrar el número bonito, con ceros a la izquierda en blanco, el símbolo de moneda pegado a la cifra, separador de miles o CR (crédito) si es negativo.

Los niveles permiten además agrupar variables en un registro, como una ficha con varios campos:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. DATOS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  CLIENTE.
           05  NOMBRE       PIC X(12)       VALUE "Ana Lopez".
           05  CIUDAD       PIC X(10)       VALUE "Puebla".
           05  SALDO        PIC S9(7)V99    VALUE -1250.5.
       01  SALDO-ED         PIC $$,$$$,$$9.99CR.
       01  PEQUENO          PIC 99.
       PROCEDURE DIVISION.
           DISPLAY "Registro completo: [" CLIENTE "]"
           DISPLAY "Saldo tal cual:    " SALDO
           MOVE SALDO TO SALDO-ED
           DISPLAY "Saldo editado:     " SALDO-ED
           MOVE 1234 TO PEQUENO
           DISPLAY "1234 en PIC 99:    " PEQUENO
           STOP RUN.
SalidaRegistro completo: [Ana Lopez   Puebla    00012505p]
Saldo tal cual:    -0001250.50
Saldo editado:         $1,250.50CR
1234 en PIC 99:    34

Cuatro detalles de esta salida enseñan mucho de COBOL:

  • El registro es una sola tira de caracteres. CLIENTE son los 12 caracteres del nombre, los 10 de la ciudad y las 9 cifras del saldo, pegados. Así se guardan los datos en los archivos de los bancos: sin comas ni comillas, cada campo en una posición fija.
  • El signo va escondido en la última cifra. El saldo, dentro del registro, se ve como 00012505p: la p es un 0 con el signo menos incorporado. Es una forma de guardar el signo sin gastar un carácter más.
  • La edición lo arregla para mostrarlo. Al mover el saldo a una variable con PIC $$,$$$,$$9.99CR, sale con su símbolo de moneda, la coma de miles y CR por ser negativo.
  • Lo que no cabe se corta sin avisar. 1234 en una variable de dos cifras se queda en 34. Al ejecutar no hay ningún error.

Ese último punto es peligroso. GnuCOBOL lo detecta al compilar si se lo pides con -Wall, que activa los avisos:

cobc -x -Wall datos.cob (primeras líneas)datos.cob:16: warning: value size exceeds data size [-Wtruncate]
   14 |            MOVE SALDO TO SALDO-ED
   15 |            DISPLAY "Saldo editado:     " SALDO-ED
   16 >            MOVE 1234 TO PEQUENO

Acostúmbrate a compilar siempre con -Wall. Más adelante, en los errores típicos, verás el caso en que el aviso no llega a tiempo.

Por qué los bancos quieren COBOL: los decimales exactos

Casi todos los lenguajes modernos guardan los números con decimales en coma flotante, un formato binario que no puede representar con exactitud valores como 0.10. Suma diez veces 0.10 en Python con un bucle y verás el resultado:

Python 3.14: t = 0.0; diez veces t += 0.10; print(t)0.9999999999999999

COBOL guarda los números en decimal, cifra a cifra, como los escribirías a mano. El mismo cálculo da exactamente 1:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SUMA.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  TOTAL   PIC 9V99 VALUE ZERO.
       01  TOTAL-ED PIC 9.99.
       01  I       PIC 99.
       PROCEDURE DIVISION.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
               ADD 0.10 TO TOTAL
           END-PERFORM
           MOVE TOTAL TO TOTAL-ED
           DISPLAY "Diez veces 0.10 = " TOTAL-ED
           STOP RUN.
SalidaDiez veces 0.10 = 1.00

Y cuando un cálculo produce más decimales de los que caben, tú decides qué hacer: con ROUNDED se redondea y sin él se truncan. Este programa aplica un interés mensual del 1.25 % a tres cuentas y redondea al centavo:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. INTERESES.
      *> Aplica el interes mensual a tres cuentas y muestra el saldo.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  TASA-MENSUAL     PIC V9999         VALUE .0125.
       01  SALDO            PIC 9(7)V99.
       01  INTERES          PIC 9(7)V99.
       01  TOTAL            PIC 9(8)V99       VALUE ZERO.
       01  SALDO-ED         PIC $$,$$$,$$9.99.
       01  INTERES-ED       PIC $$,$$$,$$9.99.
       01  TOTAL-ED         PIC $$$,$$$,$$9.99.
       01  CUENTAS.
           05  FILLER       PIC 9(7)V99       VALUE 1299.99.
           05  FILLER       PIC 9(7)V99       VALUE 250000.00.
           05  FILLER       PIC 9(7)V99       VALUE 0.10.
       01  TABLA REDEFINES CUENTAS.
           05  CUENTA       PIC 9(7)V99       OCCURS 3 TIMES.
       01  I                PIC 9.
       PROCEDURE DIVISION.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
               MOVE CUENTA(I) TO SALDO
               COMPUTE INTERES ROUNDED = SALDO * TASA-MENSUAL
               ADD INTERES TO SALDO
               ADD SALDO TO TOTAL
               MOVE SALDO TO SALDO-ED
               MOVE INTERES TO INTERES-ED
               DISPLAY "Cuenta " I ": interes " INTERES-ED
                       "   saldo " SALDO-ED
           END-PERFORM
           MOVE TOTAL TO TOTAL-ED
           DISPLAY "Total de los saldos:              " TOTAL-ED
           STOP RUN.
SalidaCuenta 1: interes        $16.25   saldo     $1,316.24
Cuenta 2: interes     $3,125.00   saldo   $253,125.00
Cuenta 3: interes         $0.00   saldo         $0.10
Total de los saldos:                 $254,441.34

Fíjate en la tercera cuenta: el 1.25 % de 10 centavos es 0.125 centavos, que redondeado al centavo es 0. Esa regla, escrita a la vista en cada cálculo, es lo que hace que un programa COBOL dé al céntimo el mismo resultado hoy que hace cuarenta años. También aparecen dos novedades: OCCURS, que crea una tabla (lo que en otros lenguajes es un array), y PERFORM VARYING, que es el bucle for de COBOL.

Leer un archivo

El trabajo típico de COBOL es leer un archivo de registros, hacer cuentas y escribir un resumen. Este archivo ventas.txt tiene cada campo en una posición fija: la fecha en las columnas 1 a 10, el producto en las 11 a 29, la cantidad en 4 cifras y el precio en 9 cifras, las dos últimas decimales:

2026-10-01Teclado            0002000049999
2026-10-01Raton              0005000012950
2026-10-02Monitor            0001000389900
2026-10-03Cable USB-C        0010000008999

El programa que lo lee usa por primera vez la ENVIRONMENT DIVISION, para decir qué archivo es, y la FILE SECTION, para describir cómo es cada registro:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. VENTAS.
      *> Lee ventas.txt y calcula el total de cada linea y del dia.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT ARCH-VENTAS ASSIGN TO "ventas.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD  ARCH-VENTAS.
       01  VENTA.
           05  V-FECHA      PIC X(10).
           05  V-PRODUCTO   PIC X(19).
           05  V-CANTIDAD   PIC 9(4).
           05  V-PRECIO     PIC 9(7)V99.
       WORKING-STORAGE SECTION.
       01  FIN-ARCHIVO      PIC X           VALUE "N".
       01  IMPORTE          PIC 9(9)V99.
       01  TOTAL            PIC 9(9)V99     VALUE ZERO.
       01  IMPORTE-ED       PIC $$$,$$$,$$9.99.
       01  TOTAL-ED         PIC $$$,$$$,$$9.99.
       PROCEDURE DIVISION.
           OPEN INPUT ARCH-VENTAS
           PERFORM UNTIL FIN-ARCHIVO = "S"
               READ ARCH-VENTAS
                   AT END
                       MOVE "S" TO FIN-ARCHIVO
                   NOT AT END
                       COMPUTE IMPORTE = V-CANTIDAD * V-PRECIO
                       ADD IMPORTE TO TOTAL
                       MOVE IMPORTE TO IMPORTE-ED
                       DISPLAY V-PRODUCTO V-CANTIDAD " x"
                               IMPORTE-ED
               END-READ
           END-PERFORM
           CLOSE ARCH-VENTAS
           MOVE TOTAL TO TOTAL-ED
           DISPLAY "Total de las ventas:     " TOTAL-ED
           STOP RUN.
SalidaTeclado            0002 x       $999.98
Raton              0005 x       $647.50
Monitor            0001 x     $3,899.00
Cable USB-C        0010 x       $899.90
Total de las ventas:          $6,446.38

Las piezas nuevas:

  • SELECT … ASSIGN TO conecta un nombre interno (ARCH-VENTAS) con el archivo real. LINE SEQUENTIAL significa un archivo de texto con una línea por registro, el más cómodo en un ordenador personal.
  • FD (descripción de archivo) dibuja el registro campo a campo. No hay que separar nada: al leer una línea, cada campo se rellena según su posición.
  • OPEN, READ y CLOSE abren, leen línea a línea y cierran. AT END se ejecuta cuando ya no quedan líneas, y con él se marca el final del bucle.

Los errores típicos

Los mensajes de GnuCOBOL están en inglés y señalan la línea con un >. Estos son los que más vas a ver al empezar, tal como salen.

Falta un punto

Se ha olvidado el punto después de PROGRAM-ID. HOLA:

cobc -x e1-punto.cobe1-punto.cob:3: error: syntax error, unexpected PROCEDURE
    1 |        IDENTIFICATION DIVISION.
    2 |        PROGRAM-ID. HOLA
    3 >        PROCEDURE DIVISION.
    4 |            DISPLAY "Hola, mundo".
    5 |            STOP RUN.
[código de salida 1]

El error se marca en la línea siguiente a la que tiene el fallo: el compilador seguía esperando el final de la frase y se encontró PROCEDURE. Cuando un error no tenga sentido en su línea, mira la de arriba.

Un nombre mal escrito

cobc -x e3-nombre.cob: se declaró TOTAL y se escribió TOTLe3-nombre.cob:7: error: 'TOTL' is not defined
    5 |        01  TOTAL     PIC 9(5)   VALUE 250.
    6 |        PROCEDURE DIVISION.
    7 >            DISPLAY "Total: " TOTL.
    8 |            STOP RUN.
    9 | <EOF>
[código de salida 1]

Es el más fácil: is not defined quiere decir que esa variable no está en la DATA DIVISION.

Unas comillas sin cerrar

cobc -x e5-comillas.cob: falta la comilla de cierre en DISPLAYe5-comillas.cob:5: error: continuation character expected
    3 |        PROCEDURE DIVISION.
    4 |            DISPLAY "Hola, mundo.
    5 >            STOP RUN.
    6 | <EOF>
e5-comillas.cob:4: error: invalid literal: 'Hola mundo.  ...'
    2 |        PROGRAM-ID. HOLA.
    3 |        PROCEDURE DIVISION.
    4 >            DISPLAY "Hola, mundo.
    5 |            STOP RUN.
    6 | <EOF>
e5-comillas.cob:4: note: missing terminating " character
e5-comillas.cob:4: warning: optional period used [-Wdialect]
[código de salida 1]

Varios mensajes para un solo fallo; el que importa es la nota missing terminating » character. En COBOL un texto no puede seguir en la línea siguiente sin más: para continuarlo hace falta un guion en la columna 7, la de indicador.

Código pegado sin los espacios

Si copias un programa de una web o de un PDF y se pierden los espacios del principio, GnuCOBOL 3.2 se da cuenta y lo trata como formato libre:

cobc -x e2-columnas.cob (sin espacios al principio)e2-columnas.cob:1: note: free format detected
    1 > IDENTIFICATION DIVISION.

Funciona, pero los compiladores del mainframe no hacen esa deducción. Si fuerzas el formato fijo con -fformat=fixed, verás lo que pasaría allí: cada línea toma su séptima letra por el indicador y la rechaza.

cobc -x -fformat=fixed e2-columnas.cob (primer error de seis)e2-columnas.cob:1: error: invalid indicator 'F' at column 7
    1 > IDENTIFICATION DIVISION.

Algo que pasa de la columna 72

Este es el error más traicionero, porque no da ningún error. En esta línea, el + 25 quedó a partir de la columna 73:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. COL73.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  PRECIO    PIC 9(5)V99 VALUE 100.
       01  PRECIO-ED PIC ZZ,ZZ9.99.
       PROCEDURE DIVISION.
           COMPUTE PRECIO = PRECIO * 1.16                               + 25
           MOVE PRECIO TO PRECIO-ED
           DISPLAY "Precio final: " PRECIO-ED
           STOP RUN.
cobc -x e4-col73.cob && ./e4-col73Precio final:    116.00

El precio debería ser 141 (100 × 1.16 + 25), pero el compilador ignoró todo lo que hay más allá de la columna 72 y calculó solo 100 × 1.16. Ni siquiera -Wall lo avisa: hace falta -W, que activa todos los avisos, incluidos algunos muy pesados:

cobc -x -W e4-col73.cob (primer aviso)e4-col73.cob:8: warning: source text after program-text area (column 72) [-Wdangling-text]
    6 |        01  PRECIO-ED PIC ZZ,ZZ9.99.
    7 |        PROCEDURE DIVISION.
    8 >            COMPUTE PRECIO = PRECIO * 1.16                               +..
    9 |            MOVE PRECIO TO PRECIO-ED
   10 |            DISPLAY "Precio final: " PRECIO-ED

La mejor defensa es el editor: con una línea vertical en la columna 72, lo verás antes de compilar.

Un número que no cabe al calcular

Ya viste que lo que no cabe se corta sin avisar. Al calcular, COBOL permite atrapar ese caso con ON SIZE ERROR:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. DESBORDE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  UNIDADES  PIC 99       VALUE 95.
       PROCEDURE DIVISION.
           ADD 10 TO UNIDADES
               ON SIZE ERROR
                   DISPLAY "No cabe: UNIDADES sigue en " UNIDADES
               NOT ON SIZE ERROR
                   DISPLAY "Ahora hay " UNIDADES
           END-ADD
           ADD 10 TO UNIDADES
           DISPLAY "Sin ON SIZE ERROR: " UNIDADES
           STOP RUN.
SalidaNo cabe: UNIDADES sigue en 95
Sin ON SIZE ERROR: 05

Con ON SIZE ERROR, la suma que no cabe no se hace y el programa puede reaccionar. Sin él, 95 + 10 se queda en 05, sin ningún aviso. En un programa que maneja dinero, cualquier cálculo que pueda desbordarse debería llevarlo.

Del ordenador al mainframe

Con lo anterior ya sabes leer y escribir COBOL. Pero el COBOL que se usa en los bancos, las aseguradoras y las administraciones corre en mainframes de IBM con el sistema z/OS, y allí el lenguaje viene acompañado de un entorno con sus propias herramientas:

Equivalencias entre programar COBOL en un ordenador con GnuCOBOL y en un mainframe con z/OS: el archivo hola.cob es un miembro de un data set; compilar con cobc es enviar un trabajo JCL; ejecutar es otro paso del JCL o una transacción CICS; los archivos de texto son data sets, VSAM o tablas de Db2; y la terminal es ISPF en un 3270 o VS Code con ZoweDe tu ordenador al mainframe: lo mismo, con otros nombresEn tu ordenador (GnuCOBOL)En el mainframe (z/OS)el códigohola.cob, en una carpetaun miembro de un data set (PDS)compilarcobc -x hola.cobun trabajo JCL con Enterprise COBOLejecutar./holaotro paso del JCL, o una transacciónlos datosarchivos de textodata sets, VSAM y tablas de Db2la pantallala terminal y VS CodeISPF en un 3270, o VS Code y ZoweEl lenguaje es el mismo; lo que hay que aprender aparte es el entorno de la derecha.

Lo que haces con GnuCOBOL en tu ordenador y cómo se llama lo mismo en un mainframe. Esquema: decodigo.com.
  • z/OS es el sistema operativo de los mainframes de IBM. No hay carpetas como en Windows: los archivos se llaman data sets y tienen nombres como USUARIO.COBOL.FUENTES.
  • JCL (Job Control Language) es el lenguaje con el que se pide al sistema que haga un trabajo: compila este programa, ejecútalo con estos archivos y guarda el resultado allí. Cada programa COBOL que se ejecuta por lotes va acompañado de su JCL.
  • CICS es el programa que gestiona las operaciones en tiempo real: cuando sacas dinero de un cajero, un programa COBOL que corre dentro de CICS atiende la petición.
  • Db2 es la base de datos de IBM. Los programas COBOL le hacen consultas SQL escritas dentro del propio código.
  • VSAM es un tipo de archivo indexado, para buscar un registro por su clave sin leerlos todos.

No hace falta comprar nada para practicar con todo esto. Hay dos opciones gratuitas con acceso a un mainframe real:

  • IBM Z Xplore: retos gratuitos, sin conocimientos previos, que se hacen desde VS Code. Cubren JCL, COBOL, REXX, VSAM, Db2, Python y la parte Unix de z/OS, y dan insignias digitales que se pueden poner en el currículum.
  • El curso de COBOL del Open Mainframe Project, de la Linux Foundation, creado con IBM y el American River College: cuatro libros (primeros pasos, el lenguaje, temas avanzados y pruebas) con ejercicios, y un entorno interactivo para hacerlos. Se sigue con VS Code, Zowe Explorer e IBM Z Open Editor, y tiene versión en vídeo en Coursera y YouTube.

Una ruta para aprender

  1. Semanas 1 y 2, el lenguaje en tu ordenador. Con GnuCOBOL, repite los programas de esta guía y cámbialos: variables, PIC, IF y EVALUATE (el switch de COBOL), PERFORM con párrafos y bucles.
  2. Semanas 3 y 4, archivos y tablas. Leer y escribir archivos de registros, OCCURS, ordenar con SORT, informes con totales por grupo y COPY para compartir la descripción de un registro entre programas.
  3. Segundo mes, el mainframe. Empieza IBM Z Xplore o el curso del Open Mainframe Project: data sets, JCL y compilar en z/OS. Lo que ya sabes del lenguaje te servirá tal cual.
  4. Después, lo que pida el trabajo. CICS y Db2 son los más demandados en banca. Leer programas ajenos grandes y entender su JCL es la habilidad que más se valora: en COBOL se mantiene mucho más código del que se escribe desde cero.
El lenguaje es lo fácil. En unas semanas puedes escribir COBOL correcto; lo que distingue a quien trabaja con él es conocer el entorno del mainframe y saber moverse por programas de miles de líneas escritos por otros hace décadas. Por eso conviene pasar pronto de GnuCOBOL a uno de los entornos gratuitos con mainframe real.

Resumen

  • Para empezar: GnuCOBOL 3.2 (apt, dnf, brew, o WSL y MSYS2 en Windows) y VS Code con una extensión de COBOL.
  • Para compilar: cobc -x -Wall programa.cob, y -W de vez en cuando para cazar lo que pasa de la columna 72.
  • Para no equivocarte: las instrucciones, de la columna 12 a la 72; un punto al final de cada encabezado; y ON SIZE ERROR en los cálculos que puedan desbordarse.
  • Para trabajar: el entorno del mainframe (z/OS, JCL, CICS y Db2), que se practica gratis con IBM Z Xplore y el curso del Open Mainframe Project.

Todos los programas y mensajes de esta guía se compilaron y ejecutaron el 27 de octubre de 2026 con GnuCOBOL 3.2 en Fedora 43, en un contenedor. Fuentes: GnuCOBOL; paquetes de Debian, Homebrew y MSYS2; instalación de WSL; IBM Z Xplore; curso del Open Mainframe Project. Portada: terminal IBM 3279, foto de Patrick Finnegan, licencia CC BY 2.0, Wikimedia Commons.