Définition
En informatique comme en linguistique, un langage est défini par sa syntaxe et sa sémantique. La syntaxe caractérise l’ensemble des concepts du langage et leurs représentations concrètes. La sémantique permet quant à elle d’associer une signification à chaque élément syntaxique du langage. Ces deux notions permettent de définir la forme (la structure et la notation) et le fond (le sens) des programmes [Com08]. Pour les langages de programmation, on dissocie la syntaxe abstraite de la syntaxe concrète. La syntaxe abstraite définit l’ensemble des concepts (ou constructions) du langage et leurs relations. Elle ne s’intéresse donc qu’à la structure interne des programmes. Elle peut par exemple être définie à l’aide d’une grammaire et ainsi se représenter sous la forme d’un arbre syntaxique (ou en anglais Abstract Syntax Tree (AST)). Les noeuds de l’arbre correspondent alors aux constructions du langage et les branches aux arguments de ces constructions. La syntaxe concrète permet quant à elle d’associer une représentation à chacun des concepts du langage. C’est cette représentation concrète qui sera utilisée par les ingénieurs pour définir des programmes dans ce langage. Elle peut prendre une forme textuelle (p. ex. avec Xtext [EB10], TCS [JBK06]) ou graphique (p. ex. avec Sirius 1).
Dans le cas d’une représentation textuelle, la syntaxe concrète est typiquement définie à l’aide d’une grammaire pouvant ensuite être utilisée par un parseur pour construire l’arbre syntaxique d’un programme. Un langage est aussi caractérisé par son domaine sémantique qui représente l’ensemble des états atteignables d’un programme [Com08] (c.-à-d. l’ensemble des combinaisons de valeurs pouvant être prises par les attributs dynamiques d’un programme). La sémantique d’un langage définit comment passer d’un état à un autre (c.-à-d. l’évolution des valeurs des attributs dynamiques d’un programme). Un langage informatique repose donc sur la combinaison de trois éléments : une syntaxe abstraite, une syntaxe concrète et un domaine sémantique. La définition d’un langage est centrée soit sur sa syntaxe concrète soit sur sa syntaxe abstraite. Des liens (Mca, Mcs) ou (Mac, Mas) permettent d’associer les concepts de la syntaxe concrète ou de la syntaxe abstraite avec les concepts des autres éléments. Ces deux possibilités sont illustrées sur la Figure 1.1.
syntaxe abstraite (en bleu). (Figure adaptée de [Com08]) Pour des raisons historiques, les langages dont la définition est axée sur la syntaxe concrète sont principalement des langages de programmation. Un lien Mca dit de dérivation ou d’abstraction permet d’associer les éléments de la syntaxe concrète à ceux de la syntaxe abstraite. Ce lien est souvent obtenu via l’utilisation d’un parseur. Celui-ci permet d’enlever tout le sucre syntaxique (p. ex. les accolades, les points-virgules) servant uniquement à la mise en forme du programme. Un lien Mcs permet de lier les concepts de la syntaxe concrète avec des états (ou des valeurs) du domaine sémantique du langage. Définition 1.1 (Langage centré sur la syntaxe concrète). “Un langage informatique est défini selon le tuple {AS,CS,Mca, SD,Mcs} où AS est la syntaxe abstraite, CS est la syntaxe concrète, Mca est le mapping de la syntaxe concrète vers sa représentation abstraite, SD est le domaine sémantique et Mcs est le mapping de la syntaxe concrète vers le domaine sémantique.” [Com08] La définition d’un langage peut également être centrée sur sa syntaxe abstraite. L’utilisation de cette définition est privilégiée par les langages de modélisation. Elle permet notamment l’usage de multiples syntaxes concrètes offrant ainsi la possibilité d’utiliser différents formalismes pour différents besoins.
Pour la modélisation, certains utilisateurs préfèrent un formalisme graphique alors que d’autres sont plus à l’aise avec un formalisme textuel. Pour le stockage des programmes, il peut également être intéressant d’utiliser un formalisme dédié (p. ex. XML Metadata Interchange (XMI®) [OMG15]) pour favoriser l’interopérabilité entre les outils. Pour chaque syntaxe concrète, la définition du langage doit donc fournir un lien Mac entre les concepts de la syntaxe abstraite et les décorations syntaxiques (graphiques ou textuelles) utilisées dans la syntaxe concrète. Un seul lien Mas est cependant nécessaire pour lier les concepts de la syntaxe abstraite avec des états (ou des valeurs) du domaine sémantique du langage. Définition 1.2 (Langage centré sur la syntaxe abstraite). “Un langage informatique est défini selon le tuple {AS,CS_,M_ ac, SD,Mas} où AS est la syntaxe abstraite, CS_ est la (les) syntaxe(s) concrète(s), M_ ac est l’ensemble des mappings de la syntaxe abstraite vers la (les) syntaxe(s) concrète(s), SD est le domaine sémantique et Mas est le mapping de la syntaxe abstraite vers le domaine sémantique.” [Com08] Dans cette thèse, nos travaux se focalisent sur l’exécution et l’analyse dynamique de programmes. Après avoir défini la notion de langage, notre intérêt se porte donc sur la définition de la sémantique des langages.
Outils
Dans la communauté du génie logiciel, de nombreux outils ont été développés pour capturer la sémantique d’un langage de façon translationnelle. En pratique, ces outils ne traduisent pas les modèles directement vers du code machine mais vers un langage intermédiaire ayant un niveau d’abstraction plus ou moins élevé. Plusieurs étapes de traduction sont donc nécessaires avant d’obtenir du code machine qui soit exécutable par une plateforme d’exécution matérielle.
Différents niveaux d’abstraction. Pour classifier les générateurs de code, cette thèse propose de les regrouper en trois grands groupes dépendants essentiellement du niveau d’abstraction du langage cible. Vers un GPL. Une première méthode est de définir un générateur de code vers un langage de programmation générique (GPL) (p. ex. C, C++, Java, Objective-C, Ada). De nombreux outils ont notamment été définis pour UML dont Papyrus Software Designer (Papyrus SD) [Pha+17], Rhapsody [HK04], Rational Software Architect (RSA) [LNH06], UML4CPP [Jäg+16] ou le simulateur UML [KDH07]. Concernant les systèmes temps réel, les outils Fujaba [Bur+05], Rational Software Architect Real Time Edition (RSARTE) [Moh15] et Papyrus-RT [HDB17] permettent de générer du code prenant en compte des contraintes temps réel. Vers une représentation intermédiaire dédiée. Une autre approche propose de transformer le modèle de conception vers un langage intermédiaire plus proche des concepts d’implémentation. Les travaux [PM03a; PM03b; SM05b] reposent sur cette approche pour exécuter des modèles UML en passant par les formalismes intermédiaires Extended Hierarchical Automata (EHA) [PM03a; PM03b] ou Executable State Machine (ESM) [SM05b]. L’intérêt de ces formalismes est notamment de mettre à plat les machines à états UML pour simplifier la génération de code [PM03a; PM03b] ou rendre l’exécution plus efficace [SM05b].
Vers un langage assembleur. D’autres générateurs de code, souvent qualifiés de compilateurs, ont été définis vers des langages bas niveau (c.-à-d. très proche du langage machine). Des compilateurs existent notamment pour les langages de programmation comme C (p. ex. GCC) ou Rust (p. ex. rustc). Pour UML, les compilateurs de modèles GUML [CMB12] et Unicomp [Cic18] permettent de transformer des modèles UML vers du code binaire en passant par une représentation intermédiaire de GCC3 ou LLVM4. Tous ces outils permettent d’exécuter des modèles et sont généralement adaptés pour l’exécution embarquée. En ce qui concerne plus spécifiquement UML, la section A.3.3 donne un aperçu des outils implémentant une sémantique translationnelle pour UML. Parmi tous ces outils, très peu utilisent une approche formelle. En particulier, aucun des outils cités précédemment ne permet de garantir que le code exécutable obtenu est conforme au modèle de conception initial. Pour le langage UML, il n’existe pas, à notre connaissance, d’outils permettant de remplir cet objectif. Dans la littérature, plusieurs travaux [LP99; Fra+98; Liu+13a] ont proposé une définition formelle de la sémantique d’UML en se basant sur une notation mathématique. Néanmoins, ces définitions formelles servent uniquement à appliquer des activités d’analyse sur des modèles UML mais pas à exécuter ces modèles sur des plateformes d’exécution réelles.
Garantir la sémantique d’exécution. Plusieurs outils permettent de garantir que la sémantique d’exécution est conforme à la sémantique du langage de modélisation. Il est par exemple intéressant de noter l’initiative du projet CompCert 5 [Ler09] qui a permis de construire le premier compilateur de code C certifié en utilisant Coq 6 [BC10]. Pour les systèmes embarqués, l’environnement de développement SCADE [Ber07] possède quant à lui un générateur de code certifié, appelé KCG compiler, pour rendre exécutable les modèles SCADE. En couplant Comp- Cert avec le générateur de code KCG, il serait possible de garantir que la sémantique d’exécution des modèles SCADE est conforme à sa spécification. Dans le cadre de l’ingénierie des modèles, il est également intéressant de mentionner l’approche en [Com+09]. Elle permet de définir une sémantique translationnelle pour un langage de modélisation donné et de valider celle-ci par rapport à une sémantique opérationnelle de référence grâce aux techniques de bisimulation.
Introduction |