Por necesidades del proyecto en el que trabajo he pasado del mundo Eclipse, Java, Spring, Hibernate, Maven y Subversion al mundo COBOL/CICS/DB2. ¿Qué si se nota la diferencia? No, no he notado apenas diferencias a la hora de desarrollar (modo ironia ON).

Os daré mi visión general de cómo se desarrolla en este lenguaje y lo compararé con el desarrollo con Eclipse.  Esta destinado para que el programador que no tenga ni idea de Cobol pueda hacerse una pequeña idea (Dios mio no siento las piernas!!!). Perdonad todos los coboleros por mis explicaciones de este lenguaje porque no llevo mucho tiempo con él y apenas se hacer nada.









Primer programa


Escribir un programa en Java que escriba ‘Hola Mundo’ por pantalla es relativamente sencillo. Te creas una clase Java, con un método main y escribes una línea System.out.println (“Hola Mundo”). Luego ejecutas tu mini-programa desde Eclipse/NetBeans con tu JRE y en la ventana Output de Eclipse te sale tu mensajito. 

En COBOL, es un poquitín más complicado. Para comenzar tiene un entorno de desarrollo más tedioso en el que tienes que moverte casi siempre con teclado. Crear, editar, borrar, copiar y pegar programas se hace de forma similar al ultraconocido vi de Unix. Te puedes hacer dos tipos de programa y siempre lo tienes que indicar en la cabecera: ONLINE o BATCH.

  • ONLINE son programas que se utilizan para interactuar con el usuario. Ejemplo: Se arranca una transacción que arranca el programa A. El programa A envía un mapa (ventana tipo formulario) y termina el programa (aunque no la Tx). El usuario rellena la información y cuando la introduce se vuelve a reanudar la Tx anterior, lanzándose de nuevo el programa A. El programa recibe el mapa y procesa los datos del usuario realizando la lógica oportuna.
  • BATCH son programas que se ejecutan background sin necesidad de interactuar con el usuario. Se lanzan desde un archivo JCL, que es un archivo en el que se definen una serie de pasos o acciones mediante un lenguaje de script (parecidos a los scripts UNIX). Aparte de lanzar los programas que creamos mediante JCL, normalmente tendremos disponibles una serie de programas útiles que podemos definir en nuestros JCLs para copiar, crear y borrar ficheros, acceder a BBDDs, transformar ficheros, ect…


Al igual que en Java todos son objetos y se ejecutan mediante un entorno controlado que es la JVM, en una máquina Mainframe hay un sistema operativo (ej.: z/OS) que se encarga de lanzar transacciones que se corresponden con la ejecución de uno o más programas realizados en COBOL. Cada Tx. tiene asociada una cola que será la que gestiona la ejecución de esa Tx.


Pienso que la forma más fácil de escribir un ‘Hola Mundo’ en COBOL es crear un programa BATCH que tenga la estructura básica obligatoria con un párrafo (son como procedimientos o bloqués de código con nombre) que haga un DISPLAY (como el System.out). Luego crearemos un JCL que lance este programa, los submitimos(jaja, ejecutamos vamos)  y listo. En definitiva, más líneas de código y dos elementos  (JCL y Programa BATCH).



Estructura de programa


Si en un programa Java típico tendríamos clases, cada una de ellas con atributos con tipos determinados y métodos con una interfaz determinada, en Cobol un programa tiene una estructura dividida en secciones obligatoria, cada una de ellas con un fin:

  • IDENTIFICATION DIVISION, donde se describe el nombre del programa, el autor, fecha creación….
  • ENVIRONMENT DIVISION. Datos referentes a la máquina donde se escribe el programa. Tiene una subsección llamada INPUT-OUTPUT-SECTION donde se definen por ejemplo los ficheros que se utilizan en el programa y tipos de ficheros.
  • CONFIGURATION SECTION

    • FILE SECTION. Se define el nombre lógico de los ficheros de la INPUT-OUTPUT-SECTION indicando el tipo de fichero, su acceso y la COPY asociada a su estructura.
    • WORKING-STORAGE-SECTION. Variables de trabajo que utiliza el programa. Se borran una vez que finaliza la Tx. asociada.
    • LINKAGE-SECTION. Variables que se utilizan para la comunicación con otros programas de otras Tx. 

  • PROCEDURE DIVISION. Se definen los bloques de código de los que consta el programa.
