Lot 1.1-1
Transcription
Lot 1.1-1
Assemblage de composants par contrats État de l'art et de la standardisation Auteur : Projet ACCORD (Assemblage de composants par contrats en environnement ouvert et réparti)* Référence : Livrable 1.1 - 1 Date : Juin 2002 * : Les partenaires du projet ACCORD sont CNAM, EDF R&D, ENST, ENST-Bretagne, France Telecom R&D, INRIA, LIFL et Softeam. Le projet est conjointement financé par les partenaires et par le RNTL (Réseau National des Techniques Logicielles). © Projet ACCORD 1/29 Sommaire 1 2 3 4 5 6 7 Introduction ........................................................................................................................ 3 Concepts............................................................................................................................. 4 2.1 Composant ..................................................................................................................... 4 2.1.1 Interface et service ................................................................................................. 4 2.1.2 Spécification et contrat........................................................................................... 4 2.1.3 Assemblage et connecteur...................................................................................... 5 2.1.4 Granularité.............................................................................................................. 5 2.1.5 Structure d’accueil ................................................................................................. 6 2.1.6 Différentes catégories de composants.................................................................... 6 2.2 Contrat............................................................................................................................ 6 2.3 Assemblage .................................................................................................................... 7 2.3.1 Langages de description d’architectures ................................................................ 7 2.3.2 Langages de coordination ...................................................................................... 9 Standards .......................................................................................................................... 11 3.1 Outils de spécification/modèles ................................................................................... 11 3.1.1 Le modèle de composant d’UML 2 ..................................................................... 11 3.1.2 ODP...................................................................................................................... 13 3.2 Structures d’accueil...................................................................................................... 15 3.2.1 EJB 2.0 ................................................................................................................. 15 3.2.2 CCM..................................................................................................................... 17 3.2.3 .NET ..................................................................................................................... 19 Conclusion ....................................................................................................................... 20 Annexe ............................................................................................................................. 22 Bibliographie.................................................................................................................... 24 Liens Internet ................................................................................................................... 26 © Projet ACCORD 2/29 1 Introduction L'origine de l'utilisation de composants logiciels ne fait pas l'unanimité. Certains, comme Ivar Jacobson dans la préface de [HC01], pensent que l'utilisation de composants pour construire des systèmes logiciels n'est pas une idée nouvelle et que nous avons toujours eu affaire à des composants logiciels de différentes sortes. D'autres, comme les auteurs de [WHS02], situent l'utilisation des composants à la fin des années 70 comme une réponse à la deuxième crise du logiciel provoquée par l'introduction à grande échelle des micro-processeurs. Il a fallu alors produire des logiciels de meilleure qualité et de façon plus rapide et moins coûteuse. À cette époque, une nouvelle discipline du génie logiciel émerge : le CBSE (Component-Based Software Engineering). Elle est portée notamment par un centre de recherche créé par le gouvernement fédéral américain et exclusivement dédié au génie logiciel : le SEI (Software Engineering Institute). Il est indéniable que la tendance vers le développement à base de composants s'est imposée depuis une quinzaine d'années, au moins en ce qui concerne les composants techniques disponibles commercialement dans les domaines tels que la gestion de l'information (systèmes de gestion de bases de données, systèmes géographiques, systèmes de gestion de données techniques) et les intergiciels (moniteurs transactionnels, systèmes répartis à objets, messageries inter-applications). Les bénéfices attendus de l'utilisation de composants logiciels sont a priori clairs et trouvent une analogie souvent utilisée dans l'industrie automobile. Il s'agit essentiellement de réduire les coûts de production des logiciels, mais aussi d'en réduire les coûts de maintenance et d'en favoriser la réutilisation. Cette démarche est résumée par Fred Brooks [WHS02], de la société IBM : "buy before build" et "reuse before buy". Néanmoins, cette démarche n'est pas toujours facile à suivre dans la pratique. En effet, l'assemblage des "pièces" logicielles pour constituer une application efficace et facile à utiliser nécessite un travail qui peut s'avérer fastidieux car il met en cause deux parties, dans ce contexte, dissociées : les producteurs et les consommateurs des composants logiciels. De plus, les composants, et plus particulièrement les composants commerciaux, sont souvent complexes (même les experts n'en connaissent pas toutes les capacités fonctionnelles) et instables (ajout fréquent de nouvelles fonctions au composant pour qu'il reste compétitif par rapport à la concurrence). Par ailleurs, selon [WHS02], il existe également un écart indéniable entre théorie et pratique dans les méthodes de conception de systèmes fondés sur les composants. En effet, la plupart des théories s'appuient sur des techniques de spécification de composants logiciels alors que, la plupart du temps, les composants existent déjà. Il semble donc apparaître une contradiction entre d’une part une conception architecturale qui permettrait de déterminer précisément comment le système est partitionné en composants, quelles fonctions sont offertes par chaque composant et comment les composants coordonnent leurs activités, et d’autre part l'utilisation de composants préexistants qui induirait une perte de contrôle sur ces décisions de conception fondamentales. En réalité, deux classes de problèmes de conception doivent co-exister : les décisions de sélection d'un composant préexistant et les décisions d'optimisation de © Projet ACCORD 3/29 l'architecture lorsqu'il est possible d'intervenir sur les interfaces des composants. C'est l'articulation entre ces deux points de vue qu'il faut bien maîtriser. Le présent document a été réalisé dans le cadre du projet ACCORD (Assemblage de Composants par Contrats en environnement Ouvert et Réparti). Il est constitué de deux parties correspondant respectivement à un état de l'art et à un état de la standardisation dans le domaine de l'assemblage de composants logiciels par contrats. La première partie présente les principaux concepts manipulés dans le cadre du projet ACCORD - composant, contrat et assemblage – successivement dans cet ordre même s'il est, en réalité, difficile de dissocier ces trois notions. La deuxième partie décrit la prise en compte des concepts présentés dans la première partie dans les standards de spécification et de structures d’accueil pour composants et assemblages de composants. Ces deux aspects sont importants pour le projet ACCORD qui s’intéresse particulièrement aux aspects de spécification mais vise également à faciliter la mise en œuvre opérationnelle sur des plates-formes EJB et CCM. La conclusion contient une synthèse ainsi que les choix de concepts et de standards effectués dans le projet ACCORD. 2 Concepts Les concepts introduits dans cette partie sont loin de posséder une définition consensuelle. Nous présentons donc une liste d’idées générales qui sont couramment évoquées dans le contexte des composants logiciels. Nous insisterons en particulier sur les notions d’assemblage et de contrat qui sont indissociables de celle de composant. Nous avons souhaité cette partie objective en réservant à la conclusion de proposer les interprétations retenues dans le cadre du projet ACCORD. 2.1 Composant La notion de composant logiciel n’a pas encore reçu une définition aussi complète et communément acceptée que celle d’objet. Cependant, la communauté scientifique s’accorde sur un certain nombre de caractéristiques propres à l’approche composant. De manière générale, un composant est un logiciel qui rend un service au moyen d'une ou de plusieurs interfaces externes. Un composant a vocation à être intégré dans plusieurs application. Pour cela, il doit être suffisamment autonome et comporter toutes les informations lui permettant d’être assemblé par un tiers, éventuellement avec d’autres composants. Un composant réutilisable (composant sur étagère ou COTS) est un code compilé ou binaire et doit renfermer toutes les informations nécessaires à son déploiement dans un environnement donné. 2.1.1 Interface et service Le service offert par un composant est défini au travers de plusieurs interfaces. Ces interfaces externes sont associées aux différentes facettes de l'activité du composant (interface métier, interface de configuration, de maintenance, ...). Par ailleurs, un composant s’appuie sur d’autres composants pour fonctionner. À cette fin, un composant définit des interfaces requises (les interfaces dont il a besoin dans le cadre de son exécution). Ces interfaces doivent être connectées à des interfaces offertes par d'autres composants. 2.1.2 Spécification et contrat Dans l’optique de réutilisation et d'intégration d’un composant logiciel, il est indispensable de comprendre très précisément ce que fait ce composant. Ceci implique d’associer au composant des spécifications précises tant fonctionnelles que non- © Projet ACCORD 4/29 fonctionnelles. Ces spécifications décrivent les services offerts par le composant, mais aussi ceux dont il a besoin pour fonctionner. Elles représentent l’ensemble des contraintes que le composant impose à ses utilisateurs, ainsi que celles venant de son environnement qu’il s’impose de respecter. L'environnement possède des propriétés qui ont une influence sur le fonctionnement du composant. Il peut s’agir de propriétés temporelles (vitesse d'exécution), des propriétés sur les modes de panne ou sur les attaques possibles en termes de sécurité. Les spécifications doivent également porter sur les comportements du composant associés à ces traitements non-fonctionnels. Les contraintes d'environnement comportent également le type de plate-forme (matériel, système d'exploitation, architecture réseau, conteneur) dans laquelle le composant doit s'exécuter. Ces spécifications sont, contrairement aux types abstraits algébriques, rarement complètes. Le terme de contrat est de plus en plus utilisé pour décrire les propriétés nécessaires au bon fonctionnement du composant. Une classification de niveaux de contrats est présentée en 2.2. Chaque composant est ainsi spécifié par deux types de contrat : un unique contrat d’utilisation qui précise les services qu’il offre et qu’il requiert ; des contrats d’implantation qui décrivent les contraintes et les propriétés requises de l’environnement. Les contrats d’implantation doivent naturellement satisfaire au contrat d’utilisation. En résumé, l’existence de spécifications précises permet à une nouvelle application d’être construite rapidement par assemblage de composants préexistants mais également de faire face aux évolutions ou aux extensions d’une application existante par le remplacement de certains composants. 2.1.3 Assemblage et connecteur Un composant logiciel est une unité de réutilisation et d'intégration. Il est donc conçu pour fonctionner en coopération avec d’autres composants. Pour cela, il faut réaliser l’étape de composition ou d’assemblage d’un ensemble de composants caractérisés essentiellement par leurs interfaces offertes et leurs interfaces requises. La notion de connecteur recouvre l’ensemble des moyens nécessaires pour assurer l’interaction entre les composants par la connexion des interfaces requises et offertes. Ces moyens peuvent être vus à deux niveaux. La spécification des propriétés des interfaces requises et des interfaces offertes peut être utilisée pour définir les connecteurs sur un plan conceptuel. Dans ce premier cadre, un connecteur est vu comme la spécification d’un mode de communication. Dans un second temps, si nécessaire, le connecteur est implanté par un ensemble de moyens logiciels et matériels réels et assure concrètement l'adaptation des propriétés requises aux propriétés offertes (par exemple pour adapter le typage de certains paramètres, pour réaliser un protocole de communication). En termes de séparation des préoccupations, il est souhaitable de ne pas faire apparaître les traitements associés aux fonctions des connecteurs dans les composants mais d’en faire des entités bien distinctes. 2.1.4 Granularité La granularité des entités logicielles concerne leur taille et plus encore leur mode de gestion plus ou moins indépendante. De par son objectif de réutilisation, un composant doit être considéré dès la phase d’analyse. L’approche objet privilégie des entités logicielles de grain moyen (comme des objets habituels ou des fichiers) ou de grain fin (comme des variables). Bien qu’il n’existe pas de règles très strictes concernant la granularité d’un composant, il est préférable de considérer qu’un composant est plutôt © Projet ACCORD 5/29 une entité logicielle de grain gros. Un composant possède plutôt un volume de code significatif mais surtout il doit pouvoir être déployé et géré indépendamment des autres composants. Ceci amène à lui associer des caractéristiques en propre (caractéristiques de désignation, de protection, de gestion de ressources …) alors que dans les approches objet de grain fin ou de grain moyen ces caractéristiques sont peu ou prou partagées par des ensembles ou grappes d’objets. 2.1.5 Structure d’accueil Une fois construits et assemblés, les composants sont déployés. La structure d’accueil correspond à l’environnement système dans lequel les composants sont installés, instanciés et activés. Il peut s’agir d’un système d’exploitation « généraliste », ou d’un environnement dédié à un certain modèle de composant. Dans ce dernier cas, l’environnement est appelé généralement structure d’accueil. Nous en verrons dans la partie 3.2 quelques exemples standardisés comme EJB (‘Enterprise Java Beans’), CCM (‘CORBA Component Model’) et .Net. 2.1.6 Différentes catégories de composants Au plan conceptuel, on peut différencier les composants boîte noire et les composants boîte blanche. Les composants boîte blanche sont fournis en code source et sont donc modifiables avant intégration. Les composants boîte noire, à l’inverse, sont des codes compilés ou binaires ; leurs fonctionnalités ne sont accessibles qu’au moyen de leurs interfaces publiques et ils ne peuvent être modifiés directement. Pour étendre ou redéfinir certaines de leurs fonctionnalités, il est nécessaire d’utiliser des adaptateurs. Une solution intermédiaire entre les deux précédentes consiste à considérer des composants boîte grise. Dans ce cas, un sous-ensemble des modalités de fonctionnement d’un composant serait ouvert à la modification au moyen d’un ensemble de mécanismes prédéfinis. Les composants sur étagères (COTS – commercial off the shelf component, Open Market Component) sont des produits qu’il est possible d’acquérir indépendamment d’un service support, d’intégration ou autre. Ce sont des composants binaires déployables qui sont basés sur une architecture standard suffisamment répandue pour correspondre à un marché significatif. Les composants peuvent également être considérés plutôt comme des services c’est-àdire réutilisables sous la forme installée du composant. Dans ce cas, un environnement d’exécution est offert par le fournisseur du composant sur l’un de ses serveurs. Dans les deux cas précédents, toute approche composant se doit d’offrir un moyen de rechercher et de trouver en ligne des composants sur étagères ou déployés qui conviennent pour construire une application. Un exemple de standard récent pour traiter ce problème est donné par le protocole et la base de données distribuées UDDI des Web Services. Enfin, les composants métier se distinguent des composants non-métier ou système. Les premiers sont développés dans le cadre d’une profession ou d’une entreprise et satisfont des besoins liés aux activités d’un utilisateur. Les seconds sont des composants développés pour résoudre un problème correspondant à un besoin rencontré par un ensemble d’applications de métiers différents (composants de communication, de sécurité, de persistance transactionnelle, …). 2.2 Contrat La spécification d’un composant se traduit par un ensemble de contrats qui définissent le plus précisément possible ses exigences et ses aptitudes. Nous présentons ici une classification des niveaux de contrat. © Projet ACCORD 6/29 Les composants promettent d’encapsuler des parties de système sans demander à leurs utilisateurs de connaître les détails de leur réalisation. Toutefois, ceci n’est possible que si le niveau de description de ce qu’est le composant - de ce qu’il fait et sous quelles hypothèses - est suffisant. Cette description est, de plus en plus fréquemment, appelé le contrat d’utilisation du composant. Lorsqu’un composant est assemblé avec d’autres, leurs contrats d’utilisation sont confrontés, négociés et parfois adaptés pour satisfaire aux différentes hypothèses et contraintes. Cette phase peut être réalisée automatiquement par un compilateur ou manuellement par les concepteurs du système en fonction de la richesse du contrat. Un contrat peut en effet se décomposer en quatre niveaux qui dans la pratique se traduisent par des règles d’assemblages de moins en moins automatisables. 1) Le premier niveau assure que l’assemblage structurel se déroulera bien. 2) Le deuxième décrit pour chaque service offert les conditions d’utilisation et le résultat attendu. 3) Le troisième garantit qu’en cas d’utilisation concurrente le fonctionnement sera correct. 4) Le quatrième niveau précise les conditions quantitatives d’utilisation du composant en termes de qualité de service. Les trois premiers niveaux caractérisent le comportement qualitatif du composant. La plupart des spécifications de composant actuelles (EJB, CCM, .NET) reposent uniquement sur le premier niveau qui assure le typage correct des interfaces offertes et requises (même nom de service, même nombre d’arguments, mêmes types, mêmes exceptions, etc.) Certains langages, comme Eiffel, permettent une description des services au niveau deux, en intégrant dans leur syntaxe des préconditions et des postconditions qui décrivent les services. Ces éléments de contrat sont utilisés défensivement à l’exécution pour lever des exceptions en cas de rupture de contrat et non pas préventivement par des outils de preuves ou de compilation sophistiqués. Sous réserve d’atomicité d’exécution des services, le contrat de niveau deux suffit pour garantir le bon fonctionnement du composant. Toutefois, certaines implantations d’objet ou de composant incluent du parallélisme et les hypothèses d’atomicité ne sont pas toujours garanties. C’est le rôle du niveau trois des contrats de décrire les hypothèses de concurrence acceptées par les composants. Enfin, le niveau quatre précise quantitativement le fonctionnement du composant. Le contrat spécifié doit, lors de l’assemblage, être confronté aux autres contrats d’utilisation pour être accepté tel quel, adapté lors de l’assemblage ou mieux encore, négocié et adapté dynamiquement en cours de fonctionnement du système. Ce dernier point s’applique au niveau quatre pour de l’adaptation de qualité de service, mais aussi aux trois niveaux qualitatifs lors des évolutions du système. Finalement, la même notion de contrat permet de caractériser les contraintes d’assemblages des composants (contrat d’utilisation ou d’usage) mais aussi les dépendances vis-à-vis du système pour la mise en œuvre (contrat d’implantation). 2.3 Assemblage Un composant est destiné à être relié avec d’autres ; l’opération consistant à définir ces relations est l’assemblage. Les deux principales approches actuelles sont les langages de description d’architectures et les langages de coordination. 2.3.1 Langages de description d’architectures La définition d’une architecture logicielle est une étape importante dans la conception d’un logiciel. Elle permet d’avoir un niveau d’abstraction élevé et de disposer de modèles qui s’approchent du modèle mental du développeur. Une architecture logicielle © Projet ACCORD 7/29 décrit l’ensemble des composants qui le composent et donne les règles de leur assemblage. Elle permet la conception d’applications en se détachant de détails techniques propres à l’environnement et en respectant les conditions fixées par les futurs utilisateurs. Elle correspond à l’établissement du plan de construction du logiciel. En maîtrisant l’architecture conceptuelle, il est alors plus facile de gérer ses éventuelles évolutions. En effet la modification d’un plan est plus simple que la modification d’un système réalisé. Afin de répondre à ce besoin de description d’architecture, de nombreux travaux ont été menés par la communauté scientifique dès le début des années 90. Ces travaux concernent la définition de langages de description d’architecture (Architecture Description Languages ou ADL) [SG96] [GP95]. Cette partie a pour objectif de présenter un rapide survol des formalismes proposés. Une version plus détaillée est disponible dans [SD02]. Dans un premier temps, nous définissons les concepts généraux des ADL. Dans un second temps, nous faisons un tour d’horizon des différentes propositions. 2.3.1.1 Composant, connecteur et configuration Les concepts que nous retrouvons dans les différents langages de description d’architecture sont au nombre de trois. Le premier est le composant, le deuxième le connecteur, et le dernier la configuration ou encore la topologie. Ils ont été définis par des spécialistes de l’architecture logicielle. Un composant Un composant est une unité de calcul ou de stockage à laquelle est associée une unité d’implantation. Il peut être simple ou composé ; on parle alors dans ce dernier cas de composite. Sa taille peut aller de la fonction mathématique à une application complète. Deux parties définissent un composant. Une première partie, dite externe, comprend la description des interfaces fournies et requises par le composant. Elle définit les interactions du composant avec son environnement. La seconde partie correspond à son implantation et permet la description du fonctionnement interne du composant. Cette définition est compatible avec celle donnée en 2.1. Un connecteur Le connecteur correspond à un élément d’architecture qui modélise de manière explicite les interactions entre un ou plusieurs composants en définissant les règles qui gouvernent ces interactions. Par exemple, un connecteur peut décrire des interactions simples de type appel de procédure ou accès à une variable partagée, mais aussi des interactions complexes telles que des protocoles d’accès à des bases de données avec gestion des transactions, la diffusion d’événements asynchrones ou encore l’échange de données sous forme de flux. Un connecteur comprend également deux parties. La première correspond à la partie visible du connecteur qui permet la description des rôles des participants à une interaction. La seconde partie correspond à la description de son implantation. Il s’agit là de la mise en œuvre du protocole associé à l’interaction. Une configuration Composants et connecteurs sont des types pouvant être instanciés et assemblés à partir de leurs interfaces pour former une configuration. On parle aussi de topologie ou de composite. La configuration structurelle de l’application correspond à un graphe connexe des composants et des connecteurs formant l’application. La configuration comportementale, quant à elle, modélise le comportement en décrivant l’évolution des liens entre composants et connecteurs, ainsi que l’évolution des propriétés non fonctionnelles comme les propriétés spatio-temporelles ou la qualité de service. Un langage de contraintes accompagne souvent le langage de description d’architectures pour décrire les règles de composition. © Projet ACCORD 8/29 2.3.1.2 Les principaux ADL Les travaux sur les ADL ont été un domaine très actif et de nombreuses propositions ont émergé [MT00] au milieu des années 90. Ces travaux correspondent à la définition de langages dits déclaratifs. Ils peuvent être classés en deux grandes familles. La première correspond aux langages qui privilégient la description des éléments de l’architecture et leur assemblage structurel. Les langages de cette famille sont accompagnés d’outils de modélisation, d’analyseurs syntaxiques et de générateurs de code. La seconde définit les langages qui se centrent sur la description de la configuration d’une architecture et sur la dynamique du système. Les langages de cette famille, en plus de d’outils de modélisation et de génération de code, sont associés à des plates-formes d’exécution ou de simulation d’un système. Chaque ADL a une particularité. Wright [AG97] se distingue par les descriptions comportementales à l’aide de CSP, Rapide [RDTP97] par la définition de simulation, Aesop [Gar95] par la description de styles d’architecture, C2 [MTW96] par les environnements répartis et évolutifs et Darwin [DKM93] par la description des aspects dynamiques. Ce grand nombre de propositions a amené plusieurs classifications et comparaisons. La plus intéressante reste celle proposée par [MT00] qui fournit un cadre de comparaison pour les ADL actuels et à venir. De plus, plusieurs méta-langages, tels que ACME [GMW97] ou ADML [ADML00] proposent une représentation intermédiaire exploitable par les outils architecturaux des différents ADL. Un vocabulaire commun pour les éléments de la structure a été fixé et permet ainsi le passage d’un ADL à l’autre. 2.3.1.3 Tendances La définition de l’architecture est une étape importante dans la conception d’un logiciel. Elle doit permettre la réalisation d’un produit qui répond aux besoins des utilisateurs, mais qui est également évolutif. Malgré ces deux caractéristiques essentielles, la pratique veut que cette étape soit encore souvent oubliée ou traitée de manière partielle. Même si le besoin est là pour les industriels avec l’arrivée des grandes applications réparties, les ADL issus des milieux académiques n’ont pas réussi à percer. Il leur est souvent reproché d’utiliser des notations formelles difficilement manipulables et d’avoir des outils peu exploitables. Actuellement, nous pouvons dire que les recherches sur les ADL changent d’orientation. En effet, les ADL sont issus de la communauté des architectes logiciels et définissent une technologie parallèle à celle développée dans le monde objet. Dans ce dernier, il est courant d’utiliser UML comme langage de modélisation, même si celui-ci reste pauvre en concepts d’architecture. Les deux communautés ne se sont pas concertées pendant plusieurs années, mais aujourd’hui, avec l’apparition de travaux comme ArchJava [ACN02] ou l’intégration de la notion de composant dans UML 2.0, nous assistons à une convergence des deux mondes. De plus, des travaux tels que CODeX [Mar01] ou ArchJava touchent à la définition d’architecture sous différents angles tout en étant associés à une plate-forme d’exécution à base de composants, ce qui laisse présager un environnement intégrant la définition d’architectures et un passage facilité vers une plate-forme d’exécution adaptée. 2.3.2 Langages de coordination Les applications actuelles profitent des systèmes parallèles et distribués pour offrir de meilleures propriétés non-fonctionnelles (passage à l’échelle, fiabilité, disponibilité, etc.). Cependant, le développement de telles applications reste complexe et la présence de multiples sites ajoute un nouveau défi : la coordination de la coopération d’un grand nombre d’activités concurrentes actives. De ce fait, la programmation d’un système © Projet ACCORD 9/29 parallèle ou réparti pourrait être vue comme une combinaison de deux activités distinctes : la partie calcul comprenant un nombre de processus impliqués dans la manipulation des données, et la partie coordination responsable de la partie communication et coopération entre les processus. Cette approche rend les modules plus indépendants, permet l’évolution d’applications en modifiant seulement les éléments concernés et non en intervenant sur toute l’application. Ainsi, elle permet de réutiliser d’une part les objets sans la façon dont ils sont coordonnés, et d’autre part les entités de coordination sans les objets à coordonner [AP98]. Cette théorie a conduit à la proposition d’un grand nombre de modèles de coordination et de leur langage de programmation associé. Avant d’en faire un survol, nous allons préciser quelques concepts de base. 2.3.2.1 Coordination, modèles et langages La coordination n’est en aucun cas limitée à l’informatique. Dans [MC94], la coordination est décrite comme un domaine de recherche émergeant avec une concentration interdisciplinaire, jouant un rôle clé dans diverses disciplines telles que l’économie, la recherche opérationnelle, la théorie de l’organisation et la biologie. En conséquence, il existe plusieurs définitions de ce qu’est la coordination. Mais d’un point de vue informatique, la coordination est définie des façons suivantes : Une information additionnelle de traitement exécutée lorsque de multiples acteurs connectés ont des buts qu’un seul acteur, ayant les mêmes buts, ne peut pas atteindre [MC94], L’intégration et l’ajustement harmonieux des efforts de travaux individuels à travers la réalisation d’un objectif plus large [Sin92], Le processus de construction de programmes en collant ensemble des pièces actives [CG92]. La coordination peut être exprimée en termes de modèles et langages de coordination. Cependant, une différence existe. Un modèle de coordination se définit par «la glu qui relie des activités séparées dans un ensemble » [CG92]. Il est généralement caractérisé par trois éléments : les entités à coordonner, le médium qui définit le lieu où se fait la coordination, et le type de coordination qui est la technique utilisée pour coordonner les entités. Un langage de coordination, par contre, est « l’incarnation linguistique d’un modèle de coordination » [CG92]. Un modèle de coordination fournit donc la sémantique, alors qu’un langage de coordination correspondant fournit une syntaxe pour utiliser le modèle dans une implantation. 2.3.2.2 Les principaux langages de coordination Trois approches permettent de classifier les modèles et langages de coordination : les modèles orientés données, les modèles orientés événement et l’approche par composant. Les langages orientés données La plupart des modèles appartenant à cette catégorie ont évolué autour de la notion de la mémoire partagée. Dans ces modèles, l’activité est centrée autour d’un espace de données partagé ; l’application est essentiellement concernée par ce qui arrive aux données. Ils offrent généralement un ensemble de primitives à intégrer dans un langage de programmation. Ils sont, de ce fait, dits endogènes car les primitives qui affectent la coordination de chacun des modules sont à l’intérieur du module lui-même ce qui mène généralement au mélange des primitives de coordination avec le code de calcul. Ceci tend à éparpiller les primitives de coordination et de communication dans le code source rendant le modèle de coopération et le protocole de communication nébuleux et implicite. Le premier modèle conçu dans cette famille pour représenter la coordination est Linda [CG92]. Il a ensuite inspiré plusieurs autres langages comme ObjectiveLinda. © Projet ACCORD 10/29 Les langages orientés événement Dans les modèles orientés événement, l’activité dans l’application est centrée autour des traitements ou des flux de contrôle et souvent la notion de donnée n’est plus centrale. L’application est décrite comme une collection d’activités qui consomment leurs données en entrée et en conséquence produisent, mémorisent et transforment « les nouvelles données » qu’elles génèrent par elles-mêmes. Ces modèles sont dits exogènes, c’est-à-dire que les primitives qui affectent la coordination de chaque module sont à l’extérieur du module lui-même. Ces modèles encouragent le développement des modules de coordination séparément et indépendamment des modules de calcul qu’ils sont supposés coordonner. Par conséquent, le résultat de l’effort investi dans la conception et le développement du composant de coordination d’une application peut se manifester comme un « module de coordination pure » qui peut être plus facile à comprendre et peut aussi être réutilisé dans d’autres applications. Le langage de coordination est séparé de celui du calcul. Le langage le plus représentatif dans cette catégorie est Manifold [AHS93]. Une approche qui est différente de l’approche orientée événement mais qui s’inclurait dans cette catégorie est l’approche de [AF00]. Elle propose de séparer la coordination du calcul non pas sous la forme de processus mais sous forme de contrat. Toute la coordination est donc représentée sous forme de contrats ce qui permet, en modifiant cet ensemble de contrats, de faire évoluer les interactions. L’approche par composant L’approche par composant consiste à avoir un type de composant qui ne s’occupe que du calcul et un autre type de composant réutilisable qui s’occupe de la coordination des composants de calcul. Ceci ressemble fortement à l’approche orientée événement, à la différence que la mise en œuvre de la coordination n’est pas nécessairement le résultat d’une compilation de la coordination mais qu’elle est cachée dans le composant. De ce fait, seules les interfaces des composants apparaissent et la technique utilisée pour la coordination est indifférente. L’initiateur de cette approche est le langage Flo/c [Gün98], repris par les composants de communication ou médiums [Beu00] ainsi que par le modèle CoLas [CD99]. 3 Standards Un des attraits d’une architecture à composants est la possibilité de construire une application à partir de composants provenant d'origines diverses. Cela suppose la standardisation des éléments nécessaires à un tel assemblage, notamment pour garantir les trois propriétés caractéristiques d’un système ouvert : la portabilité, l’interopérabilité et l’interchangeabilité. Deux grandes orientations de standardisation sont menées : l’une concerne les outils de spécification et les modèles, et l’autre les infrastructures d’accueil. 3.1 Outils de spécification/modèles Dans le domaine des outils de spécification et de modèles utilisables dans une approche composant, nous allons considérer sont le standard Unified Modeling Language (UML) et la norme Open Distributed Processing (ODP). 3.1.1 Le modèle de composant d’UML 2 Le futur standard UML 2 propose un modèle de composant nettement amélioré par rapport à la version UML 1. © Projet ACCORD 11/29 3.1.1.1 Concepts Dans ce paragraphe, nous présentons les traits particuliers des composants en UML 2 et signalons les omissions particulières de ce modèle. Le méta-modèle d’UML 2 définit les entités suivantes dans les packages Structure::Components et Structure::Ports. Un composant (component) est une entité instanciable qui interagit avec son environnement par l’intermédiaire de ports et qui a une description de ce comportement fondé sur des machines à états. De manière interne, un composant est constitué de parties (parts) et peut inclure des connecteurs internes (pour connecter ensemble des sous-composants). Un port est une entité qui émerge d’un composant ; elle se comporte comme un point d’interaction du composant avec l’environnement. Les interactions peuvent être bi-directionnelles. Un port est typé par une interface. Un port peut être requis (required) pour signifier que l’instance du composant doit être connectée à un port correspondant de l’environnement (c’est-à-dire une autre instance de composant qui fournit le service demandé). Un port qui est non requis offre des services. Ces services offerts peuvent être utilisés ou non selon que le port associé est connecté ou non. Un connecteur (connector) est une entité qui relie des ports d’instances de composant. Une interface définit un type. Elle contient un ensemble d’opérations et/ou de contraintes. Une interface peut être attachée à un port fourni (provided) ou requis (required). Une partie (part) est un fragment interne d’un composant. 3.1.1.2 Assemblage Une application ou un composant est constitué de l’assemblage d’autres composants par l’intermédiaire de ports interconnectés. Un connecteur d’assemblage (AssemblyConnector) permet d’assembler deux instances de composants en connectant un port fourni d’un composant au port requis de l’autre composant. Un connecteur de délégation (DelegationConnector) permet de connecter un port externe au port d’un sous-composant interne. L’invocation d’un service sur le port externe sera transmise au port interne auquel il est connecté. FIG. 1 – Un exemple de connecteur d’assemblage (AssemblyConnector) Les composants doivent expliciter leurs besoins ainsi que leurs capacités. La proposition UML 2 définit des moyens d’indiquer qu’une entité dépend d’une autre à l’aide de la méta-entité Dependency. Les services d’un composant peuvent être invoqués seulement par l’intermédiaire des ports de ce composant. © Projet ACCORD 12/29 De plus, un composant peut décrire les interactions qui doivent se produire sur un port donné en attachant un comportement (par exemple, une machine d’états) à ce port. Ceci fournit une sorte de spécification de contrat de niveau 3 sur un port. Les ports peuvent être connectés seulement si leurs spécifications de comportement sont compatibles. 3.1.1.3 Evénement La plupart des modèles de composants incluent un mécanisme pour la signalisation d’événements entre le composant et son environnement. La proposition UML2 n’inclut pas de concepts spécifiques pour la signalisation d’événements aux composants mais s’appuie sur le concept de Signal déjà existant en UML. Il n’y a pas ??? de notion d’enregistrement en attente d’occurrence d’événements. Un cas particulier de modèle d’événement apparaissant dans certains modèles (par exemple Catalysis) inclut un concept de propriété où une propriété est une partie observable d’un état de composant avec un système de notification de changement incorporé. Cette notion de propriété n’est pas incluse dans le méta-modèle proposé (mais bien sûr pourrait être définie en utilisant le concept du package Behavior). 3.1.1.4 Flots La proposition UML ne prévoit pas de flots continus qui spécifieraient des propriétés globales (comme la performance) et/ou les items qui circulent dans le flot ne seraient pas observables (au moins à un haut degré d’abstraction). 3.1.1.5 Déploiement A un certain moment de son cycle de vie, un composant sera configuré et installé en tant que sous-ensemble d’une installation d’une application. La notion de composant de UML est indépendante de la plate-forme et des modèles de composants spécifiques. Donc, UML fournit des outils conceptuels pour projeter (mapper) les entités représentant les composants indépendants des plate-formes sur les entités spécifiques aux vendeurs et aux plate-formes. Un Artéfact (Artifact) représente une entité spécifique à une plate-forme (par exemple un fichier d’archive contenant du Byte Code Java) Un Nœud (Node) représente une entité capable d’héberger une exécution d’une instance de composant et de fournir des ressources de calcul et de mémoire. 3.1.2 ODP Open Distributed Processing est une norme conjointe de l’ISO et l’ITU dont le but est de structurer les concepts de base des systèmes et applications répartis. Elle vise à être un modèle de référence : plusieurs standards du domaine, et notamment ceux de l’OMG, s’inspirent et font référence à cette norme. Le modèle de référence de l’ODP est décrit en 4 parties : 1-Guide, 2-Fondations, 3-Architecture, et 4-Sémantique Architecturale. La partie 2-Fondations définit les concepts de base tel que objet, interface, action, point de vue, composition, etc… La partie 3-Architecture définit un modèle de spécification basé sur une gamme de niveaux d’abstraction appelés points de vue. La partie 4-Sémantique Architecturale établit des correspondances entre les concepts définis dans les parties 2 et 3 et les techniques de spécification formelle : SDL, LOTOS et Z. La partie 3 est prescriptive. Elle préconise que les entités à l’étude (tout ou partie d’un système, d’un service ou d’une application) soient décrites selon les points de vue de l’ODP et qu’un contrôle de cohérence soit établi entre les spécifications écrites dans des points de vue différents. Cinq niveaux d’abstraction - les cinq points de vue, ont été établis comme pertinents dans ODP. A eux cinq, ils couvrent les différentes phases à considérer dans le développement de systèmes ou applications répartis. Chaque point de © Projet ACCORD 13/29 vue possède un modèle et un langage. Ce dernier mot est à prendre dans une acception large : un langage de point de vue est un ensemble structuré de concepts utilisables dans le discours sur ce point de vue. Les cinq points de vue d’ODP sont : Entreprise, Information, Traitement, Ingénierie et Techniques. Nous les décrivons brièvement ciaprès. Le point de vue Entreprise introduit l’entité considérée (objet de l’étude) et délimite sa portée, définit ses requis essentiels d’un point de vue entrepreneur (par exemple, comment l’application envisagée améliore l’existant, ou comment le service projeté se démarque par rapport à la concurrence), établit les contraintes légales et administratives qui régissent la mise en service de l’entité, identifie les partenaires impliqués dans cette mise en service, et définit les rôles, attentes et obligations de ces partenaires. Le point de vue Information définit, pour l’entité considérée, les éléments d’information permettant de représenter son état (schéma statique en terminologie ODP), et pour chaque état, les opérations licites et les changements d’états produits par ces opérations (schéma dynamique en terminologie ODP). Une spécification selon le point de vue Information est donc une représentation abstraite du système, qui permet de connaître son comportement fonctionnel sans avoir à traiter les problèmes d’ingénierie (programmation, ressources de traitements, répartition, pannes, transport, ...). Le point de vue Traitement est le pivot de l’architecture ODP. Dans ce point de vue l’entité considérée prend la forme d’une configuration dynamique d'objets répartis communicants. Les objets qui composent ces configurations sont de deux types : objets de base et objets de liaison. Les objets de base communiquent soit par signaux directs soit à travers des objets de liaison. Ces derniers permettent d’encapsuler des sémantiques de communication particulières. Le point de vue traitement facilite l'articulation entre les représentations abstraites des besoins (en termes de modèles d'entreprise et d'information) et des implantations sur des machines virtuelles réparties. Le modèle de traitement constitue donc un point de passage naturel et avantageux entre le monde des spécifications abstraites et le monde des implantations réparties. Dans le point de vue Ingénierie, les configurations d’objets de traitement sont projetées sur des nœuds de traitement. La communication entre objets est alors matérialisée par des protocoles qui respectent la sémantique définie par les objets de liaison. Les transparences (accès, atomicité, fiabilité, migration, résistance aux pannes), déclarées comme propriétés des configurations de Traitement, sont mises en œuvre par des services fournis dans le modèle d’Ingénierie. Par exemple, à chaque objet de base du modèle de traitement, sont associés un stub et un relocator dans le modèle d’ingénierie. Le stub réalise la transparence de l’accès en jouant le rôle de l’objet distant. Le relocator rend transparente la migration de l’objet en redirigeant les requêtes qui lui sont destinées vers son nouveau site. Alors que dans le point de vue Ingénierie, le discours porte sur des schémas de solution (par exemple, on dira que la communication sera réalisée par le protocole TCP) c’est dans le point de vue Techniques que l’on choisira les solutions présentes sur le marché (par exemple la pile TCP de Linux BSD) ou à réaliser en spécifique. Les solutions concrètes relèvent donc du point de vue Techniques. Les autres points de vue agissent comme des spécifications auxquelles le point de vue Techniques doit se conformer. © Projet ACCORD 14/29 Bien que l’ODP n’ait pas identifié de notion de Composant, plusieurs concepts d’ODP relèvent de la problématique Composant. Par exemple, les objets d’ODP (Traitement ou Ingénierie) sont multi-interfaces comme les composants ; les objets de liaison s’apparentent aux connecteurs ; les objets Ingénierie sont hébergés dans des structures d’accueil : ils sont regroupés dans des clusters – le cluster étant l’unité de migration et de passivation, les clusters sont regroupés dans des capsules – la capsule étant l’unité de la ressource traitement. Le modèle ODP reste donc intéressant dans une étude visant la construction d’un modèle de composants. 3.2 Structures d’accueil Trois efforts de standardisation sont actuellement en cours : les spécifications EJB, CCM et .NET. Nous consacrons, dans cette partie, une section à chacune de ces propositions. En particulier, nous esquissons leurs éléments d’architecture et leur cycle de vie logiciel. La section « EJB 2.0 » présente la version 2.0 de la spécification EJB (Enterprise JavaBeans) provenant de la société Sun Microsystems, qui propose un modèle d'architecture support pour des composants développés dans le langage de programmation Java. La section « CCM » présente le modèle CCM (CORBA Component Model) qui doit être inclus dans la future version 3.0 de la spécification CORBA (Common Object Request Broker Architecture) de l’OMG (Object Management Group). La section « .NET » décrit la version en cours de développement du modèle de composants proposé par Microsoft. Elle fait suite aux spécifications de COM (Component Object Model), de DCOM (Distributed COM) et de COM+. L’évolution vers .NET correspond à une intégration de plus en plus forte de l’infrastructure d’accueil des composants dans le système d’exploitation Windows et la prise en compte unifiée de composants développés dans des langages de programmation différents. 3.2.1 EJB 2.0 Container Création d’une instance du bean EJBHome création Client Requête d’une méthode du bean EJBObject Délégation de l’appel Bean FIG. 2 - Architecture EJB Le standard EJB propose une architecture de composants pour le développement et le déploiement d’applications réparties fondées sur des composants EJB appelés beans [EJB01]. Le standard EJB décrit l’architecture et les services qu’un composant EJB peut utiliser (de manière transparente) mais ne donne aucun détail sur la manière de mettre en oeuvre ces services. Cette liberté permet aux vendeurs d’architectures EJB de se différencier d’un point de vue performances ou possibilités offertes, et de fournir des services supplémentaires. Enfin, les composants EJB étant développés en Java, ils profitent de la portabilité de ce langage. © Projet ACCORD 15/29 3.2.1.1 Architecture La figure 2 donne une vue simplifiée de l’architecture EJB ; elle repose sur deux principes : 1) La fabrique d’instance : pour que le client puisse accéder aux méthodes métier du bean, il doit tout d’abord récupérer un accès au bean. Cela se fait par l’intermédiaire de la classe EJBHome, qui renvoie une référence sur la classe EJBObject, représentant le bean correspondant ; 2) La délégation des requêtes : le client n’accède pas directement au bean. Ses requêtes doivent être envoyés à l’interface du bean : la classe EJBObject qui délèguera la requête vers le bean. Les trois classes Java (EJBHome, EJBObject et Bean) sont gérées par un conteneur (Container), correspondant à l’environnement d’exécution du bean. Nous allons maintenant détailler les différentes catégories de bean ainsi que les autres éléments de l'architecture EJB : conteneur, serveur et descripteur de déploiement. Bean session, entité et orienté message Le standard EJB 2.0 définit trois types de bean se différentiant essentiellement par rapport à leur durée de vie. 1) Bean session : ce bean n’existe que pour une session demandée par le client. Deux types de bean session existent : Stateless ou sans état : le bean ne maintient pas d’informations à la suite des différentes requêtes qui lui sont adressées. Le Conteneur peut alors partager séquentiellement le bean entre plusieurs clients ; Statefull ou avec état : le bean conserve en mémoire l’état du client. Chaque instance du bean n’appartient alors qu’à son client, et ne peut être partagée. 2) Bean entité (entity) : ce bean est une représentation de données persistantes ; il existe tant qu’il n’a pas été détruit explicitement. Pour récupérer un bean entité, un client peut utiliser la clé primaire du bean donnée lors de la création de ce dernier. L’accès au bean peut être partagé entre plusieurs clients. 3) Bean orienté message (message-driven) : ce bean est utilisé lorsque ses méthodes métier doivent être asynchrones ; il est invoqué sur réception d’un message du client, en utilisant le service JMS de Java (Java Messaging Service). Bean local ou distant La version 2.0 introduit également la notion de localité du bean. Cette notion ne s’applique pas aux beans orientés messages, qui sont de par nature distants. Pour les beans Remote (issus des versions EJB 1.x), le client n’a pas besoin de connaître l’emplacement du bean. L’accès se fait obligatoirement à l’aide de Java RMI. Les beans Local sont par contre situés sur la même machine virtuelle que le client (un bean peut alors, à l’intérieur d’un même Conteneur, faire appel à un autre bean). Une conséquence fondamentale de la notion de localité concerne le passage de paramètres lors d’un appel de méthode : pour les EJB Remote, le passage se fait par valeur tandis que, pour les EJB Local, le passage se fait par référence, les arguments étant alors potentiellement partagés entre le client et le bean. La propriété Local ou Remote du bean est choisie lors de la création du bean. Conteneur, serveur et descripteur de déploiement Le rôle principal du conteneur est de gérer les instances des différents beans. Suivant le cas, il prendra en charge un pool d’instances (par exemple pour les beans sessions avec état). Le conteneur peut, de plus, proposer différents services aux beans. Le bean © Projet ACCORD 16/29 s’exécute en fait dans un contexte définissant les différentes propriétés du client (son identité, les différents rôles qui lui sont attribués), et l’état des services mis en œuvre. L’infrastructure d’accueil des composants EJB comprend également une entité appelée « EJB server » - ou serveur - qui représente le logiciel support des communications et des services techniques nécessaires à l’exécution du composant et à son accès par le réseau. Les deux principaux services développés dans le standard EJB 2.0 concernent la sécurité et les transactions. Un descripteur de déploiement est associé à un composant et permet de décrire ses caractéristiques. 3.2.1.2 Cycle de vie Le standard définit quatre rôles principaux : 1) Le fournisseur de bean (Bean Provider) : il crée le bean, et fournit un fichier ejb-jar contenant le code du bean et son descripteur de déploiement. Ce descripteur contient entre autres la description des ressources externes nécessaires pour déployer le bean ; 2) L’assembleur d’application : il regroupe plusieurs beans pour son application ; 3) Le déployeur (deployer) : il déploie les beans dans un environnement opérationnel (c’est-à-dire sur un serveur EJB et un conteneur EJB). Il suit les instructions de l’assembleur d’application tout en respectant le descripteur de déploiement des beans ; 4) Le fournisseur de serveur EJB, de conteneur EJB : fournit la structure d’accueil qui sera utilisée. Le standard n’est pas très claire quant au rôle du serveur EJB qui semble confondu avec celui du conteneur. 3.2.2 CCM La réponse de l’OMG aux limites rencontrées dans les modèles à objets est le CORBA Component Model (CCM) modèle de composants qui servira de base au futur standard CORBA 3. La spécification de cette version du standard n’est pas encore achevée ; cependant, le chapitre sur le modèle de composants a été finalisé à l’OMG en janvier 2002. C’est donc l’un des plus jeunes modèles de composants mais aussi l’un des plus riches en comparaison avec d’autres modèles (cf [MP01]). Dans un but de compatibilité ascendante, l’OMG a défini son modèle de composants comme une extension du modèle objet de CORBA 2. Les composants CORBA représentent donc une spécialisation des objets CORBA tels que nous les connaissons aujourd’hui. © Projet ACCORD 17/29 3.2.2.1 Architecture FIG. 3 – Exemple d’une application répartie CCM Les applications visées par les composants CORBA sont des applications réalisées à partir de composants hétérogènes répartis. La figure 3 présente une vue d’ensemble de ce que peut être une application à base de composants CORBA. Cette application représente une instance possible d’une l’application « distributeur de boissons ». Cette application met en jeu différents éléments : une prise de courant, une prise d’eau, une sonde de température et le distributeur. A cela viennent s’ajouter deux éléments simulant un consommateur et un fournisseur de boissons. Cette instance de l’application s’exécute sur quatre sites distincts (dans le sens machine) et distants les uns des autres. Tout d’abord, un site central à notre application, le site qui héberge deux instances de composants distributeurs, un pour les boissons froides et un pour les boissons chaudes. Pour que ces deux instances s’exécutent, elles nécessitent un support d’exécution. Celui-ci est fourni par un conteneur (container). Un conteneur est un support d’exécution générique qui peut accueillir différents types de composants, mais ayant toutefois des caractéristiques systèmes communes (en termes de persistance par exemple). Pour ne pas réduire les capacités d’un site d’exécution à un ensemble de conteneurs statiquement définis et pour ne pas avoir à instancier tous les conteneurs possibles sur un site, les conteneurs reposent sur des serveurs de conteneurs. Ces serveurs sont matérialisés sous la forme de processus du système d'exploitation hôte et permettent d’activer des conteneurs à la demande et selon les besoins. Dans l'exemple, au sein du serveur de conteneurs principal, il y a donc quatre conteneurs qui permettent l’exécution de six instances de composants : deux instances de distributeurs, deux instances de prises de courants et deux instances de prises d’eau. Comme un conteneur vient d’être défini comme un support d’exécution générique, pour éviter de réduire les possibilités disponibles lors de l’instanciation de composants, une entité appelée maison de composants (home) est utilisée. Une maison est un gestionnaire d’instances de composants, s’occupant principalement de leur cycle de vie. Les maisons de composants contiennent le code réifiant l’instanciation des composants, ce qui apporte une certaine souplesse. En plus de permettre l’utilisation d’un même type © Projet ACCORD 18/29 de conteneurs avec différents types de composants, cette approche permet d’automatiser le déploiement des applications. En effet, il est possible de choisir des sites d’exécution à partir d’un ensemble connu, puis d’installer une application sur ces sites à partir d’un poste d’administration. Pour cela, en plus de fournir un environnement d’exécution (un serveur de conteneurs), un site doit offrir un service de chargement de code, il est ainsi possible de charger une implantation de composant sur un site distant (ainsi que l’implantation de sa maison associée). Une fois les conteneurs instanciés, les implantations de composants et de maisons chargées, les maisons et les composants instanciés, il ne reste plus qu’à interconnecter les instances de composants entre elles pour former l’application. La connexion entre deux instances de composants se fait au travers de ports, les points de connexion. Pour que deux types de composants puissent être mis en relation, il est requis que ces deux types aient un port fourni et un port requis compatibles. Il existe deux modes de connexion entre les types de composants : un mode synchrone, l’invocation de méthodes, et un mode asynchrone, l’utilisation d’événements. Le modèle de composants CORBA offre une réponse à tous ces besoins. 3.2.2.2 Cycle de vie Le CCM est un framework de composants de type serveurs, mais qui, semble-t-il, peut facilement être utilisé du côté client des applications. Le CCM se décompose en deux niveaux : un niveau de base, qui permet essentiellement de transformer en composant des objets CORBA, et un niveau étendu, beaucoup plus riche et intéressant, illustré avec l’exemple du distributeur de boissons. Tout comme les EJB de Sun, auxquels correspond la version de base du CCM en Java, le framework CCM repose sur l’utilisation de conteneurs pour héberger les instances de composants et faciliter leur déploiement. La spécification du framework CCM [OMG01], qui représente plus de 1000 pages, est découpée en quatre modèles couvrant le cycle de développement et de déploiement des applications à base de composants CORBA. Le modèle abstrait offre aux concepteurs le moyen d’exprimer les interfaces (fournies et utilisées) et les propriétés d’un type de composant. Pour cela, le langage OMG IDL a été étendu pour prendre en compte les nouveaux concepts introduits dans le CCM, essentiellement la prise en compte des interfaces multiples : les ports. Le modèle abstrait permet aussi de définir les gestionnaires d’instances de composants. Le modèle de programmation spécifie le langage CIDL (Component Implementation Definition Language) à utiliser pour définir la structure de l’implantation d’un type de composant, ainsi que certains de ses aspects non-fonctionnels (persistance, transactions, sécurité). L’utilisation de ce langage est associée à un framework, le CIF (Component Implementation Framework), qui définit comment les parties fonctionnelles (programmées) et non-fonctionnelles (décrites en IDL / CIDL et générées) doivent coopérer. Il inclut aussi la manière dont l’implantation d’un composant interagit avec le conteneur. Le modèle de déploiement définit un processus qui permet d’installer une application sur différents sites d’exécution de manière simple et automatique. Ce modèle s’appuie sur l’utilisation de packages de composants, ainsi que de descripteurs OSD (Open Software Description, un vocabulaire XML), les packages étant déployables et composables. Le modèle d’exécution définit l’environnement d’exécution des instances de composants. Le rôle principal des conteneurs est de masquer et prendre en charge les aspects non-fonctionnels des composants qu’il n’est alors plus nécessaire de programmer. © Projet ACCORD 19/29 3.2.3 .NET Sous l'appellation « .NET », Microsoft regroupe un ensemble de ses produits : platesformes de développement et d'exécution pour applications réparties à base de composants. 3.2.3.1 Architecture En termes de plate-forme de développement, avec .NET, Microsoft offre le support de plusieurs langages tels que C++, VB.NET ainsi qu'un nouveau langage : C# (C Sharp). C# est très proche du langage Java. Il supporte l'héritage simple, l'implémentation multiple d'interface, les propriétés, la surcharge d'opérateur, les événements. Tous ces langages supportés peuvent être compilés en un code intermédiaire MSIL (Microsoft Intermediate Language). Ce code intermédiaire est exécuté par le CLR (Common Language Runtime).Enfin, .NET met l’accent sur la programmation par réutilisation de services (Web Services). Ainsi, WSDL (Web Service Definition Langage) est un format de représentation des interfaces de Service Web en XML. C’est la représentation XML des langages IDL (OMG) ou MIDL (Microsoft) de description des interfaces. En termes de plate-forme d'exécution, .NET propose une évolution de COM+ « .NET remoting » qui permet la distribution de composants. COM+ est une version avancée de COM qui regroupe l'ensemble des services dédiés au applications réparties de Windows, à savoir : DCOM, MTS et MSMQ. En plus d'agréger ces services, COM+ apporte de nouvelles capacités fonctionnelles comme les « queued components », un mécanisme de gestion des événements (publish/subscribe) ou la répartition de charge (load balancing). DCOM est l'équivalent au niveau de la couche transport du protocole IIOP de CORBA mais pour la plate-forme Windows. MTS (Microsoft Transaction Server) permet le développement, le déploiement et l'exécution de composants répartis fonctionnant sous le contrôle d'un conteneur. MTS offre également des services pour la prise en charge des transactions. MSMQ (Microsoft Message Queue Server) est un middleware de type Message Oriented Middleware qui prend en charge la communication asynchrone point à point entre applications. MSMQ permet la création et l'utilisation d'entités appelées files (queues) par lesquelles les messages sont échangés. MSMQ peut aussi être utilisé dans le cadre de transactions réparties. .NET supporte trois modèles de composants : 1) « Single Call » : Une instance du composant ne sert qu'une seule requête. Ni l'état du composant ni le contexte des clients ne sont gérés. 2) « Singleton Objects » : Une instance du composant peut servir plusieurs clients simultanément. L'état du composant est partagé par les clients. 3) « Client Activated Objects » : Une instance du composant est activée pour chaque client (mode d'activation très proche de celui d'un composant COM+). Le contexte du client est géré entre ses différents appels. Un assemblage est un regroupement de types (classes, structures, énumérations, ...) et de ressources (images, sons, textes ...) en un composant déployable. Généralement, un assemblage comporte les 4 éléments suivants : les méta-données qui décrivent l'assemblage, les méta-données qui décrivent chacun des types contenus dans l'assemblage, le code des types sous la forme de MSIL, les ressources. © Projet ACCORD 20/29 4 Conclusion Cet état de l’art sur l’« assemblage de composants par contrats » montre l’ampleur et la complexité du domaine. L’ensemble du cycle de vie de développement du logiciel est couvert : de l’analyse des besoins indispensable à une bonne définition des composants, au déploiement et à la configuration des implantations de composants dans des structures d’accueil variées, en passant par les problèmes de spécification – plus ou moins formelle -, d’assemblage et de vérification de la cohérence de ces assemblages, et de projections vers des solutions techniques du marché informatique, où se livre une concurrence importante. De plus, les concepts sont loin d’avoir une définition adoptée par tous, à commencer par celle fondatrice de composant. Les solutions techniques à base de composants sont en pleine émergence. Elles se trouvent à la convergence de techniques plus matures mais qui ont montré leurs limites comme les objets, dont les interfaces manquent de symétrie pour former des entités composables simplement, les ADL qui peinent à décrire des architectures ouvertes et dynamiques ou les langages de coordination qui nécessitent de lourds mécanismes d’introspection pour fonctionner. Nombre de solutions techniques apparaissent s’appuyant chacune sur une infrastructure se voulant standard mais qui, du fait de la diversité, s’avère spécifique, qui Java (EJB), qui CORBA (CCM), qui .NET. Le projet ACCORD a pour objectif initial la définition d’un modèle abstrait de composant et d’assemblage, indépendant de toute infrastructure matérielle et de tout modèle d’implantation de composant comme EJB, CCM ou .NET. Ce modèle précisera les notions de composant, interface, assemblage, composition en s’appuyant sur des spécifications sous forme de contrats. Les relations et les contraintes d’assemblage entre ces notions feront aussi intégralement partie du modèle abstrait de composant. Ce projet, bien que n’ayant pas l’objectif de définir un langage de description d’architecture, s’inspire d’un certain nombre de concepts présents dans les ADL. Citons, par exemple, dans la définition du modèle abstrait, la possibilité de description hiérarchique des composants, un travail sur la notion de type, classe et instance comme dans certains ADL, ou encore la description des interactions de manière explicite, sous forme de connecteurs. Afin d’en assurer une utilisation industrielle, le modèle abstrait sera décrit en UML en exploitant et adaptant les modèles de composant proposés dans la version 2.0. A ce titre, les membres du projet ACCORD souhaitent élaborer des propositions d’évolution d’UML à l’OMG. Devant la diversité des solutions techniques « à base de composants », et pour pouvoir définir des règles de projection du modèle abstrait vers ces solutions existantes, il est indispensable de disposer d’un outil commun de représentation. Une fois encore, UML permet d’atteindre cet objectif grâce à l’utilisation de la notion de profil, qui permet simplement de traduire l’ensemble des entités dépendantes d’une technique particulière comme EJB ou CCM en UML. Disposant en UML, d’une part, d’un modèle abstrait de composant qui permettra de construire des applications par assemblage de composants en respectant les contrats des composants et des assemblages et, d’autre part, de la description des architectures cibles, le projet ACCORD s’attachera à définir des règles de projection qui devraient permettre de déployer les applications ainsi construites sur les infrastructures cibles EJB et CCM. © Projet ACCORD 21/29 Notons enfin que l’approche du projet ACCORD repose sur un principe compatible avec les travaux de l’OMG sur l’Architecture Guidée par les Modèles (MDA, ModelDriven Architecture) ; le modèle abstrait correspond au modèle indépendant des platesformes techniques (PIM, Platform Independent Model) et les techniques de projection que nous envisageons peuvent être considérées comme des transformations vers des modèles techniques comme EJB ou CCM, c’est-à-dire des PSM (Platform Specific Model). © Projet ACCORD 22/29 5 Annexe Cette annexe liste quelques projets français ou européens dont les préoccupations sont proches de celles du projet ACCORD. RNTL ARCAD (Architecture Répartie extensible pour Composants Adaptables) Définition de mécanismes de haut niveau pour le déploiement d’applications réparties, orienté infrastructure. ARCAD cherche à fournir un environnement pour implanter des composants (à la fois une abstraction et une extension des plates-formes d’exécution actuelles telles qu’EJB, CCM, ou autres), tandis qu’ACCORD se propose de définir un cadre pour les concevoir. Les deux sont d’ailleurs complémentaires, et des réunions d’échange d’informations sont envisageables. RNTL MACAO (Aide à la Conception et à l’Audit de modèles pour les Composants) Les objectifs du projet sont de proposer une démarche et des outils pour évaluer des critères permettant de mesurer certaines caractéristiques de composants, telles que la qualité, l’autonomie, l’adéquation au besoin, etc. L’idée de MACAO de mesurer certaines caractéristiques sur des composants ne fait pas l’objet du projet ACCORD. Elle est cependant complémentaire. Par ailleurs MACAO considère les composants isolément, au contraire d’ACCORD qui cherche à mieux définir par les contrats les collaborations de composants. RNRT CASTOR (Conception d’un atelier de création de services pour les platesformes TINA-CORBA-RI) CASTOR cherche à définir des composants de services pour un domaine particulier. Le résultat principal d’ACCORD n’est pas la fourniture de composants pour un domaine (les cas d’étude ne sont là que pour valider et démontrer les idées), mais la fourniture d’un cadre indépendant du domaine pour aider les architectes à les concevoir. Un projet similaire à CASTOR pourrait s’appuyer sur les résultats du projet ACCORD. RNTL COTE (Etude et réalisation de techniques et d’outillage de test unitaire et de vérification des composants logiciels, s’appuyant sur les outils de modélisation UML) COTE cherche à définir des outils pour la validation et le test unitaire de composants. Le domaine des composants est vaste et pour cette raison, le test de composant ne fait pas l’objet du projet ACCORD, qui se concentre sur les outils du concepteur et de l’assembleur. Notons que les contrats pourraient être utilisés comme spécification sur le test. RNTL SALOME (Simulation numérique par architecture logicielle en Open Source et à Méthodologie d’Evolution) SALOME a pour objectif la réalisation d'une plate-forme applicative en Open Source de liaison CAO-CALCUL permettant d'interfacer des Solveurs numériques. La plate-forme est réalisée en utilisant une approche composants et peut être comparée aux plates-formes standards CCM, EJB et .NET avec une valeur ajoutée due à son orientation vers le logiciel scientifique. Il est donc envisageable de l'utiliser comme plate-forme cible d'exécution pour des applications qui auront été conçues grâce à l'atelier développé dans le cadre du projet ACCORD. © Projet ACCORD 23/29 IST EASYCOMP (Easy Composition in Next Generation Systems) EASYCOMP vise la définition d’une « fondation » permettant de diffuser des composants via le WEB. L’idée semble très bonne (cf. les Web services), mais il est difficile de voir exactement quelles sont précisément les ambitions du projet. Apparemment, il ne s’agit pas de définir un cadre méthodologique, mais plutôt de spécifier le cadre technique (peut-être en définissant des DTD XML) qui supportera cette diffusion. Il est en particulier difficile de voir quels concepts seront définis en regard des préoccupations d’assemblage fiables (présentes dans ACCORD). IST PECOS (Pervasive Component Systems) L’idée du projet est de proposer un environnement pour spécifier, composer, tester des configurations, déployer des systèmes embarqués. Les résultats attendus un modèle de composants, un référentiel de composants, un outils de composition, et un environnement d’exécution. Les idées présentes dans PECOS sont relativement proches de celles d’ACCORD. Cependant, d’une part PECOS ne traite que de systèmes embarqués, et d’autre part le projet ne semble pas mettre en avant la notion d’assemblage. QCCS (Quality Controlled Component-based Software development) QCCS a pour objectif de proposer une méthodologie et des outils pour construire des composants en se fondant sur la notion de contrat et sur les mécanisme de la programmation par aspects. Comme ACCORD, QCCS semble proposer un cadre méthodologique fondé sur les contrats, mais à la différence du premier QCCS paraît vouloir appliquer ces concepts à la seule définition des composants et non aux collaborations. Par ailleurs, ACCORD ne compte pas s’appuyer sur des techniques de programmation par aspects. IST COMBINE (COMponent-Based Interoperable Enterprise system development) COMBINE est un projet Européen centré sur la définition d'une démarche et d'un support complet de l'approche par composant, en cohérence avec le standard en construction "EDOC". COMBINE ne traite pas de l'assemblage qui est le thème essentiel de ACCORD. Les études méthodologiques de COMBINE ne sont pas le point focal de ACCORD. Ces projets sont disjoints et complémentaires. © Projet ACCORD 24/29 6 Bibliographie -- composant [HC01] [HS00] [WHS02] [Szy98] George T. Heineman, William T. Councill, Component-based software engineering : Putting the pieces together, AddisonWesley, 2001. Peter Herzum, Oliver Sims, Business Component Factory – A Comprehensive Overview of Component-Based Development for the Enterprise, Wiley Computer Publishing, 2000. Kurt C. Wallnau, Scott A. Hissam, Robert C. Seacord, Building systems from commercial components, AddisonWesley, 2002. Clemens Szyperski, Component Software – Beyond Object-Oriented Programming, Addison-Wesley, 1998. -- contrat [BJPW99] [LPJ98] [McH94] [Mey92] [WK98] Antoine Beugnard, Jean-Marc Jézéquel, Noël Plouzeau, Damien Watkins, Making Components Contract Aware, Computer, July 1999, pp 38-45. S. Lorcy, N. Plouzeau, and J.-M. Jézéquel, Reifying Quality of Service Contracts for Distributed Software, Proc. 26th Conf. Tech. OO Systems (TOOLS USA’98), IEEE Computer Society, Los Alamitos, Ca.,Aug. 1998, pp. 125-139. C. McHale, Synchronization in Concurrent, Object-Oriented Languages: Expressive Power, Genericity and Inheritance, doctoral dissertation, Trinity College, Dublin, Dept. Computer Science, 1994. B. Meyer, Applying ‘Design by Contract’, Computer, Oct. 1992, pp. 40-52. J. Warmer and A. Kleppe, The Object Constraint Language, Addison Wesley Longman, Reading, Mass., 1998. -- langages de description d'architecture [ACN02] [ADML00] [DKM93] [Gar95] [GMW97] [GP95] [Mar01] J. Aldrich, C. Chambers, D. Notkin, ArchJava: Connecting Software Architecture to Implementation, ICSE 2002. Open Group, Architecture Description Markup Language: ADML, 2000, http://www.opengroup.org/architecture/adml/adml_home.htm J. Dulay, N. Kramer, J. Magee, Structuring Parallel and Distributed Programs, IEEE Software Engineering Journal, vol.8(N.2), pp.73-82, Mars 1993. D. Garlan, An introduction to the Aesop System, School of Computer Science, Carnegie Mellon University, Juillet 1995. D. Garlan, R. Monroe, D. Wile, ACME : An Architecture Description Interchange Language, Computer Science Department, Carnegie Mellon University, Pittsburg et USC/information science institute, Novembre 1997. D. Garlan and D.E Perry., Introduction to the Special Issue on Software Architecture, IEEE Transactions on Software Engineering, 21 (4), April 1995, pp 269-274 R. Marvie, CODeX: proposition pour la description dynamique d'architectures à base de composants logiciels, Actes de Journées composants: flexibilité du système au langage, Octobre 2001, Besançon, France. © Projet ACCORD 25/29 [MT00] [MTW96] [RDTP97] [SD02] [SG96] N. Medvidovic and R. N. Taylor, A Classification and Comparison Framework for Software Architecture Description Languages, IEEE Transactions on Software Engineering, Vol 26, no1, pp70-93, Janvier 2000. N. Medvidovic, R. Taylor, E. Whitehead, Formal Modeling of Software Architectures at Multiple Levels of Abstraction, Department of Information and Computer Science, University of California, Irvine, Avril 1996. Rapide Design Team Program Analysis and Verification Group Computer Systems Lab Stanford University, Guide to the Rapide 1.0 Language Reference Manual, Juillet 1997. J.M. Soucé, L. Duchien, Etat de l’art sur les langages de description d’architecture, Livrable 1 du projet RNTL ACCORD, 2002. M. Shaw, D. Garlan, Software Architecture - Perspectives on an Emerging Discipline, Prentice Hall, 1996. -- langages de coordination [AF00] [AHS93] [AP98] [Beu00] [CG92] [CD99] [Gün98] [MC94] [Sin92] A. Andrade, J.L Fiadeiro, Evolution by contract, In ECOOP’00 Workshop on Object Oriented Architectural Evolution, 2000, Position Paper. F. Arbab, I. Herman and, P. Spilling ; An Overview of Manifold and its Implementations. Concurrency: Practice and Experiences 5(1), 1993, pp.664677. F. Arbab, G.A. Papadopoulos ; Coordination models and languages, Software Engineering (SEN), SEN-R9834 December 31, 1998. A. Beugnard, Communication Services as Components for Telecommunication Applications, 14th European Conference on ObjectOriented Programming (ECOOP’2000), Objects and Patterns in Telecom Workshop, Sophia Antipolis and Cannes (France), 2000. N. Carriero, D. Gelernter ; Linda in context. Communication of the ACM 35 (2), 1992 pp. 97-107. Juan Carlo Cruz, Stéphane Ducasse, Coordinating Open Distributed Systems, Future Trends in Distributed Computing Systems ’99 FTDCS’99 Manuel Günter, Explicit Connectors for Coordination of Active Objects, Master Thesis of Faculty of Science, University of Bern 1998 T. W. Malone and K. Crowston, The Interdisciplinary Study of Coordination, ACM Computing Surveys 26, 1994, pp. 87-119. B. Singh ; Interconnected Roles (IR): A Coordinated Model. Technical Report CT–84–92, Microelectronics and Computer Technology Corp., Austin, TX, 1992. -- UML [CD01] [DW99] [EDOC01] John Cheesman, John Daniels, UML Components – A Simple Process for Specifying Component-Based Software, Addison-Wesley, 2001. Desmond Francis D'Souza, Alan Cameron Wills, Objects, Components and Frameworks with UML – The Catalysis Approach, Addison-Wesley, 1999. OMG, A UML Profile for Enterprise Distributed Object Computing, Version 0.29, Document OMG, Juin 2001. © Projet ACCORD 26/29 -- ODP [ODP95] [Put01] ISO/IEC, Information Technology - Open Distributed Processing - Reference Model, ISO/IEC 10746-1,2,3,4:1995 ou ITU-T X.901,2,3,4, 1995. Janis R. Putman, Architecting with RM-ODP, Prentice-Hall, 2001. -- EJB [EJB01] Sun Microsystems, Enterprise Java BeansTM Specification, Version 2.0, Sun Microsystems, Août 2001. -- CCM [OMG01] [MP01] OMG, CORBA 3.0 New Components Chapters, Object Management Group, Novembre 2001, OMG ptc/2001-11-03. R. Marvie and M.-C. Pellegrini, Modèles de composants, un état de l’art, Numéro spécial de L’Objet, 2001. -- .NET [DN01] Microsoft, Microsoft .net Framework - Guide d'évaluation, Microsoft Publishing, 2001 © Projet ACCORD 27/29 7 Liens Internet -- composant http://www.objenv.com/cetus/top_distributed_objects_components.html CETUS Component-Based Software Development / COTS Integration http://www.sei.cmu.edu/str/descriptions/cbsd.html Component Software Ressources http://www.geocities.com/m_a_r_c_h/components.html Modèles http://iamwww.unibe.ch/~scg/Research/ComponentModels/ -- contrat MEYER TrustedCmp http://www.eiffel.com/doc/manuals/technology/contract/page.html http://trusted-components.org/ -- langages de description d'architecture ACME Aesop C2 Darwin MetaH Rapide SADL UniCon Wright http://www.cs.cmu.edu/~acme/ http://www.cs.cmu.edu/afs/cs/project/able/www/aesop/ http://www.ics.uci.edu/pub/arch/ http://www.cs.cmu.edu/~darwin/ http://www.htc.honeywell.com/projects/dssa/dssa_tools.html http://pavg.stanford.edu/rapide/ http://www.sdl.sri.com/programs/dsa/sadl-main.html http://www.cs.cmu.edu/afs/cs.cmu.edu/Web/People/UniCon/ http://www.cs.cmu.edu/~able/wright/ -- langages de coordination Bookmarks COOL LINDA Manifold http://grunge.cs.tu-berlin.de/~tolk/coordbook.html http://www.eil.utoronto.ca/profiles/rune/node7.html http://www.cs.yale.edu/Linda/linda-lang.html http://www.ercim.org/publication/Ercim_News/enw35/arbab.html -- UML en français http://uml.free.fr/ UML2 work in progress http://www.omg.org/techprocess/meetings/schedule/UML_2.0_Superstructur e_RFP.html catalysis http://catalysis.org/ -- ODP Introduction http://lamswww.epfl.ch/RM-ODP/Default.htm -- EJB BEA WebLogic Server 7.0 http://www.bea.com/products/weblogic/server/index.shtml Borland AppServer 5.0.1 http://www.borland.com/bes/appserver/ IBM WebSphere Application Server 4.0 http://www.ibm.com/websphere © Projet ACCORD 28/29 -- CCM Ressources Général K2-CCM MICO/CCM OpenCCM http://corbaweb.lifl.fr/OpenCCM/CCM.html http://ditec.um.es/~dsevilla/ccm http://www.iCMGworld.com/ http://www.fpx.de/MicoCCM/ http://corbaweb.lifl.fr/OpenCCM/ -- .NET Microsoft .NET http://www.microsoft.com/net/, http://msdn.microsoft.com/net et http://www.gotdotnet.com (site géré par Microsoft) Article de synthèse intitulé « Applying .Net to Web Services » : http://www.webtechniques.com/archives/2001/05/jepson Spécifications complètes soumises à l’ECMA (C#, CLI, base class library) http://msdn.microsoft.com/net/ecma/site.zip Portail français sur .NET réunissant de nombreux articles à http://www.dotnet-fr.org -- projets ARCAD MACAO CASTOR SALOME EASYCOMP PECOS QCCS COMBINE http://www.industrie.gouv.fr/rntl/FichesA/Arcad.htm http://www.industrie.gouv.fr/rntl/FichesA/Macao.htm http://www.telecom.gouv.fr/rnrt/projets/pcastor.htm http://www.opencascade.org/SALOME/ www.easycomp.org www.iam.unibe.ch/~pecos www.qccs.org http://www.opengroup.org/combine/ © Projet ACCORD 29/29