La Página de DriverOp

RM/COBOL RM/COBOL 85

Contenido.

Programas código fuente incluido en RM/COBOL-85 (Ver. 5.36).

Descripción Descarga
RM/COBOLDos programas para manejar fechas, 'fromdate' devuelve la fecha actual del sistema pero con el año a cuatro cifras, especial para versiones de RM/Cobol anterior al Y2K, 'validar' verifica que una fecha sea válida y de serlo devuelve la cantidad de dias que hay entre la fecha actual y la validada. fechas.zip (5,3 Kb)

Estructura general de un fuente COBOL.

Un fuente de COBOL está separado en cuatro divisiones, cada una de ellas tiene un propósito específico. Las divisiones están ordenadas en secciones y las secciones en párrafo. Cada división y sección contiene un ámbito, es decir, no se pueden mezclar secciones que pertenecen a una división en otra y las divisiones no pueden estar desordenadas.

IDENTIFICATION DIVISION.

En esta división se declaran todos los datos identificatorios del programa en sí, como ser el autor, el nombre interno del programa, los comentarios, etc... En esta división que es obligatoria la única sección obligatoria es PROGRAM-ID seguido del nombre interno del programa, por ejemplo

Código:

IDENTIFICATION DIVISION.
PROGRAM-ID. HOLAMUND.
ENVIRONMENT DIVISION.

En esta sección se declaran entre otras cosas los encabezados de los archivos de datos usando una sección llamada INPUT-OUTPUT SECTION, párrafo FILE CONTROL.

Un ejemplo:

        ENVIRONMENT DIVISION.
        INPUT-OUTPUT SECTION.
        FILE-CONTROL.
            SELECT OPTIONAL CLIENTES ASSIGN RANDOM, 
            "CLIENTES.DAT"
            ORGANIZATION IS INDEXED
            ACCESS MODE DYNAMIC
            RECORD KEY CODIGO-CLIENTE
            ALTERNATE RECORD KEY CUIT WITH DUPLICATES
            ALTERNATE RECORD KEY NOMBRE-APELLIDO WITH DUPLICATES.

En este ejemplo he declarado un archivo con nombre lógico CLIENTES y nombre físico "clientes.dat" con acceso random (si el sistema operativo lo permite), la organización interna sera indexada (hay que mantener índices) el modo de acceso será dinámico (en COBOL significa que se puede leer secuencialmente o aleatoriamente usando cualquiera de los índices declarados a continuación). La clave principal del archivo es CODIGO-CLIENTE y tiene dos claves secundarias.

Esta división se puede omitir.

La tercera división es DATA DIVISION.

En esta división se declaran las variables del programa, los encabezados de los archivos de datos, la estructura de registros del mismo, las tablas en memoria y las constantes.

Hay dos secciones importantes en esta división, la primera es la FILE SECTION, en ella se declaran todos los registros que pertenecen a los archivos delcarados en el párrafo FILE-CONTROL de la sección INPUT-OUTPUT de la división ENVIRONMENT.

La otra sección es WORKING-STORAGE SECTION, en esta se declaran las variables, constantes y tablas. Todas las variables en COBOL-85 son globales. Siguiendo con el ejemplo anterior:

        DATA DIVISION.
        FILE SECTION.
        FD CLIENTES BLOCK 250 CHARACTERS
            RECORD 250 CHARACTERS
            LABEL RECORD STANDARD.

            01 CLIENTE.
              02 CODIGO-CLIENTE PIC 9(5).
              02 CUIT PIC X(11).
              02 NOMBRE-APELLIDO.
                03 NOMBRE PIC X(30).
                03 APELLIDO PIC X(30).
        WORKING-STORAGE SECTION.
        77 ESPERA PIC X.
        77 TECLA PIC 99.
        77 FLAG PIC X.

En COBOL existen tres tipos de datos principales, numéricos, alfanuméricos y alfabéticos, los primeros se indican con un 9() en la declaración, los segundos con X() y los terceros con A().

La sintaxis de la declaración es:

        NIVEL IDENTIFICADOR PICTURE TIPO-DE-DATO.