Mientras que en un programa java la información entre un objeto A y otro B se pasaría mediante un mensaje tipo B.metodo(a,b), en COBOL deberíamos rellenar los datos de a y b en la LINKAGE SECTION mediante una copy (EST-AB) y el programa A llamaría al PROGRAMA B mediante la sentencia LINK (misma TX) o XCTL (diferente Tx) indicando la COPY que se utiliza para llamar al programa B (EST-B). 

Para la comunicación entre programas también se pueden utilizar las colas. Hay dos tipos de cola, colas TD (que son generales a todos los programas y de solo lectura) y colas TS (que se pueden crear desde los programas y son de lectura/escritura).

Normalmente cuando queremos trabajar con una estructura de datos en un programa COBOL definimos COPYS, que son ficheros en los que se define un conjunto de campos con una longitud y tipos determinados y luego hacemos un INCLUDE de esa COPY en el programa. En Java lo que haríamos sería crear una clase diferente y luego incluir esta clase con una relación de clientela.

Tipos

En Java hay muchos tipos predefinidos en la JRE tipos numericos (int, double, long…), cadenas (String), colecciones (Stack, List, Vector…), recursos (File, Socket,… ) además podemos crear tipos personalizados creando clases.

En COBOL, los campos pueden ser o PIC X (alfanumérico) o PIC 9(numérico) indicando entre paréntesis la longitud que ocupa el mismo.

  • PIC 9(2). Campo numérico de 2 caracteres.
  • PIC(X). Carácter alfanumérico.
Simplemente esto, aunque se pueden crear tipos numéricos comprimidos (COMP-3), formateados (Z), numericos con decimales sin signo y con signo… En general es esto. Las listas de elementos se pueden crear con la palabra OCCURS:

01 ESTRUCTURA_PROGRAMA.
      05 CAMPO-LISTA OCCURS 4 TIMES.          
            10 CAMPO1     PIC X.
            10 CAMPO2     PIC 9.

CAMPO-LISTA es una lista de 4 elementos formados por campo1 y campo2.



Entorno de desarrollo

Hay múltiples entornos de desarrollo en Java (IDE, NetBeans, Intelligent Idea, JBuilder…). En COBOL desconozco si hay muchos o pocos y lo que se puede hacer con cada unos de ellos, aunque me imagino que todos serán similares. Aquí tenemos uno en el que se puede:

  • Crear, modificar y borrar fuentes Cobol y mapas. (¿Eclipse? ¿UltraEdit?, ¿dónde estáis?, os necesito). Mucho teclado y teclas F1..F12, como los frikis.
  • Realizar la compilación de fuentes y mapas. Compilar es fácil pero compilar un programa sin errores es tarea harto difícil. Si acabarás de conocer al compilador de COBOL se presentaría diciéndote: ‘Hola soy el compilador de COBOL y te voy a joder la vida…‘. Se queja hasta por la columna en la que defines una sentencia. Es muy importante que cada sección y cada sentencia esté en su sitio, obligando al programador a dejar todo atado y  bien atado.
  • Utilidades para la gestión de ficheros.
  • Utilidades para el manejo de DB2. Bendito TOAD, cuanto te echo de menos!!! 

En general los fuentes COBOL están en librerías, mientras que los fuentes java se encuentran en paquetes. Agrupaciones lógicas al final. Cuando se compilan los fuentes Java se generan .class que pueden empaquetarse en .JAR. En COBOL cuando se compilar los fuentes, copys, mapas, rutinas, ect.. se crean ficheros con todo el código linkado  y se dejan el librerías especiales para que luego puedan ser ejecutadas correctamente. 



