Primer programa

Editores

Como en la mayoría de los lenguajes de programación, un programa en Cobol es simplemente un fichero de texto, el cual usted edita con su editor de textos favorito. Afortunadamente, para evitar guerras religiosas, tanto Vim como Emacs trabajan con Cobol.

Emacs

No hay un modo Cobol que venga como estándar para GNU Emacs. En su lugar, descargue una copia de cobol.el del proyecto Cobol para GCC. Usted puede descargar el fichero directamente desde su CVS en http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/gcc/cobol/cobol.el?cvsroot=CobolForGCC.

Abra Emacs y compile el fichero Lisp con M-x byte-compile-file. Mueva el fochero cobol.elc resultante a /usr/share/emacs/20.7/lisp/textmodes/ o el equivalente para su instalación. Finalmente añada este código al fichero .emacs (o .gnu-emacs en algunas distribuciones) en su directorio home:

(autoload 'cobol-mode "cobol" "COBOL Editing mode" t)
    (setq auto-mode-alist
          (append '(("\\.cpp$" . c++-mode)
                    ("\\.hpp$" . c++-mode)
                    ("\\.lsp$" . lisp-mode)
                    ("\\.scm$" . scheme-mode)
                    ("\\.pl$"  . perl-mode)
                    ("\\.cbl$" . cobol-mode)
                    ("\\.CBL$" . cobol-mode)
                    ("\\.COB$" . cobol-mode)
                    ("\\.cob$" . cobol-mode)
	            ("\\.CPY$" . cobol-mode)
                    ("\\.cpy$" . cobol-mode)
                   ) auto-mode-alist))

;; Auto font lock mode
(defvar font-lock-auto-mode-list
  (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode
'perl-mode 'scheme-mode 'scribe-mode 'shell-script-mode 'cobol-mode
'dired-mode)
  "List of modes to always start in font-lock-mode")

(defvar font-lock-mode-keyword-alist
  '((c++-c-mode . c-font-lock-keywords)
    (perl-mode . perl-font-lock-keywords)
    (cobol-mode . cobol-font-lock-keywords)
    (dired-mode . dired-font-lock-keywords))
  "Associations between modes and keywords")

