# Programación en Ada/GLADE
## Introducción a GNAT-GLADE

En primer lugar hay que aclarar que el nombre de esta librería puede confundir a los usuarios y programadores de GTK+ y GNOME. Existe una aplicación muy extendida para el diseño de interfaces gráficas que se llama 'Glade'. Un gran número de lenguajes de programación disponen de librerías para poder leer los ficheros de interfaces que genera Glade (C, C++, Ada, Python, Scheme, Ruby, Eiffel, etc). Pues bien, GNAT-GLADE no tiene nada que ver con esta (magnífica ;-) herramienta.
GLADE (GNAT Library for Ada Distributed Environments) es una extensión para GNAT, el compilador libre (licenciado bajo GPL) de Ada 95, que permite desarrollar aplicaciones distribuidas basándose en el anexo del manual de referencia de Ada: Annex E: Distributed Systems.
La base de las aplicaciones distribuidas de Ada 95 son las particiones. Básicamente una aplicación distribuida se compone de al menos un par de particiones.
Es posible utilizar GNAT-GLADE de dos formas diferentes:
* Con varias particiones sobre la misma máquina.
* Con varias particiones sobre diferentes máquinas que formen parte de una red de computadoras.
Desde luego resulta mucho más interesante la segunda de las opciones. Es más, para desarrollar aplicaciones con varias particiones sobre una misma máquina hay muchos casos en que sería más conveniente no utilizar GLADE y basarse únicamente en los mecanismos de concurrencia de Ada (las tareas): la aplicación será más eficiente.

## ¿Cómo funciona GNAT-GLADE?

Cada una de las particiones de una aplicación basada en GNAT-GLADE, a la hora de la compilación se va a convertir en un ejecutable independiente. Cada uno de estos ejecutables serán los que se ejecuten por separado y se comuniquen entre ellos.
Existe una herramienta que facilita todo este proceso: gnatdist.
gnatdist lee un fichero de configuración en el que se especifica cómo queremos distribuir la aplicación y genera todos los ejecutables necesarios. De esta forma, es posible probar diferentes formas de distribuir una misma aplicación simplemente con lanzar gnatdist con un fichero de configuración distinto, sin necesidad de modificar el código de la aplicación.

## Lenguaje de configuración de gnatdist

Las configuraciones de gnatdist se escriben en un lenguaje muy parecido a Ada. Es importante que todas las configuraciones se guarden en ficheros con extensión ".cfg".
Para lanzar la compilación de una aplicación distribuida con gnatdist únicamente es necesario ejecutar esta herramienta dándole como parámetro el nombre del fichero de configuración. Por ejemplo:

### ¿Cómo se escriben las configuraciones?

En cualquier punto de la configuración es posible usar comentarios, que al igual que en Ada se comienzan con los caracteres -- .
Los ficheros de configuración han de contener un bloque "configuration", cuyo nombre ha de coincidir, al igual que en el caso de los paquetes, con el nombre del fichero en el que se encuentra. Es decir:

## Primer ejemplo

El movimiento se aprende andando; así que, vamos a por el primer ejemplo.
En este ejemplo vamos a crear una pequeña aplicación compuesta únicamente de dos particiones:
* La primera de ellas es un servidor de sumas y restas (al más puro estilo RPC). En él se van a definir dos operaciones: suma y resta, que dados dos números enteros, van a devolver el resultado de aplicar la operación elegida sobre ambos.
* La segunda de ellas es un pequeño cliente que efectuará un par de operaciones para comprobar que efectivamente el servidor responde.

### calculadora.ads

En esta definición del paquete llama la atención la instrucción 'pragma'. Un pragma es simplemente una directiva para el compilador. En concreto, en este ejemplo, el pragma Remote_Call_Interface hace que se exporte la interfaz del paquete para que otras particiones puedan realizar llamadas a sus funciones, es decir, básicamente una llamada RPC.

### calculadora.adb

Este fichero es únicamente la implementación de las funciones del paquete calculadora.

### cliente.adb

Por último, el cliente. Este programa hace un par de llamadas a las funciones exportadas por el proceso de calculadora. Como se puede ver, el código no tiene en cuenta si el proceso calculadora se encuentra corriendo en la misma máquina o en otra. Simplemente, realiza llamadas a las funciones de la calculadora. De todo lo demás, que es mucho, ya se ha encargado gnatdist y se encarga Ada.

### ejemplo.cfg

Este es el fichero de configuración/compilación de gnatdist.
El pragma Starter describe como queremos que gnatdist compile el proyecto. Existen tres posibilidades: Ada, Shell y None. En el primero de los casos será uno de los ejecutables el que lance todos los demás. Mediante Shell, es un shell script el que lanzará los procesos. Con None, tendremos que lanzarlos a mano o hacer nuestro propio script de arranque.
A continuación se definen las dos particiones que se han utilizado en este ejemplo: una para la calculadora y la segunda para el cliente que le realiza peticiones.
Por último se especifica cuál es la parte principal (el main). Esta partición, lógicamente, ha de tener un body.
Cuidado con los nombres de los ficheros: han de coincidir con el nombre del paquete y además, han de estar en minúsculas. De no ser así gnatdist producirá un error.

### Compilación y ejecución del programa

Para compilar la aplicación, como ya hemos visto, simplemente hay que ejecutar gnatdist:
Si no ha habido ningún problema, se habrá producido una salida como esta:
Nota: las siguientes copias de salidas de comandos son de un sistema GNU/Linux, pero en otros sistemas operativos existirá un equivalente.
En este momento ya tenemos construidos todos los ejecutables:
Como podemos ver, al especificar el Pragma Starter (Ada) en el fichero de configuración, gnatdist ha generado un enlace simbólico al ejecutable que va a lanzar los demás.
En esta prueba vamos a ejecutar los dos programas en la misma máquina, más adelante se explicará cómo hacerlo en varias.
Ahora bien, ¿estamos seguros de que se ha ejecutado un programa paralelo?, ¿estamos seguros de que en realidad no se ha enlazado el paquete Calculadora en los dos ejecutables?
Como podemos ver en los procesos, realmente se han ejecutado los dos programas:
Es más, si examinamos los símbolos de los dos ejecutables, podemos ver como la calculadora tiene enlazadas las funciones de suma y resta:
y el cliente, además, tiene las funciones que usa gnatdist para el acceso:

## Instalación bajo Debian GNU/Linux

Instalación de GNAT (compilador de Ada 95) y GLADE para GNAT (extensión para soporte de programación distribuida).
Para realizar la instalación en el sistema es imprescindible estar identificado como usuario root:
Instalación de la documentación de ambos paquetes. Estos paquetes son opcionales aunque muy recomendables.

## Enlaces externos

* Ada: Anexo de sistemas distribuidos. Alejandro Alonso. DIT/UPM.
* RT-GLADE: Implementación Optimizada para Tiempo Real del Anexo de Sistemas Distribuidos de Ada 95. Universidad de Cantabria
* Página oficial de la versión pública de GLADE
* Página de AdaCore sobre la versión soportada de GLADE
* GLADE User Guide

## Manual de referencia de Ada

* Annex E: Distributed Systems

## Autores

* Artículo original de Alvaro López Ortega que se puede encontrar en Programación distribuida con Ada 95 bajo GNU/Linux (I). El autor ha aceptado publicarlo bajo licencia GFDL, ver la autorización.
* Copyright © 2001 por Alvaro López Ortega
* Copyright © 2005 por los autores de esta versión. Consulte el historial.