Ficheros

Utilizar un fichero en código Java es muy sencillo. Con una línea de código podemos comenzar a leer o escribir de un fichero:

BufferedReader in = new BufferedReader(new FileReader(“foo.in”));



Sin embargo en COBOL tenemos que hacer varias cosas:

  • Primero tenemos que definir el tipo de ficheros y nombre lógico en el programa en la ENVIRONMENT-SECTION.
  • Tenemos que asignar la estructura del fichero (mediante una copy por ejemplo) y asignarla al fichero, además de indicar el tipo de fichero en la sección DATA-DIVISION.
  • Definir los ficheros (de entrada o salida) en el JCL que lance el programa que utiliza los ficheros. Aquí es donde se indicará la ruta física de los ficheros.
Hay varios tipos de ficheros: aleatorios (acceso aleatorio), secuenciales (acceso secuencial) y ficheros VSAM (acceso por clave). En programas BATCH se puede acceder a todos los tipos de ficheros mientras que en programas ONLINE se suelen utilizar sólo los VSAM. Además, a los ficheros VSAM se accede de forma diferente desde programas ONLINE y BATCH.



Bases de datos

En Java se utilizan los drivers JDBC para acceder a todas las diferentes bases de datos. Se accede mediante un objeto DataSource pasando una cadena de conexión de una BBDD o mediante JNDI obteniendo un DataSource desplegado en un servidor de aplicaciones.

El acceso de los programas COBOL a BBDDs se resume a DLI y DB2.

  • DLI es una ¿base de datos? jerárquica. Es bastante antigua. Se divide de forma jerárquica (árbol) donde cada nodo hoja es un segmento. Cada segmento contiene una información determinada y tiene un nodo padre menos el nodo raíz. Para acceder a una información puede que tengamos que recorrer varios segmentos antes de llegar a ella.
  • DB2. Otra base datos bastante antigua. 


Desarrollo gráfico

En entorno Java hay muchos frameworks para desarrollar aplicaciones gráficas tanto web como de escritorio (JavaFX, JSF, GWT, ZK… ). Dichos frameworks permiten realizar ventanas complejas con una gran diversidad de controles gráficos diferentes.

 En COBOL, las aplicaciones gráficas están basadas en pantallas de 24 líneas de 80 caracteres y no hay más (el CICS).

Hay herramientas para definir las etiquetas y campos de los mapas y definir en qué posición va cada cosa. La comunicación con los programas se realiza mediante colas y COMMAREAS y con las sentencias SEND / RECEIVE



Definición de mapa COBOL



Control de versiones y pases a producción

En desarrollo Java (y en cualquier lenguaje) normalmente hay un programa de control de versiones (SourceSafe, CVS, Subversion, GIT…) para controlar las diferentes versiones de la aplicación que estamos generando, coordinar los cambios de todos los programadores y saber quién ha hecho qué cosa y cuándo. También suele existir una herramienta de integración continua (CruiseControl, Hudson, Jenkins…) que se encarga gestionar todo el ciclo de vida de las aplicaciones, desde empaquetado de la aplicación hasta su despliegue en los diferentes entornos. 

En CICS, al menos aquí, no hay control de versiones. Hay entornos y se hacen copias de seguridad de todos los elementos del código en producción. Si estás en desarrollo puedes meter la mata y perder alguna que otra hora de trabajo.



Conclusiones

En definitiva, aunque COBOL (Common Business Oriented Language) se creó en 1959 y se haya sustituido en muchos casos por entornos PCs con aplicaciones visuales, todavía sigue teniendo buena salud en entornos bancarios. Se creo en una época en que la compatibilidad entre los diferentes sistemas no era la mejor y tenía una característica clave para su éxito, era fácil de entender programas codificados en COBOL hasta para una persona que no era programadora. Hoy en día por ejemplo, se sigue utilizando hasta en un 70% de las transacciones del Reino Unido.



Salu2. Jose.