(add-hook 'cobol-mode-hook
          '(lambda ()
             (set (make-local-variable 'dabbrev-case-fold-search) t)
             (set (make-local-variable 'dabbrev-case-replace) t))

Abra un fichero Cobol en Emacs y escriba `M-x cobol-mode' y `M-x font-lock-mode' para conseguir bonitos colores. Gracias al equipo de Cobol para GCC por hacer este modo para Emacs.

Primer programa

Aquí hay un Hola Mundo en Cobol:

* Hello World Program
* GPL Copyleft Jonathan Riddell 2001
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    hello.
       ENVIRONMENT DIVISION.
       DATA DIVISION.

       PROCEDURE DIVISION.
           DISPLAY "hello ," WITH NO ADVANCING 
           DISPLAY "world!"
           STOP RUN.

La estructura del programa es bastante simple, cuatro secciones de las cuales dos tienen contenido. El PROGRAM-ID es un nombre simple para el programa, usted puede opcionalmente proporcionar otra informacion en IDENTIFIATION DIVISION. ENVIRONMENT DIVISION puede (opcionalmente ahora) contener información acerca su configuración, tal como el compilador que está usando. DATA DIVISION contiene declaraciones de variables que podríamos necesitar. Finalmente PROCEDURE DIVISION contiene las instrucciones del propio programa.

Usted notará que hay gran cantidad de mayúsculas en el código. Usar mayúsculas para las palabras reservadas de Cobol mantiene el programa más compatible hacia atrás con otros compiladores y asegura que las las palabras reservadas se mantienen diferenciadas de los literales y variables. Con Tiny Cobol usted es perfectamente libre de no usar mayúsculas, lo que hará que su Bloq Mayús no se estropee tan rápido.

La otra cosa a notar es el espaciado. Debido a los viejos días de las tarjetas perforadas, Cobol mantiene un control estricto de dónde debe encontrarse el cada parte del código:

columna 1-6   : número de linea.
columna 7     : area de indicación,
		asterisco para comentar lineas,
		menos para continuación de lineas,
		barra para saltar página en listados de
		compilación, y en otro caso espacio.
columna 8-11  : Margen A, aquí comienza una división, sección,
		identificadores de párrafo y algunos números de
		nivel.
columna 12-72 : Margen B, para todo lo que no pertenece al Margen A.
columna 73-80 : área de identificación del programa.

Tiny Cobol no le fuerza a seguir este régimen, pero hacerlo mantendrá sus programas más ordenados, evitará que otros compiladores se quejen por el espaciado y hará feliz al modo Cobol en Emacs. No obstante, Tiny Cobol insiste en tener el asterisco que denota comentario en la primera o segunda columna.

Ahora a por la compilación del programa. Guarde el código anterior como hello.cob y escriba el siguiente comando:

	  htcobol hello

Hay posibilidades de que htcobol advierta de que $COBDIR no está presente, en el caso de que haya instalado en el directorio por defecto esto no debería ser un problema, pero si usted cambió el directorio o si no desea ser molestado por estraños mensajes de advertencia, entonces añada `export COBDIR=/usr/local/share/htcobol' o similar a sus fichero .bashrc o .profile. También le dirá que está procesando parámetros del compilador (literal: `Processing compiler parameters'), eso es buena señal.

htcobol producirá los ficheros hello.lis y hello.s. hello.lis es una conversión del código Cobol a algo más amigable para el compilador. hello.s es código ensamblador, el equivalente al código máquina en términos legibles por el ser humano.

Actualización: Tiny Cobol ya no necesita compilar a código ensamblador y en su lugar compila directamente a programa ejecutable. Por lo tanto, los siguientes dos pasos pueden descartarse.

Si su shell no puede encontrar un programa llamado htcobol en primer lugar compruebe que su variable $PATH le permite acceder a /usr/local/bin/htcobol o a lugar donde usted lo haya instalado (emplee echo $PATH). Si apunta bien, entonces vuelva a comprobar que se configuró, compiló e instaló correctamente.

Si usted escribió mal el código anterior, habrá notado que Tiny Cobol no es muy bueno todavía informando de errores. De hecho, lo único que usted obtendrá es un fallo de segmentación (literal: `Segmentation Fault'. Compruebe otra vez que escrtibió todo correctamente, que no olvidó alguna puntuación y que los asteriscos de los comentarios se encuentran en la primera columna.

N.t.: El informe de errores ha evolucionado mucho desde que se escribió el artículo original, esta información está anticuada.

El siguiente paso es compilar el fichero en ensamblador file.s en código máquina. La orden para hacer esto es:

as -o hello.o hello.s

as forma parte del la Colección de Compiladores GNU, GCC, y su usted no lo tiene instalado es porque tiene una distribución muy divertida (teniendo en cuenta que usted ya ha compilado Tiny Cobol). Consulte la documentación de su distribución sobre como instalarlo.

hello.o es un fichero objeto, pero no un fichero ejecutable porque no ha sido enlazado con las librerias necesarias. Esta es la orden final:

gcc -o hello hello.o -lhtcobol -lm

Si usted ha llegado tan lejos, probablemente no tenga ningún problema con esta parte, pero si gcc no ha encontrado las librerías libhtcobol o libm entonces usted tendría que actualizar la base de datos de las librerias del sistema con la orden ldconfig.

Finalmente tenemos el programa funcional que puede ser ejecutado con:

./hello

Y debería obtener la siguiente salida:

Hello, world!

La cual era bastante predecible. Si observa el código del programa debería ser obvio lo que hace DISPLAY y que hace WITH NO ADVANCING (imprime sin un salto de linea).