Exécution d`un sous

publicité
Cours n° 9
Interopérabilité logicielle I
Entre C++ et Perl
1
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
Sommaire
1. Interopérabilité entre C++ et Perl
1. Appels de programmes et de sous-programmes Perl en C++
2
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Problématique (1)
Multitude de langages informatiques universels
1956 – Fortran (FORmula TRANslation)
1959 – Cobol (COmmon Business-Oriented Language) (DARPA)
1965 – Basic (Beginner's All-purpose Symbolic Instruction Code)
1968 – Pascal (successeur d’Algol-1951 ALGOrithm Langage)
1972 – C (successeur de B lui-même successeur de A-1951) Bell Labs
1981 – C++
1983 – Ada (DARPA)
1995 – PHP (Personal Home Pages Hypertext Processor)
1996 – Java (Sun)
2000 – C# (Microsoft)
2001 – WDSL (Web Services Description Language ) IBM, Microsoft
3
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Problématique (2)
Pas de langage informatique universellement utilisé
Habitudes de programmation
anciennes normes de développement
Maintenance du logiciel existant
Bibliothèques de composant logiciel
Difficulté de la traduction automatique
Influence du matériel
ancienneté du parc machine
disponibilité des compilateurs et des interpréteurs
inflation de la mémoire utilisée
Nécessité d’une interopérabilité entre langages
4
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Solutions (1) - CORBA (www.corba.org)
Common Object Request Broker Architecture
Pont logiciel ou intergiciel (norme de communication inter-applications en
environnement hétérogène)
multi-langages, multi-systèmes, multi-communications
Langage de définition d’interfaces (Interface Definition Langage)
Transmission des paramètres par un bus logiciel (Object Request Broker)
1995 – Version 2.0 IDL pour les langage C, C++
1997 – Version 2.1 IDL pour les langages Cobol et Ada
1998 – Version 2.2 IDL pour le langage Java (version standard)
2003 – Règles de construction des IDL, standardisées pour les langages Lisp, PL1,
Python, Smalltalk, XML/DTD
Solution complexe, non triviale à mettre en oeuvre
5
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Solutions (2) - Microsoft .NET (www.microsoft.com/net)
Plateforme Microsoft pour les services Web/XML
Intégré au système d’exploitation Windows (CE, XP, Xbox)
Bibliothèque unifiée de classes accessible d’un ensemble de langages CLR (C, C++,
C#, Cobol, Fortran, Eiffel, Python, Pascal mais pas Java)
Langage commun de spécification d’interface CLS (inspiré de CORBA)
Plateforme de développement multilingue (Visual Studio .NET)
Lancement en 2001
Solution efficace, plus simple que CORBA à mettre en
œuvre, mais propriétaire
6
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Solutions (3) - Java Native Interface (www.sun.org)
Interface de communication entre des méthodes en Java et
des méthodes écrites dans un autre langage (non natives)
Intégrée directement le langage Java (langage pivot)
Prise en compte de types évolués (objet)
1996 JDK 1.0 – Native Method Interface (NMI)
1997 JDK 1.1 – Java Native Interface (JNI)
2002 J2SE 1.4 – Java Native Interface Extension
Solution très efficace, facile à mettre en œuvre, mais
restreinte aux langages C, C++ (Cobol, Ada, Fortran)
7
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
INTRODUCTION
Solutions (4) - Edition de Liens
Assemblage d’un ensemble de programmes compilés
dans le but de créer un exécutable
Introduit par la programmation modulaire
Norme commune de représentation des symboles (noms de variables et de
méthodes)
Pas de norme commune de représentation des variables
Restriction aux langages compilés natifs (C, C++, Pascal, Ada, Fortran, Cobol)
Librairies statiques (.o .lib) ou dynamiques (.dll .so)
Solution simple, accessible sur tous systèmes, mais
complexe si transmission de paramètres
8
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1 INTEROPERABILITE ENTRE C++ ET PERL
Caractéristiques et méthodologies
Lien naturel entre C++ et Perl
Implémentation de Perl en C,
Bibliothèque Perl58.lib (toutes les fonctionnalités de Perl)
Edition de liens statique (ajout d’un interpréteur Perl)
Bibliothèques de macros et de fonctions
perlembed (ajout d’un interpréteur Perl)
perlcall (conventions de communication entre C++ et Perl)
perlguts (API Perl)
Ajout d’un interpréteur Perl (fonction PerlToCpp)
Un paramètre d’entrée (1 booléen) création (true) / destruction (false)
Paramètre de retour (PerlInterpreter) référence sur un interpréteur Perl
9
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Extrait de l’API Perl
perl_parse(…) Evaluation d’une expression ou exécution d’un programme
call_pv(N, T) Exécution d’un sous-programme N
T (type du retour) {G_NOARGS, G_SCALAR, G_ARRAY}
newSViv(I) Conversion (C++ -> Perl) d’un entier I
newSVpv(s, 0) Conversion de (C++ -> Perl) d’une chaîne de caractères s
newSVnv(x) Conversion de (C++ -> Perl) d’un réel x
sv_2mortal(V) Ajout d’une variable v dans la pile Perl
POPi Conversion du sommet de Pile en un entier (Perl -> C++)
POPp Conversion du sommet de Pile en une chaîne de caractères (Perl -> C++)
POPs Conversion du sommet de Pile en un réel (Perl -> C++)
10
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.1. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Exemple 1 – Exécution du programme « bonjour.pl »
print("bonjour");
Implémentation Perl 5.8 (fonction CallPerlProgram)
Deux paramètres d’entrée (référence sur un interpréteur Perl, nom du programme
Perm)
#include "CppToPerl.h"
int main (int argc, char* argv[]) {
PerlInterpreter *iPerl = CppToPerl(true);
string prog("cours4b/perl/bonjour.pl");
CallPerlProgram(iPerl, prog);
}
11
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.2. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Exemple 2 – Exécution d’un sous-programme (1)
sub boucle {
for ( $i=10 ; $i>=0 ; $i-- ) {
print("$i");
}
}
Création d’une méthode d’interface
void boucle(PerlInterpreter *my_perl) {
cout << "<<sous-programme boucle>>" << endl;
call_pv("boucle", G_NOARGS);
}
12
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.2. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Exemple 2 – Exécution d’un sous-programme (2)
int main (int argc, char* argv[]) {
PerlInterpreter *iPerl = CppToPerl(true);
string prog("cours4b/perl/lib1.pl");
CallPerlProgram(iPerl, prog);
boucle(iPerl);
Exécution
Début d'exécution du programme Perl <<cours4b/perl/lib1.pl>>
<<sous-programme boucle>>
109876543210
13
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.3. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Exemple 3 – Passage de paramètres (1)
sub ssChaineG {
my($s, $n) = @_ ;
return substr($s, 0, $n);
}
14
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.3. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Création et utilisation d’une pile Perl
string ssChaineG(PerlInterpreter *my_perl, string s, int n) {
dSP ; ENTER ; SAVETMPS ; PUSHMARK(SP) ; // création de la pile
XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); // string empilé
XPUSHs(sv_2mortal(newSViv(n)));
// entier empilé
PUTBACK ;
call_pv("ssChaineG", G_SCALAR);
// lancement du sous-programme
SPAGAIN;
string res((char*)POPp);
// résultat dépilé
PUTBACK; FREETMPS ; LEAVE ; return res; }
15
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
1.1.3. APPEL DE PROGRAMMES ET DE SOUS-PROGRAMMES PERL EN C++
Exemple d’exécution
int main (int argc, char* argv[]) {
PerlInterpreter *iPerl = CppToPerl(true);
string prog("cours4b/perl/lib1.pl");
CallPerlProgram(iPerl, prog);
string s("maison rouge");
cout << ssChaineG(iPerl, s, 4) << endl;
}
<<ssChaineG>>
mais
16
Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié
Téléchargement