El lenguaje OMG/IDL es uno de los pilares de la plataforma OMA de OMG, y en especial de CORBA.
La especificaci�n del lenguaje se puede consultar dentro del est�ndar de CORBA, en el cap�tulo 3. Son un total de 40 p�ginas cuyo �ndice lo pod�is observar en la siguiente figura:

Esta es la fuente definitiva que a la que el lector tiene que acudir y de ella vamos a tomar datos del lenguaje a lo largo de este apartado.
Gracias a este lenguaje descriptivo podemos especificar las interfaces de nuestros m�dulos CORBA, sin ligarnos a ning�n lenguaje concreto.
Adem�s es un lenguaje muy adecuado para el dise�o del sistema ya que permite pensar en el dise�o del sistema, sin tener que descender a detalles de implementaci�n.
Para evitar ambig�edades a nivel de dise�o es un lenguaje fuertemente tipado, al estilo de Java. Es un lenguaje cuya sintaxis est� bastante cercana a la de ANSI C++ o Java, al ser orientado a objetos. Tiene facilidades como la definici�n de m�dulos e interfaces, herencia de interfaces o excepciones. Es un lenguaje lo suficientemente descriptivo como para poder detallar interfaces de objetos que van a ser distribuidos.
En la siguiente figura podemos observar las palabras claves reservadas en este lenguaje:

