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

  1. Interfície de Llenguatge Estranger (Foreign Language Interface, FLI): Mecanismes que permeten a Ada cridar funcions escrites en altres llenguatges i viceversa.
  2. Convencions de Crida: Regles que defineixen com es passen els arguments i es retorna el valor entre funcions de diferents llenguatges.
  3. 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:

// c_function.c
#include <stdio.h>

void hello_from_c() {
    printf("Hello from C!\n");
}

Per cridar aquesta funció des d'Ada, seguim aquests passos:

  1. 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;
  1. Cridar la Funció des d'Ada: Utilitzem la funció declarada en el nostre codi Ada.
-- main.adb
with Hello_From_C;

procedure Main is
begin
    Hello_From_C.Hello_From_C;
end Main;
  1. Compilar i Enllaçar: Compilem i enllacem el codi Ada amb el codi C.
gcc -c c_function.c
gnatmake main.adb c_function.o

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:

  1. 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;
  1. 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;
}
  1. 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

  1. Escriu una funció en C que sumi dos enters i retorni el resultat.
  2. Declara i crida aquesta funció des d'Ada.

Solució

Codi C:

// sum.c
int sum(int a, int b) {
    return a + b;
}

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ç:

gcc -c sum.c
gnatmake main.adb sum.o

Exercici 2: Cridar una Funció d'Ada des de C

  1. Escriu una funció en Ada que multipliqui dos enters i retorni el resultat.
  2. 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ç:

gnatmake -c multiply.adb
gcc -c main.c
gnatbind multiply.ali
gnatlink multiply.ali main.o -o main

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.

© Copyright 2024. Tots els drets reservats