Programación en Ada/Interfaz con otros lenguajes
En el mercado existen miles de bibliotecas de programación escritas en C ó C++. También es bastante común tener que reutilizar una parte de nuestros programas escritos en otro lenguaje. Para este propósito existen en Ada los pragmas (directivas de compilación) de interfaz con otros lenguajes, definidos en el Annex B: Interface to Other Languages. El estándar define interfaces con los lenguajes C, COBOL y Fortran, y también con ensamblador. Las implementaciones pueden definir interfaces con otros lenguajes siguiendo el mismo esquema. Así, por ejemplo, GNAT proporciona interfaz con C++ (aunque el name mangling suele dificultar esta tarea).
Para importar desde nuestro programa Ada una función definida en otro lenguaje se utiliza el pragma Import. Ésta es la base de los conocidos bindings que nos permiten utilizar una librería escrita en otro lenguaje desde Ada. Para hacer que un subprograma escrito en Ada pueda ser llamado desde otro lenguaje, se utiliza el pragma Export.
También se pueden importar y exportar variables o constantes.
A la hora de enlazar (link) el programa completo tenemos que especificar a nuestro compilador con qué bibliotecas externas ha de enlazar para encontrar los subprogramas u objetos importados. Para esto también puede ser de ayuda el pragma Linker_Options, con el cual se pueden especificar los argumentos para el linker.
La biblioteca predefinida tiene varios paquetes, todos ellos hijos de Interfaces destinados a facilitar la interfaz con otros lenguajes, definiendo tipos y subprogramas para ello:
Ejemplo de importación desde C
editar-- Ejemplo para limpiar la pantalla
with
Interfaces.C;procedure
Clsis
package
Crenames
Interfaces.C;function
System (Command : C.Char_Array)return
C.Int;pragma
Import(C, System,"system"
); Rc : C.Int;begin
Rc := System (C.To_C ("cls"
));-- Comando sintaxis MS-DOS. En Unix sería clear
end
Cls;
Este ejemplo compilaría perfectamente usando GNAT con:
gnatmake cls.adb
Sin embargo si en vez de importar funciones de las librerías estándar de C tenemos que importar nuestras propias funciones, primero tendríamos que definirlas en su correspondiente archivo .c, compilarlas y luego pasárselas al compilador de Ada.
Por ejemplo si nuestras funciones están definidas en el archivo mis_funciones.c y si usamos el compilador gcc:
gcc -c mis_funciones.c
Con esto se obtiene un mis_funciones.o que se ha de pasar al gnatmake para que enlace con las funciones:
gnatmake ejemplo.adb -largs mis_funciones.o
Si no lo hacemos así fallará la fase de enlace del programa porque existen referencias a funciones externas no encontradas.