Pasamos a describir el lenguaje con mayor detalle a continuaci�n, as� como ejemplos de los principales traducciones de OMG IDL a lenguajes como C, C++ y Java.
�Descripci�n del lenguaje
OMG/IDL es un lenguaje sencillo al ser declarativo. Una muestra de su sencillez es que su gram�tica est� compuesta de 82 reglas en total, pudi�ndose consultar dicha gram�tica dentro del cap�tulo 3 del est�ndar de CORBA.
La mejor forma de entender el lenguaje es mediante un ejemplo que iremos explicando a lo largo de este apartado. El ejemplo que utilizaremos ser� la interfaz IDL Mensajes.idl resultado de la fase de dise�o de la soluci�n que desarrollamos en el apartado anterior. Reproducimos dicha interfaz al completo para que el lector la pueda tener a mano ya que ser� utilizada a menudo como referencia.
1: // M�dulo de intercambio de mensajes entre usuarios 2: module Mensajes { 3: interface comun { 4: // Version de la aplicacion 5: readonly attribute string version; 6: 7: // Nombre de usuario 8: typedef string usuario; 9: // Lista de usuarios 10: typedef sequence lista_usuarios; 11: 12: // Excepcion de usuario no presente 13: exception ClienteNoPresente {usuario nombre;}; 14: 15: struct alarma { 16: unsigned short codigo; 17: string mensaje; 18: }; 19: }; 20: 21: // Interfaz a implementar por el cliente 22: interface cliente { 23: // Funci�n b�sica de recepcion de mensajes 24: // Devuelve "true" ante recepcion correcta 25: boolean recibeMensaje (in string mensaje); 26: // Mensajes de aviso especiales del servidor 27: boolean recibeAviso (in comun::alarma mensaje); 28: // Mensajes directos a otros usuarios 29: void enviaMensaje (in comun::usuario destino, in string mensaje); 30: }; 31: 32: // El operador es informado de accesos al servicio 33: interface operador:cliente { 34: boolean nuevaConexion(in string nombre); 35: }; 36: 37: // Interfaz a implementar por el servidor 38: interface servidor { 39: // Conexion de un operador 40: string conectar_operador (in operador interfaz, in string clave); 41: // Devuelve una cadena con el nombre del servidor 42: string conectar (in cliente interfaz); 43: // Desconecta un usuario del sistema 44: boolean desconectar (in cliente interfaz); 45: // Mira si un usuario esta conectado y recibe la interfaz al mismo 46: cliente presente (in string nombre) raises (comun::ClienteNoPresente); 47: // Devuelve una lista de los usuarios presentes en el sistema 48: void listaUsuarios (out comun::lista_usuarios lista); 49: }; 50: 51: };
�M�dulos e interfaces
Este ejemplo es bastante completo y nos va a permitir profundizar en diferentes aspectos de OMG IDL.
La primero que observamos es la forma de encapsular en m�dulos las interfaces. Un m�dulo debe de ser un conjunto de interfaces que proporcionan una funcionalidad concreta dentro del sistema. En nuestro caso este m�dulo es el encargado de definir el m�dulo de Mensajes de una herramienta de trabajo cooperativo.
Dentro del m�dulo hemos definido dos interfaces: una para los clientes y otra para el servidor central. La arquitectura sigue los esquemas centralizados, es decir, que un servidor central controla la forma de interactuar entre los diferentes clientes. Pero tambi�n se pueden obtener las interfaces a otros clientes y comunicarnos con ellos de forma directa.
Comprobamos aqu� que CORBA se adapta sin problemas a paradigmas como el de cliente/servidor o de igual a igual sin ning�n tipo de problema.
�Operaciones y tipos de datos
Las funciones se agrupan en interfaces cuando tienen un prop�sito com�n. Dichas funciones tienen par�metros de entrada, con sus tipos correspondientes y par�metros de salida. Es necesario especificar el par�metro de retorno, aunque este sea void.
Es caracter�sticos de OMG/IDL que los par�metros que se pasan a la funci�n pueden ser de tres tipos:
- in: par�metros que se env�an del cliente al servidor.
- out: par�metros en los que se reciben datos del servidor.
- inout: par�metros en los que se env�an datos al servidor y se reciben datos de respuesta del servidor.
Esta caracter�stica de CORBA en el paso de par�metros complica la gesti�n de memoria dentro de la implementaci�n. En los tipos de par�metros in la gesti�n de memoria del par�metro es sencilla: el cliente se encarga de la reserva y liberaci�n de memoria.
Pero en los par�metros out y inout aparece el problema de que, el cliente puede reservar una cantidad de memoria para el par�metro, cantidad que puede ser modificada por el objeto para que entre en el par�metro la respuesta.
En el est�ndar se han dividido 20 tipos de par�metros en 6 tipos de paso de par�metros. Por ejemplo, para par�metros de longitud fija (incluyendo las estructuras), el llamante reserva y libera el espacio excepto en el caso de any.
Las referencias a objetos tambi�n son gestionadas en el cliente. Pero por ejemplo, si el par�metro es inout, la implementaci�n del objeto va a invocar la operaci�n CORBA::Object_release en el valor original para reasignar el par�metro (algo que tambi�n afecta en el lado del cliente). Para guardar el valor original de la referencia al objeto, deberemos utilizar CORBA::duplicate antes de invocar la operaci�n.
Hay casos en los par�metros out y inout en los que la implementaci�n debe de reservar la memoria, pero debe ser liberada en el cliente.
Dentro del est�ndar estas detallados todos los casos y hay que ser cuidadoso para evitar agujeros de memoria en nuestras aplicaciones.
Los tipos de estos datos son los que solemos encontrarnos en cualquier lenguaje de programaci�n: integer (signed/unsigned long, short), float, double, boolean, octet, any.
Tambi�n tenemos tipos estructurados como: struct, discriminated union, enumerations, sequence, string y array.
Un tipo especial de datos son los atributos. Un ejemplo de su uso lo encontramos en la l�nea 5. Los atributos al ser procesados por el compilador de IDL generan una funci�n (get) si son de solo lectura (como en nuestro caso), o dos funciones (get y set) si son de lectura y escritura. El acceso al atributo se ha de realizar de forma obligatoria a trav�s de estas operaciones.
De todos estos tipos de datos quiz�s merezca menci�n especial el tipo any en el que podemos meter cualquier otro tipo de dato de OMG/IDL. Un tipo de datos muy flexible que no solemos encontrar en los lenguajes usuales.
Por �ltimo comentar que existe un tipo especial de operaci�n, aquellas del tipo oneway. Son operaciones que se invocan sin esperar ning�n valor de retorno, no siendo bloqueantes. Por ello en este tipo de operaciones el tipo de retorno ha de ser void y todos los par�metros han de ser del tipo in. Un ejemplo de este tipo de operaci�n lo observamos en la l�nea 27, donde el servidor env�a las alarmas a los clientes, sin esperar que estos le respondan nada.
�Excepciones
Algo importante en la invocaci�n de operaciones sobre objetos CORBA es que, aunque para el desarrollador sean invocaciones comunes sobre objetos, el mecanismo para sus ejecuci�n es complejo: han de pasar por los cabos del cliente, por el ORB, por el adaptador de objetos, encontrar el objeto adecuado, viajar por los cabos del servidor, realizar la invocaci�n sobre el objeto y recorrer el mismo viaje de vuelta.
Es sencillo que en todo este trasiego puedan aparecer problemas. Y para informar al cliente de dichos problemas aparecen las excepciones. Ante problemas en la invocaci�n de estas operaciones, el ORB nos puede devolver excepciones de diferentes tipo, seg�n el problema aparecido.
Pero es m�s dentro de nuestro c�digo tambi�n podemos crear excepciones para la gesti�n de errores, o para comunicar situaciones excepcionales. Tal es el caso de la funci�n de la l�nea 39, que en el caso de que un usuario no este conectado lo devuelve como una excepci�n.
�Herencia
La herencia es un mecanismo de reutilizaci�n de funcionalidad. En nuestro caso la utilizamos para definir la interfaz de un operador, que es un cliente con una operaci�n m�s, la de recibir informaci�n de conexiones.