JmMzF 1024x687

Compilar, enlazar, encolar y rezar: la épica de programar en RPG cuando no existía el «F5» para ejecutar

Alguna vez tuviste que explicarle a un junior que «depurar» antes no era hacer clic en un punto rojo, sino buscar un número de línea en un volcado de pantalla verde y negro?

Si eres de los que sudaron la gota gorda con un IBM AS/400, una terminal 5250 y el mítico editor SEU, esto te va a resonar.

No todo fue arrastrar un cursor. No había ratón. No había pestañas. Tampoco «autocompletado» mágico. Había columnas: la 7 para el indicador, la 8-15 para las etiquetas, la 16-19 para el código de operación, y de la 40 en adelante, sufriendo porque el compilador no perdonaba ni un espacio.

Así se hacían las cosas. Y funcionaban.

En un AS/400 (o IBM i para los modernos), compilar un programa RPG no era apretar un botón. Era:

  1. Escribir el código en SEU (Source Entry Utility), respetando las columnas como si tu vida dependiera de ello.
  2. Guardar en un miembro de archivo fuente (sí, un miembro, no un archivo suelto).
  3. Ejecutar el comando CRTRPGMOD o CRTBNDRPG (si eras atrevido).
  4. Rezar para que no saliera el temido mensaje: «Keyword not valid. Position 43.»

¿Qué había si fallaba? Un spooled file con errores que tenías que leer línea por línea, número de secuencia por número de secuencia.

¿Depurar? Eso era STRDBG, poner breakpoints en modo texto y mirar cómo cambiaba el valor de una variable en tiempo real. Si no tenías suerte, DSPLY a lo bestia por todas partes y a correr.


Y LUEGO: LINKAR LIBRERÍAS, SÍ, COMO EN LOS 80

¿Crees que el package.json o el go.mod son complicados? A ver, dame tu biblioteca de servicios, encadénala con la de procedimientos externos, no olvides el binding directory y asegúrate de que el activation group sea el correcto si no quieres que todo explote en tiempo de ejecución.

Comando típico:

rpg

CRTPGM PGM(MIPROG/MIAPP) MODULE(MIPROG/MOD1 MIPROG/MOD2)
BNDSRVPGM(QTEMP/MISERVICIOS)

¿Un error de enlace? El sistema te devuelve algo críptico como «CPF2813 – Service program not found». Y tú ahí, sudando, revisando si la librería está en el LIBL (lista de bibliotecas), si el servicio tiene export correcto, si el signature coincide…

Eso no lo enseñan en Platzi.


MANDAR A LA COLA DE TRABAJOS: LA VERDADERA MAGIA

En un sistema moderno llamas una API y punto.

En IBM i, si querías hacer algo en batch, lo mandabas a una cola de trabajos (job queue). Y ahí comenzaba otra religión:

text

SBMJOB CMD(CALL PGM(MIPROG/PROCESO)) JOBQ(QBATCH)

Y después… a mirar.

  • ¿Está en JOBQ?
  • ¿Pasó a ACTIVE?
  • ¿Está OUTQ lleno de reportes?
  • ¿El trabajo falló con CPF9999?
  • A correr DSPJOB y rezar que el job log no tenga 500 mensajes.

Los más brutos (yo incluido) vivíamos con WRKACTJOB abierto en una segunda sesión 5250. Ver tu trabajo ahí, corriendo, era como ver a tu hijo caminar por primera vez.


LA SANGRE EN LA PANTALLA VERDE

Y cuando tu programa compilaba sin errores, enlazaba bien, corría en lote y producía el reporte esperado…

Te sentías el rey del mundo.

Porque no todo fue dragg & drop. Hubo un tiempo donde programar era:

  • Leer un data area con IN
  • Escribir en pantalla con DSPF y manejar indicadores del 01 al 99
  • Hacer CHAIN a un archivo físico con llaves compuestas
  • Manejar el *IN99 para salir de un loop infinito
  • Y entender por qué el SETON LR era más importante que tu propia vida

¿DÓNDE SIGUEN VIVOS?

Hoy, mires donde mires, hay un RPG latiendo:

  • En los cajeros automáticos de bancos grandes.
  • En las facturas que genera tu supermercado.
  • En el control de tráfico aéreo de países enteros.
  • En la logística de envíos internacionales.

Sistemas modernos conectan vía REST APIs a esos monstruos de RPG que llevan 30 años funcionando sin reiniciarse. Porque un AS/400 no se apaga. No se bloquea. No te hace un segmentation fault.

Un programa RPG bien hecho puede estar corriendo desde antes de que nacieras.

Un pequeño ejemplo que hará llorar (de emoción) a más de uno:

RPGIII puro y duro – cálculo de pagos atrasados con intereses

rpg

FARCHIVO1 IF  E           K DISK
FPAGOS    O   E             PRINTER

C           *IN01   DOUEQ *OFF
C                     READ ARCHIVO1
C           *IN01   IFEQ *ON
C                     LEAVE
C                     END
C                     Z-ADD AR-MORA   MORAX
C                     Z-ADD AR-SALDO   SALDOX
C                     MULT MORAX      TASA     INTERES
C                     DIV 1000        TASA     
C                     ADD INTERES     SALDOX
C                     MOVE '*PAGO ATRASADO'    TIPOCLI
C                     EXCPTPAGOS
C                     ENDDO
C                     SETON                     LR

(Sí, las operaciones matemáticas iban con códigos de solo dos letras. Y te sabías todos de memoria.)


CIERRE CON EMOJI Y GARRA

Así que sí, amigo mío: Hoy uso VS Code, TypeScript, Kubernetes y mil cosas más.

Pero cuando alguien me pregunta «¿qué es programar de verdad?», yo sonrío, abro mi emulador 5250, me conecto a PUB400, y escribo un CRTBNDRPG con la misma emoción del primer día.

Porque programar era difícil. Y eso nos hacía grandes.

¿Alguien más guarda todavía un listado de RPG impreso en papel continuo? ¿O se sabe de memoria el CPYF y el OVRDBF?

Te espero en los comentarios. Y si lloraste un poco, no te preocupes. Es solo el RPG que llevas dentro.

Jose Antonio Alvarez Weingartt
Scroll al inicio