En aquest tema, explorarem com Ada pot interactuar amb altres llenguatges de programació. Aquesta capacitat és crucial per integrar sistemes existents, aprofitar biblioteques externes i col·laborar en projectes multidisciplinaris. Ens centrarem principalment en la interfície amb C, ja que és un dels llenguatges més comuns amb els quals Ada sol interactuar.
Conceptes Clau
- Interfície de Llenguatge Estranger (Foreign Language Interface, FLI): Mecanismes que permeten a Ada cridar funcions escrites en altres llenguatges i viceversa.
- Convencions de Crida: Regles que defineixen com es passen els arguments i es retorna el valor entre funcions de diferents llenguatges.
- Especificació de Lligam (Linking Specification): Directives que indiquen al compilador com enllaçar amb codi extern.
Convencions de Crida
Ada utilitza la paraula clau pragma
per definir les convencions de crida. Per exemple, per cridar una funció de C des d'Ada, utilitzem pragma Import
.
Exemple: Cridar una Funció de C des d'Ada
Suposem que tenim la següent funció en C:
Per cridar aquesta funció des d'Ada, seguim aquests passos:
- Declarar la Funció en Ada: Utilitzem
pragma Import
per indicar que la funció està definida en C.
-- hello_from_c.ads package Hello_From_C is procedure Hello_From_C; pragma Import (C, Hello_From_C, "hello_from_c"); end Hello_From_C;
- Cridar la Funció des d'Ada: Utilitzem la funció declarada en el nostre codi Ada.
- Compilar i Enllaçar: Compilem i enllacem el codi Ada amb el codi C.
Exemple: Cridar una Funció d'Ada des de C
Suposem que tenim la següent funció en Ada:
-- ada_function.adb with Ada.Text_IO; use Ada.Text_IO; procedure Hello_From_Ada is begin Put_Line("Hello from Ada!"); end Hello_From_Ada;
Per cridar aquesta funció des de C, seguim aquests passos:
- Declarar la Funció en Ada: Utilitzem
pragma Export
per indicar que la funció serà cridada des de C.
-- ada_function.ads package Ada_Function is procedure Hello_From_Ada; pragma Export (C, Hello_From_Ada, "hello_from_ada"); end Ada_Function;
- Cridar la Funció des de C: Utilitzem la funció exportada en el nostre codi C.
// main.c #include <stdio.h> extern void hello_from_ada(); int main() { hello_from_ada(); return 0; }
- Compilar i Enllaçar: Compilem i enllacem el codi Ada amb el codi C.
gnatmake -c ada_function.adb gcc -c main.c gnatbind ada_function.ali gnatlink ada_function.ali main.o -o main
Exercicis Pràctics
Exercici 1: Cridar una Funció de C des d'Ada
- Escriu una funció en C que sumi dos enters i retorni el resultat.
- Declara i crida aquesta funció des d'Ada.
Solució
Codi C:
Codi Ada:
-- sum.ads package Sum is function Sum (A, B : Integer) return Integer; pragma Import (C, Sum, "sum"); end Sum; -- main.adb with Sum; use Sum; with Ada.Text_IO; use Ada.Text_IO; procedure Main is Result : Integer; begin Result := Sum (5, 7); Put_Line ("The sum is: " & Integer'Image (Result)); end Main;
Compilació i Enllaç:
Exercici 2: Cridar una Funció d'Ada des de C
- Escriu una funció en Ada que multipliqui dos enters i retorni el resultat.
- Declara i crida aquesta funció des de C.
Solució
Codi Ada:
-- multiply.adb package Multiply is function Multiply (A, B : Integer) return Integer; pragma Export (C, Multiply, "multiply"); end Multiply; package body Multiply is function Multiply (A, B : Integer) return Integer is begin return A * B; end Multiply; end Multiply;
Codi C:
// main.c #include <stdio.h> extern int multiply(int a, int b); int main() { int result = multiply(5, 7); printf("The product is: %d\n", result); return 0; }
Compilació i Enllaç:
Resum
En aquesta secció, hem après com Ada pot interactuar amb altres llenguatges, especialment C. Hem vist com utilitzar pragma Import
i pragma Export
per cridar funcions entre Ada i C. També hem practicat amb exercicis per reforçar aquests conceptes. Aquesta capacitat d'interfície és essencial per a la integració de sistemes i l'ús de biblioteques externes, ampliant així les possibilitats dels nostres projectes en Ada.
Curs de Programació en Ada
Mòdul 1: Introducció a Ada
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Estructures de Control
- Bucles en Ada
- Subprogrames: Procediments i Funcions
Mòdul 3: Tipus de Dades Avançats
Mòdul 4: Programació Modular
Mòdul 5: Concurrència i Programació en Temps Real
Mòdul 6: Temes Avançats
Mòdul 7: Millors Pràctiques i Optimització
- Estil de Codi i Millors Pràctiques
- Depuració i Proves
- Optimització del Rendiment
- Consideracions de Seguretat