Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Tutoriales > Plataformas > Linux > Curso práctico de Corba en GNU/Linux
-Tutoriales

Curso práctico de Corba en GNU/Linux


Traducciones de OMG/IDL a C, C++ y Java

. Mapping a C

Al no tener el lenguaje C objetos ni excepciones, en el mappping de OMG/IDL a C en todas las operaciones aparecen el objeto sobre el que se va a invocar, y una variable de contexto para recoger información sobre las excepciones. La carencia en C de espacios de nombres obliga a nombres de la forma CORBA_object y con ello, aparece el problema de posibles colisiones de nombres. Un ejemplo de mapping sencillo podría ser:

interface ejemplo {
	long operacion (in string arg);
};

Este interfaz en IDL genera en C (partes relevantes):

typedef CORBA_Object ejemplo;
extern CORBA_long operacion (
			ejemplo o, CORBA_string arg, CORBA_Enviroment *ev);

Queda patente del ejemplo como en cada operación, hay que especificar el objeto sobre el que se va a ejecutar la operación, así como el entorno por el que se pasarán las excepciones.

Los tipos básicos no se traducen directamente a tipos en C, ya que los tipos en C pueden variar de una arquitectura a otra (número de bits, forma de ordenación de los bytes ...). Por ello por ejemplo el tipo IDL long se mapea a CORBA_long en C, y no a un long directamente.

Para traducir el mecanismo de herencia lo que se hace, como en C no existe la herencia, es incluir dentro de la traducción todos los elementos de la interfaz, y todos los de las interfaces de los que hereda.

Como ya dijimos el manejo de excepciones se realiza utilizando variables de entorno CORBA_Enviroment. Este mismo mecanismo es el que se utiliza en el caso de los compiladores de C++ que aún no tuvieran soporte para excepciones.

. Mapping a C++

La traducción de OMG/IDL es más directa a C++ que a C, a pesar de que en cuando se publicó el mapping de OMG/IDL a C++ aún no estaba aprobado el estándar ANSI C++, lo que obligó a dar rodeos para aspectos (p.e. string) que hoy serían mucho más sencillo.

Siguiendo con el mismo ejemplo anterior:

interface ejemplo {
	long operacion (in string arg);
};

Este interfaz en IDL genera en C++ (partes relevantes):

class ejemplo : virtual public CORBA::Object {
	virtual CORBA::Long operacion( const char* arg ) = 0;
}

Todos las interfaces se convierten en objetos CORBA por el mecanismo de la herencia, hecho que muestra que todos los objetos CORBA tienen una funcionalidad común, con operaciones como:

  • _duplicate
  • _narrow
  • _nil

Recordemos que los objetos CORBA en nuestra aplicación son tipos abstractos, es decir, no podemos interpretar su representación. Estas operaciones comunes nos permiten copiar referencias, ver si una referencia apunta a un objeto válido, o hacer un casting de particularización.

Normalmente C++ mos proporciona el casting de generalización. Con la operación de _narrow podemos transformar un CORBA::Object en un objeto concreto.

Como vemos la operación de la interfaz es definida como una operación abstracta pura, es decir, que para implementar este objeto estamos obligados a implementar esta operación. Normalmente para implementar la interfaz lo que se hace es heredar de la clase ejemplo (class ejemploImp:virtual public ejemplo) e implementar la operación.

Como comentamos en la introducción a IDL, uno de los problemas a la hora de desarrollar con CORBA era la gestión de memoria, en concreto con los parámetros inout y out.

En C++ este problema se alivia un poco gracias a que los tipos de datos que no son básicos (long, short, float, double) reciben un tratamiento especial. Un tipo T reciben traducción sobre T y T_var. El tipo T_var incluye mecanismos de gestión automática de memoria, por lo que si utilizamos estos tipos, nos vemos liberados de reservar y liberar memoria.

Dentro de los ejemplos profundizaremos más en el uso de IDL en C++, como se implementan los interfaces y como se usan los objetos.

. Mapping a Java

El mapping a Java es el último que se produjo, finales de 1997, y es quizás el más directo de todos, debido al soporte que da Java a la programación orientada a objetos, el uso de interfaces, ...

Tomando el ejemplo anterior tenemos:

interface ejemplo {
	long operacion (in string arg);
};

Este interfaz en IDL genera en Java (partes relevantes):

public interface ejemplo extends org.omg.CORBA.CORBject {
  int operacion(java.lang.String arg);
}

Este ejemplo es muy parecido al de C++, pero como Java tiene la construcción sintáctica interface la traducción es todavía más inmediata.

Uno de los problemas que presenta Java es que no soporta la herencia múltiple. Esto obliga a que por ejemplo, si la clase que implementa la interfaz ya hereda de alguna otra, no podemos heredar de nuevo de la clase ejemplo (no heredamos directamente de la interfaz ejemplo si no de la clase ejemploStub).

Cuando OMG definió como se pasaba de IDL a Java, Java estaba ya prácticamente estandarizado por lo que el mapping fue sencillo.

Los problemas de gestión de memoria aquí no aparecen ya que, Java gestiona de forma automática la memoria con el recolector de basura.

. Resumen

Hasta el momento hemos hecho una introducción a como se traduce de OMG/IDL a C, C++ o Java. Hemos visto que el soporte de objetos de C++ y Java facilita su traducción.

A continuación pasamos a describir las herramientas básicas que utilizaremos para desarrollar los ejemplos, para a continuación pasar a programar utilizando Java.

 
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network