Donde NIVEL es un número entre el 1 y el 88 e indica la "profundidad" de la variable. Las variables entre los niveles 1 y 49 indican que se trata de una estructura de datos siendo la de mayor nivel el 01 (como se ve en la declaración del registro de cliente) esto significa que se puede referenciar un conjunto de datos con un solo identificador. Las variables de nivel entre 77 y 87 son variables independientes. Los identificadores de nivel 88 son constantes y se declaran obligatoriamente como sigue:

        88 ESTO-ES-UNA-CONSTANTE PIC 9(3) VALUE 100.

La cláusula VALUE indica qué valor tomará la constante. En los identificadores de los otros niveles también se puede usar la cláusula VALUE para inicializalos a algún valor (sin embargo no se permite esta cláusula en la declaración de registro de archivos).

Las variables en COBOL se almacenan en formato BCD (código decimal binario) es decir, en base 10 y ocupan un byte por cada espacio de memoria; el rango de valores está dado por la propia definición, por ejemplo.

        77 NOMBRE PIC X(20).

Ocupa 20 bytes en memoria *sin importar qué contenga la variable*. Para el caso de los datos numéricos (PIC 9()) también sucede lo mismo.

Por ejemplo:

        77 NUMERO-ENTERO PIC 9(3).

Ocupa 3 bytes y puede almacenar un valor entre cero y 999. Si se le asigna un valor que excede el rango permitido por la declaración el valor se trunca por la izquierda en su valor literal, por ejemplo:

            MOVE 1000 TO NUMERO-ENTERO.

Aquí NUMERO-ENTERO tomará el valor cero.

Es posible declarar variables de tipo numérico real sin signo como sigue:

        77 NUMERO-REAL-SIN-SIGNO PIC 9(3)V99.

La "V" indica la posición de la coma decimal.

También es posible declarar un tipo numérico real con signo como sigue:

        77 NUMERO-REAL-CON-SIGNO PIC S9(3)V99.

La "S" indica que se debe reservar un lugar para almacenar el signo.

El largo de los identificadores es ilimitado pero solo los primeros 30 caracteres son significativos. No pueden comenzar con números pero sí contenerlos, todas las letras son válidas más el guión.

Finalmente tenemos la PROCEDURE DIVISION.

Que es la división donde se escribe la parte "ejecutable" del programa. No está dividida en secciones sino en párrafos. Cada párrafo tiene un identificador único asignado por el usuario. Toda PROCEDURE DIVISION debe tener al menos un párrafo. Por ejemplo:

        PROCEDURE DIVISION.
        COMIENZO.
           ...sentencias...

Los nombres de párrafos son arbitrarios y sirven como puntos de saltos dentro del programa.

Ahora sí podemos crear un programa bien básico, este es el código:

        IDENTIFICATION DIVISION.
        PROGRAM-ID. HOLAMUND.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
        77 ESPERA PIC X.
        77 TECLA PIC 99.
        PROCEDURE DIVISION.
        COMIENZO.
            DISPLAY "Hola mundo!, por favor presiona una tecla".
            ACCEPT ESPERA NO BEEP ON EXCEPTION TECLA NEXT
            SENTENCE.
            DISPLAY "La tecla que presionaste fue: ".
            DISPLAY TECLA.
            EXIT PROGRAM.
            STOP RUN.

Después de mi explicación espero que les resulte obvio lo que hace este programa.

Reflexiones acerca de COBOL.

COBOL es, por llamarlo de alguna manera "el decano de los lenguajes de bases de datos", de hecho su nombre ya determina cuál es su uso principal, COBOL, COmmon Business Oriented Languaje, es decir, Lenguaje Común Orientado a Negocios, y todos sabemos que cualquier aplicación de negocios hace un uso intenso de bases de datos. COBOL nació allá por el año 1960 a raíz de una comisión organizada por el gobierno de EEUU y las principales empresas de la industria de la computación de aquella epoca tal como IBM, Rand y Honeywell, llamada CODASYL. La intención de esta comisión era establecer un estandar para un lenguaje orientado a los negocios, de allí nace el COBOL 60 asi como el ALGOL 60, un lenguaje orientado al calculo cientifico (del cual nacería Pascal). En 1968 otra comisión, esta vez la ANSI, revisa al COBOL y establece el estandar 68 que luego devino en el estandar 74, este último planteó muy acertadamente a mi juicio, la implementación de la programación procedimental al lenguaje COBOL (los PERFORM, bah). Finalmente, en 1985 la ANSI saca un nuevo estandar para el lenguaje que es el que rige actualmente (hubo algunas mejoras y afinamientos en 1989). Entre los grandes logros de este lenguaje pueden contarse que es el lenguaje que mas lineas en ejecución tiene en el mundo, ser el mas confiable para grandes aplicaciones de negocios y el lenguaje que mas plataformas soporta, siendo a la vez un estandar casi dogmatico a todos los niveles. Como curiosidad, el gobierno de EEUU a partir del nacimiento de COBOL estableció que para que un aparato electronico pueda llamarse computadora DEBE poder ejecutar un programa COBOL, es por eso que aparatos que hoy sabemos implicitamente que son computadoras, tal como los handheld, no llevan ese nombre pues no existen compiladores y/o interpretes de COBOL para esos aparatos. Quizas el mayor exito de COBOL sea su portabilidad a nivel de código fuente (y en algunos casos hasta de codigo ejecutable), el mismo fuente casi sin modificaciones puede ser llevado de un sistema operativo a otro y de una arquitectura a otra. El concepto de diseño de bases de datos que nació con COBOL hasta hoy en día es materia de estudio en universidades y muchas de ellas aún enseñan COBOL como lenguaje.

