11. Anlage
 
zurück
11.2 Schnittstellen zu anderen Sprachen


Für Ada-95-Programme ist es sehr wichtig, mit Systemen, die in anderen Sprachen implementiert sind, effizient kommunizieren zu können. Zum Beispiel ist es von entscheidender Bedeutung, daß Ada-95-Programme Schnittstellen zu Systemen wie z. B. X-Window, Posix und kommerziell verfügbaren fensterbasierten Systemen von Personalcomputern zur Verfügung stellen. Deshalb stellt die Anlage die drei Pragmas "Import", "Export" und "Conventions" zur Anbindung von Software an Ada-Programmen zurVerfügung, die nicht in Ada implementiert ist. Das Wurzelschnittstellenpaket "Interfaces" enthält die Deklarationen von verschiedenen "integer"-Typen für spezifische Hardware sowie die Schiebe- und Rotationsfunktionen für modulare Typen. Die Kind-Pakete "Interfaces.C", "Interfaces.COBOL" und "Interfaces.Fortran" stellen die Typen, Unterprogramme und andere Einträge zur Anbindung der drei Sprachen C, COBOL und Fortran bereit. An Stelle des Pragmas "Interface" in Ada 83 wurden in Ada 95 vier Pragmas aufgenommen, um portable Ada-Software mit Software, die nicht in Ada implementiert ist, zu verbinden:

     pragma Import([Convention =>] convention_identifier,
                              [Entity =>] local_name
                              [, [External_Name =>] string_expression]
                              [, [Link_Name =>] string_expression]);
Mit Hilfe dieses Pragmas lassen sich Unterprogramme oder Variablen einer anderen Sprachen von Ada aus aufrufen bzw. auf diese zugreifen. Dazu muß z. B. die zu importierende Unterprogrammspezifikation in Ada deklariert werden und der Unterprogrammrumpf durch das Pragma "Import" ersetzt werden. Es können auch mehrere überladene Unterprogrammspezifikationen zu einem Pragma "Import", das als Rumpf für alle Unterprogrammspezifikationen dient, deklariert werden.

function Strcat (S1, S2: chars_ptr) return chars_ptr;
procedure Strcat (S1, S2: in chars_ptr);
pragma Import(C, Strcat, "Strcat"); -- Benutzt das C-Programm Strcat
    
pragma Export([Convention =>] convention_identifier,
                            [Entity =>] local_name
                            [, [External_Name =>] string_expression]
                            [, [Link_Name =>] string_expression]);

Mit Hilfe dieses Pragmas lassen sich aus einer anderen Sprache Unterprogramme oder Variable von Ada aufrufen bzw. läßt sich auf diese zugreifen. Dazu muß z. B. der zu exportierende Unterprogrammrumpf in Ada nach der Deklaration des Pragmas "Export" vollständig angegeben werden.


pragma Export(COBOL, Lese_Sensor); -- Stellt das Ada-Programm
-- "Lese_Sensor" dem COBOL-Übersetzer zur Verfuegung
procedure Lese_Sensor (...) is
   --...
begin
   --...
end Lese_Sensor;
    pragma Convention([Convention =>] convention_identifier,
                                    [Entity =>] local_name);


Mit Hilfe dieses Pragmas kann der Programmierer spezifizieren, daß Ada-Typen die Konventionen einer anderen Sprache benutzen sollen. Dies ist notwendig, falls Typen für die Spezifikation von Parametern von importierten Unterprogrammen benötigt werden.

pragma Convention(Fortran, Status_Vektor);
-- Benutzt Status_Vektor
-- mit den Fortran-Konventionen (i.a.spaltenorientiert)

Außerdem sollte das Pragma "Convention" dann verwendet werden, wenn Unterprogramme als "Call-back-Routine" mit anderen Unterprogrammen kommunizieren. Falls ein Unterprogramm in Ada in dieser Art verwendet wird, sollte das Pragma "Convention" sowohl für das Unterprogramm als auch für das Objekt vom Zugriffstyp verwendet werden. Ein Beispiel ist die Kommunikation mit der graphischen X-Window-Schnittstelle (Graphical User Interface GUI).

pragma Linker_Options(string_expression);
Mit Hilfe dieses Pragmas werden die Parameter des Systembinders spezifiziert. Sie werden im Pragma als Zeichenkette angegeben und während des Bindens wird diese Zeichenkette automatisch an den Systembinder übergeben. Dies ist z. B. dann sinnvoll, wenn eine Übersetzungseinheit in einer Partition eingeschlossen werden soll oder Objekte in bestimmte Speicherbereiche abgelegt werden sollen. Das Pragma ist überall dort im Ada-Quelltext erlaubt, wo auch Deklarationen erlaubt sind. Die Form und Bedeutung des zu übergebenden Parameters ist implementierungsabhängig.

Andere Sprachen können Maschinensprachen oder andere Hochsprachen wie z. B. Fortran oder C sein. Mit diesen Pragmas sind folgende Möglichkeiten verbunden:
  • Ada-95-Unterprogramme aus Programmen aufzurufen, die in einer anderen Sprache implementiert sind,
  • mit (Unter-)Programmen, die in einer anderen Sprache implementiert sind, über den Zugriff auf
    Unterprogramme/Objekte zu kommunizieren,
  • externe Bindenamen zu spezifizieren, wo notwendig.
Bermerkung:
  • Der externe Name (External_Name), der den Namen des Unterprogramms in der anderen Sprache angibt, und der Bindename (Link_Name) (z. B. "Strcat") sind optional und können in den meisten Fällen in der Spezifikation der Pragmas fehlen. Sie sind z. B. dann von Bedeutung, wenn ein Zugriff auf ein Objekt benötigt wird, dessen Name kein "erlaubter" Ada-Name ist.
  • Zusätzlich zu den hier in den Beispielen genannten Sprachen C, COBOL und Fortran unterstützt der GNU-Ada-Übersetzer die Sprache C++. In diesem Fall muß als Konventionsname "CPP" angegeben werden. Für Module, die in Assembler implementiert sind, muß der Name der entsprechenden Hochsprache angegeben werden.
Beispiel:

Es soll mit einem in der Sprache C implementierten Programm, das Ereignisse behandelt, die von beiner Maus ausgelöst werden können, von einem Ada-Programm aus kommuniziert werden. Das C-Programm ruft die Ada-Prozedur "Aktion" auf, sobald eine Maustaste betätigt wurde. Daher muß dem C-Programm mitgeteilt werden, welche Prozedur aufgerufen werden soll. Dies wird dadurch erreicht, daß die C-Funktion "Setze_Click" mit der Adresse der Ada-Prozedur als Parameter aufgerufen wird.

type Antwort is access procedure (D: Data);
pragma Convention (C, Antwort);
procedure Setze_Click (P: Antwort);
pragma Import (C, Setze_Click);
procedure Aktion (D: Data) is separate;
pragma Convention (C, Aktion);
...
Setze_Click (Aktion´Access);

Das Pragma "Import" zeigt an, daß der Rumpf der Prozedur "Setze_Click" für das Ada-Programm extern ist. Es gibt ebenfalls ein Pragma "Export", das ein Unterprogramm extern sichtbar macht. Dieses Pragma wird im Programmbeispiel nicht benötigt, da die Adresse des Unterprogramms indirekt über den Zugriffswert übergeben wird.


zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.