Interopérabilité des composants logiciels. Application à la modélisation des plantes C. Pradal EPI INRIA VirtualPlants
Plan Contexte Interopérabilité Langage de programmation Composants logiciel Plateformes Application OpenAlea, plateforme de modélisation des plantes
Interopérabilité entre logiciels Interoperabilité entre logiciels Possibilité qu on deux logiciels de fonctionner et de communiquer ensemble Pourquoi? Partage des données et des logiciels Accroitre la vitesse de développement Qualité (fiabilité, maintenance) Difficultés: Hetrogénéité (OS, languages, licenses, ) Abscence de standardisation (éléctronique, )
Différents types d interopérabilité Interoperabilité entre Langages (C, C++, Java, Python, Fortran, C#) Composants ou objets Plateforme ou environnement logiciels Systèmes distribués (web 2.0, Grid)
0.3 0.2 0.1 0 0 20 40 0.3 0.2 0.1 0 0 20 40 p ii 0 1 0 1 2 2 3 0.3 0.3 0.3 0.2 0.2 0.2 0.1 0.1 0.1 0.3 0 0 0 0.2 0 20 40 0 20 40 0 20 40 0.1 0 0 20 40 0 0 1 1 2 0 1 0 1 2 3 4 5 Software Components for programmers Interoperable Software Components for modellers Interoperable Software Components for programmers Monolithic Software http://www.scripps.edu/~sanner/
Plusieurs stratégies 1. Construire le meilleur modèle (efficacité et simplicité) pour chaque nouvelle situation 2. Un modèle général et unifié question model platform 3. Définir les concepts et les phénomènes commun, et partager les fonctionnalités élémentaires: Commune à différentes situations Extensible
Interopérabilité en science Visualisation Biophysic Ecophysiology Statistical analysis Spatial analysis Modeling Computer science Simulation... Software engineering
Solution «classique» Visualisation Biophysic Statistical analysis Dévelopment rapide N 2 interfaces Ecophysiology Spatial analysis Modeling Simulation Faible interoperabilité Pas de réutilisation de code... Computer science Software engineering
Philosophie UNIX
«Application» centrée + Réutilisation du code par modularité Langages OO - «auto-centrée»: données, types,api Faible interopérabilité entre applications Visualisation Biophysic Ecophysiology Statistical analysis Modeling Kernel Spatial analysis Computer science Simulation Software engineering
Langage d assemblage (glue) Langage de haut-niveau comme environnement Interactif Dynamique Multi Platforme http://www.scripps.edu/~sanner/
Interoperbilité entre langages
Interoperabilté entre langages Langages compilés C vs C++ Fortran (f2c) Java (JNI).Net Langages interprétés Python, Ruby, Perl (C) Langages spécialisés R, matlab, scilab (C) // C++ code extern C { # include «c_code.h» }
Gateways to other frameworks Langage «glue» Scientific modules Very rich set of specialized generic modules Several GUI toolkits NumPy SciPy XML R PyQt GUI JEmbed Boost, SWIG f2py math shell Java Classes C++ Classes, C Code Fortran Code Very rich set of Python standard modules
Outils de wrapping Statique (C, C++, fortran) Boost.Python SWIG (Python, Java, ) SIP (PyQt) f2py Dynamique / Automatiques Ctypes Java, R,
Exemple: SWIG Fichier d interface lib.i SWIG Fichier d extension C lib_wrap.c Le développeur écrit lib.i compile Bibliothèque C *.c *.h compile Module d extension Python libmodule.so libmodule.dll
SWIG - Exemple fact.h #ifndef FACT_H #define FACT_h example.i // Définit le nom du module %module example int fact(int n); #endif fact.c #include fact.h int fact(int n) { if( n <= 1 ) return 1; else return n*fact(n-1); } #endif // Indique le code qui sera // inclut en haut du fichier // d extension %{ %} #include «fact.h» // Définition de l interface. %include «fact.h» Appel en Python >>> from example import * >>> n=fact(4) >>> print n 24
Boost.Python - Exemple World.h // C++ class class World { // hellomodule.so sous UNIX World(std::string msg): _msg(msg) // hellomodule.dll sous Windows {} void set(std::string msg) { this->_msg = msg; } Appel en python std::string greet() { return _msg; } std::string _msg; }; World.i // Boost C++ Wrapper #include <boost/python.hpp> using namespace boost::python; BOOST_PYTHON_MODULE(hello) { class_<world>("world", init<std::string>() ).def("greet", &World::greet).def("set", &World::set) ; } // Compilation + // génération d une shared library >>> import hello >>> planet = hello.world() >>> planet.set( CATI') >>> planet.greet() CATI
Exemple PlantGL (Boost.Python) Meristem simulator Python Hemispheric view
Interopérabilité entre langages Avantages Permet la réutilisation (e.g. LAPACK) Facilite l expérimentation (langage interprété) Composition dynamique de composants C++ Réutilisation des modèles existants Améliore la diffusion Limites Coûteux en temps de développement Refactoring souvent nécessaire Application -> bibliothèque
Interopérabilité entre composants
Interopérabilité entre composants Réutilisation des algorithmes => Séparation data structures / algorithmes Programmation orientée objet Classe abstraites (ABC): Polymorphisme par héritage Fonction génériques (argument: ABC) A* sum(array< A* > v) {for } Résolution lors de l execution Spécialisation des templates
Interopérabilité entre composants Programmation générique Polymorphisme paramétrique template < typename A > A sum( array<a> v) {} L héritage n est plus nécessaire Le paramètre doit adhérer à un concept: Contraintes syntaxique et sémantique Résolution à la compilation Constat Performance maximum Grande complexité (Boost, CGAL)
Interopérabilité entre composants Langage dynamique : Duck Typing Le type d un objet est déterminé par l ensemble de ses méthodes et de ses attributs La résolution se fait à l execution a, b = 1, 2 sum(a,b) == 3 a, b = [1,2], [3,4] sum(a,b) == [1,2,3,4] Constat Performance min Flexibilité max
Communication entre composants Types Python Dynamique + Copie liste, dictionnaire, tableaux multi-dimensionels (NumPy) Data Structure partagées Dynamique + no Copie Objets en Python sont des références Python Fichiers ou pipes - Statique XML, data-base,... Communication avec des applications externes (LStudio, Grogra, Lignum,...) Python Primitives (a) Viewer PlantGL (C++) MTG* (b) MTG AMAPmod (C++)
OpenAlea
Le projet OpenAlea Communauté scientifique «libre» Choix d une licence libre pour OpenAlea Développement distribué (Coding Sprint) Langage de modélisation (Python) Langage commun pour expérimentation Assemblage de composants Architecture modulaire Système à composants Composition dynamique (dataflow) Programmation visuelle Génération automatique de la GUI Réutilisation intuitive Qualité logicielle Méthode et outils de développement Portabilité MTG Statistic 3D Viewer Ecophysiology Graph Graph Graph Ligh Ligh Ligh t Biophysic ODE New Me thod Your Me thod Simulation
Deployment Tools Visualea OpenAlea Architecture GUI PyQt4 Component framework Component Package Manager Dataflow Python Library Existing Models JEmbed Numeric SciPy Boost, SWIG Python XML f2py Database math GUI GUI shell C, C++, Fortran Java Classes C++ Classes, C Code Fortran Code
Visual Programming Dataflow Package Manager Widgets Component Python Interpreter
Définition d un noeud Simple fonction Python Arguments multiples I/O (ports) Port name : nb_plants Interface : IInt Interface typée Documentation
Widgets réutilisables Générés automatiquement A partir de l interface des ports d entrés Int, Float, String, File, Color, List, Dict, Widgets spécifiques Ajout dynamique de nouveaux widgets Plot 2d, Plot3d Editeur complexe,
Environnement de dév. intégré Création de Package Edition d un noeud
Interopérabilité entre plateformes
Plateformes à composants Plateforme Propose un ensemble de services Intégration, introspection, Permet d offrir une interface unifiée Méthodologie commune Règles de diffusion, Description des composants, Composition des composants Orchestration de l activation et de la communication entre les composants
Connexion OpenAlea - DTK E. Moscardi et al. J.Wintz and Asclepios INRIA
OpenAlea - DTK
OpenAlea / GroIMP Communication Client/Serveur (http et xml) GroIMP, Kniemeyer et. al.,
OpenAlea / L-système LStudio, Prusinkiewicz et. al. L+Py, Boudon et. al.
Guidelines: Méthode agile
Guidelines Complexité inhérente Différents langages Différents outils (compilateurs, wrappers, ) Simplifier et automatiser Déploiement (compilation, installation) Intégration continue Composants et GUI Assemblage de composants hétérogènes Objectif vitesse
Communauté libre Licence libre Kernel : CeCILL-C Visualea: CeCILL Composants: Choix d une licence libre ou non Animation de la communauté «Coding sprint» pour les architectes «Modeling sprint» pour architectes / modélisateurs Développement collaboratif gforge Documentation et code accessible à tous Serveur d intégration continu
Animation - Coding Sprint Sprints Hackatons d OpenBSD (1999) Apparus dans le monde Python vers 2003 (Zope3) Méthode (XP) Salle commune Programmation en binôme Cycle TDD (Test driven development) Ecriture des tests Documentation (API) Développement svn commit Refactoring
Modeling Sprints Public Biologistes (modélisateurs et utilisateurs) et informaticiens Objectifs Intégration des modèles Test de la plateforme par des utilisateurs Pratique Entre 1 et 3 jours Présentation et formation des biologistes Utilisation de la plateforme avec des données réelles Intégration des modèles, réalisation de tutoriaux Développement et débogage d OpenAlea en fonction des retours utilisateur
Modeling Sprint (suite) Intérêts Utilisateur Certains problèmes soulevés par l utilisateur sont corrigés rapidement. L utilisateur peut agir sur le développement de son outil. Formation privilégiée. Développeur Retour concret de l utilisateur (installation, ergonomie, fonctionnalités). Expression des problèmes. Evolution de la plateforme en fonction du besoin.
Conclusions Python Intégration de composants hétérogènes Langage de modélisation Assemblage dynamique de composants Dataflow, Programmation visuelle Flexible et extensible Multi-domaine (plant architecture, meristem, ) Doit être simple d utilisation Communication entre plateformes Echange dynamique de composants