En 1990 IBM anunció tajantemente que declaraba a COBOL un lenguaje "muerto", eso significaba que ya nadie lo usaría en el futuro, también anunció que dejaría de dar soporte para él (y asi lo hizo, ese año IBM vendió su compilador a una empresa pequeña). Ironicamente poco después al lanzar su linea de minicomputadoras AS/400 incluyó COBOL como uno de los cuatro lenguajes estandar del mismo (junto con C, RPG y Pascal). Desde ese anuncio todo aquel que se declaraba "programador en COBOL" ha llevado el mote de "anticuado" y "sin futuro". Para empeorar las cosas el lanzamiento de sistemas operativos con entorno gráfico y la revolución de la programación orientada a objetos llevó casi a la extinción a COBOL, relegado unicamente a arcaicos mainframes y a oficinas de procesamiento de datos con un monton de "gurus" revolviendo fuentes con mas de 20 años. Parecia que finalmente COBOL tenia sus dias contados. Pero, las pequeñas empresas que aún se sostenian gracias a la venta y soporte de compiladores COBOL, tales como Liant, Accu y Fujitsu, se dieron cuenta de esto y cada uno por su lado empezó a transformar a COBOL en un lenguaje moderno, mas acorde a los tiempos que pasan. El mayor problema que debian enfrentar es la bendita compatibilidad hacia atrás y esto no es una cosa trivial para un lenguaje con casi 40 años de antigüedad en aquella época. Pero si bien estas empresas pusieron a COBOL en la primera linea otra vez surgió un problema nuevo, COBOL, como ya antes dije, sobresalia por su portabilidad, como cada empresa se las arregló a su manera destruyeron en pocos años lo que se habia logrado con decadas de minuciosos estandares y reuniones de empresas de la industria. Hoy en día, los modernos compiladores de COBOL, Objective Cobol, PowerCobol, WOW no son ni remotamente compatibles entre sí,  y algunos ni siquiera son multiplataforma. Para empeorar las cosas no hay intención, siendo Ocubre de 2001 cuando escribo esto, de volver a revisar a COBOL como lenguaje y establecer un estandar para la programación en entorno gráfico.

Todo esto me lleva a pensar que COBOL dejará de existir como tal y pasará a ser otra cosa, multitud de pseudocoboles surgirán, ya que ninguna empresa querrá tirar abajo lo que han desarrollado para apegarse a un futuro estandar que quizas nunca llegue, sumado a que las soluciones propietarias nunca hicieron mella en la industria del software, tal vez IBM sabia de lo que hablaba cuando declaró al COBOL un lenguaje muerto.

Actualización! El grupo de trabajo de la ANSI encargada de establecer los estandares para COBOL, llamado J4 ya tiene el borrador para el COBOL ANSI 2002, entre sus cosas mas resaltables está la inclusión de la programación orientada a objetos, esto pondrá a COBOL nuevamente en el estado del arte de la programación. El nuevo estandar tiene como fecha tentativa de publicación Julio de 2002. Para más información dirigirse a www.cobolstandards.com o bién a http://standards.incits.org/a/public/group/pl22.4

Actualización! Ya está aprobado el estandar ANSI 2002.

Enlaces.

Por Diego Romero,