# QVT

En ingénierie dirigée par les modèles, Query/View/Transformation (QVT), que l'on peut traduire par « Requête/Vue/Transformation », est un standard pour la spécification de transformations de modèles. Il fournit une architecture et des langages dédiés facilitant la génération de modèles à partir d'autres modèles. Défini pour la première fois en 2002 puis adopté en 2005 par l'Object Management Group (OMG), QVT fait partie du standard Meta-Object Facility (MOF). Il est à ce titre une composante importante de l'architecture dirigée par les modèles (MDA).
Le standard QVT est principalement représenté par deux langages de transformations de modèles : QVT Relations (QVT-R), un langage déclaratif, et QVT Operational (QVT-O), un langage impératif. D'autres langages de transformations de modèles comme ATL s'inspirent également des concepts du standard. Du fait de sa complexité, l'implémentation de QVT n'est pas achevée en 2019.

## Présentation
### Modèles et transformations

La modélisation est une approche courante en ingénierie pour analyser, concevoir et maîtriser la complexité d'un système. Produit d'une modélisation, un modèle est une représentation abstraite d'une fonction ou d'un comportement du système$^,$. Puisqu'il n'en représente pas tous les aspects, le modèle est une simplification du système$^,$ : il en fournit ainsi une meilleure compréhension. Par exemple, les professionnels du génie civil réalisent des modèles statiques et dynamiques de ponts avant leur construction pour en vérifier la sécurité.
En informatique et plus précisément en génie logiciel, les modèles sont couramment utilisés$^,$. D'abord, les modèles permettent de simplifier les aspects techniques de la construction de logiciels, notamment pour les non-développeurs. Ils aident à visualiser, spécifier, construire et documenter les systèmes logiciels. Ensuite, l'abstraction apportée par les modèles permet de concevoir des programmes fondés sur des objectifs de conception plutôt que sur un environnement en particulier$^,$. Par exemple, un modèle de données décrit de manière abstraite et sans détails techniques la façon dont un ensemble de données est organisé dans une base de données$^,$. De nombreuses méthodes d'analyse et de conception de logiciels, qui utilisent par exemple le langage de modélisation UML, sont fondées sur le concept de modèle. Dans ce cas, les modèles sont utilisés à des fins de communication ou de spécification$^,$.
Une particularité des modèles en génie logiciel est qu'ils peuvent aussi jouer le rôle de programmes, c'est-à-dire qu'ils peuvent parfois remplacer du code source$^,$. Le modèle est alors dit exécutable. Ce principe est à l'origine de l'ingénierie dirigée par les modèles, une branche de l'ingénierie des systèmes. Son application au développement logiciel est appelée développement dirigé par les modèles. La pratique du développement dirigé par les modèles nécessite ainsi de concevoir et de manipuler simultanément de nombreux modèles qui représentent différents aspects du système (sécurité, performance, métier, etc.)$^,$. Mis ensemble, ces modèles peuvent être transformés pour produire une implémentation logicielle$^,$.
Les opérations qui permettent de manipuler automatiquement ou semi-automatiquement des modèles, par exemple pour générer du code source, s'appellent des transformations de modèles$^,$. Parmi elles, les transformations modèle-à-modèle regroupent les transformations dont le résultat est un modèle. Elles sont notamment utilisées pour assurer la cohérence d'une famille de modèles ou pour créer une représentation globale d'un système dont les modèles décrivent différents aspects.

### Architecture dirigée par les modèles

Réaliser les promesses de l'ingénierie dirigée par les modèles nécessite de développer des outils adaptés à la définition de modèles et de transformations de modèles$^,$. L'architecture dirigée par les modèles (en anglais, model-driven architecture ou MDA) est une initiative majeure pour la concrétisation de l'ingénierie dirigée par les modèles. Apparue en novembre 2000, MDA est une approche de l'Object Management Group (OMG), un organisme de normalisation spécialisé dans les technologies de l'information$^,$. L'OMG développe principalement des spécifications pour promouvoir le paradigme objet et en particulier la modélisation objet. Ces spécifications, parmi lesquelles UML$^,$, ont pour but de garantir l'interopérabilité ainsi que la portabilité des systèmes logiciels dans l'industrie$^,$.
L'architecture dirigée par les modèles tire parti des spécifications de l'OMG.

### Langages de transformations de modèles

Proposé en 2002 puis adopté en 2005, le standard QVT définit un ensemble de langages permettant d'exprimer des transformations de modèles à modèles$^,$ :
* QVT Relations (QVT-R) est un langage déclaratif et relationnel ;
* QVT Operational (QVT-O) est un langage hybride qui propose une structure déclarative à base de règles et permet l'utilisation d'expressions impératives ;
* QVT Core (QVT-C) est un langage déclaratif minimal qui forme le noyau du standard (peu usité, QVT-R étant plus expressif).

## Description
### Concepts
#### Requêtes

Une requête (query) est une expression évaluée sur un modèle donné. Le résultat d'une requête est composé d'une ou plusieurs instances des types définis dans le modèle ou dans le langage de requête. Pour un modèle fondé sur MOF, le résultat d'une requête peut par exemple être un booléen ou un ensemble d'instances de métaclasses du métamodèle. Le langage OCL est un exemple de langage permettant d'évaluer des requêtes sur des modèles.

#### Vues

Une vue (view) est un modèle entièrement dérivé d'un autre modèle (appelé modèle de base). L'intérêt d'une vue est de réorganiser tout ou partie d'un modèle dans un but particulier. Le plus souvent, une vue n'est disponible qu'en lecture seule. Une requête peut être considérée comme un type particulier de vue.

#### Transformations

Une transformation (transformation) est un programme qui génère un modèle cible à partir d'un modèle source. Une vue peut être considérée comme le résultat d'un type particulier de transformation dans laquelle le modèle cible est totalement dépendant du modèle source. Une transformation n'utilisant que des éléments du langage QVT-R est dite relationnelle tandis qu'une transformation n'utilisant que des éléments du langage QVT-O est dite opérationnelle.

### Architecture

Le standard QVT possède ainsi une nature hybride, à la fois déclarative et impérative. La partie déclarative de QVT est le cœur du standard. Elle forme une architecture en deux couches. Le langage QVT-C (Core) est la couche inférieure de l'architecture. Il définit les concepts bas niveau nécessaires à la spécification de transformations à partir du méta-métamodèle EMOF et du langage OCL. Il définit aussi explicitement la constitution des modèles de trace, c'est-à-dire la modélisation des étapes intermédiaires d'une transformation. Le langage QVT-R (Relations) est la couche supérieure de l'architecture. Il met l'accent sur l'utilisabilité, rend implicite l'écriture des modèles de trace et fournit des fonctionnalités comme le filtrage par motif. Entre ces deux couches, la transformation Relations to Core est un moyen systématique de traduire une transformation écrite en QVT-R et un sens d'exécution donné en une transformation écrite en QVT-C.
Dans l'architecture de QVT, deux mécanismes supplémentaires se greffent aux couches déclaratives du standard pour y ajouter le paradigme impératif. D'abord, le mécanisme Operational Mappings fournit une définition de QVT-O. Cette définition est en fait construite sur celle de QVT-R. L'intérêt du paradigme impératif est de permettre une implémentation explicite des relations de QVT-R. Cette implémentation peut elle-même contenir des références à d'autres relations à la manière d'un appel de fonction. En cela, QVT-O est considéré comme un langage impératif (lorsque les transformations sont toutes opérationnelles) ou hybride (en support de transformations relationnelles). Un autre moyen, fourni par le mécanisme Black Box, est d'implémenter une relation avec un langage dédié en respectant la signature de la relation. Dans ce cas, l'implémentation forme une boîte noire. L'interopérabilité est possible si le langage est lui-même conforme au méta-métamodèle MOF, par exemple Java.

### Construction

Le métamodèle QVT, qui définit les éléments de QVT-R, QVT-O et QVT-C, est construit à partir du méta-métamodèle EMOF (Essential MOF) et d'Essential OCL.

## Historique
### Environnement technologique

Dans les années 1980, la programmation procédurale laisse place à la programmation orientée objet puis à la programmation orientée composant. La crise du logiciel, notamment mise en lumière dans Le Mythe du mois-homme de Frederick Brooks, illustre la difficulté de mener à bien de grands projets logiciels$^,$. Les objets puis les composants logiciels apparaissent alors comme une solution pour mettre au point des architectures logicielles plus robustes. À la suite de l'apparition de langages comme Smalltalk, C++ et Java, la programmation orientée objet prend de l'ampleur dans l'industrie et devient l'approche principale pour le développement logiciel à partir du début des années 1990$^,$.
Les cycles de développement logiciel évoluent également. Le modèle en cascade, jugé inefficace$^,$, est supplanté par d'autres modèles de conception comme le modèle en spirale puis le modèle agile. L'analyse des exigences, la gestion des risques, la rédaction de documentation logicielle ainsi que la phase de conception prennent de l'ampleur dans ces modèles$^,$$^,$. En 1999, les informaticiens Ivar Jacobson, Grady Booch et James Rumbaugh mettent au point le processus unifié (PU), une méthode générale pour les systèmes orientés objet qui intègre à la fois un cycle de développement et un ensemble de bonnes pratiques pour l'analyse, la conception et la documentation des systèmes. Largement adopté dans l'industrie, le processus unifié utilise de manière intensive UML, un langage de modélisation orienté objet. Les modèles, à l'exemple des diagrammes UML, deviennent alors des artéfacts essentiels à la production de logiciels$^,$$^,$.

### Origines

Au début des années 2000, l'idée que les modèles puissent également remplacer le code source pendant le développement émerge$^,$. Cela marque les débuts de l'ingénierie dirigée par les modèles qui se définit comme la conjonction de deux concepts fondamentaux : les modèles et les transformations de modèles. Les modèles, qui représentent les différents aspects d'un même système, sont construits à l'aide d'un langage de modélisation comme UML. Les transformations désignent les opérations qui manipulent des modèles, permettant ainsi par exemple de générer du code à partir des modèles.
En 2000, forte de son expérience dans le domaine de la modélisation logicielle avec UML, l'OMG met en place l'architecture dirigée par les modèles (en anglais : Model-Driven Architecture ou MDA), une initiative pour réaliser les promesses de l'ingénierie dirigée par les modèles$^,$. Un méta-métamodèle central à MDA, le Meta-Object Facility (MOF), est créé pour décrire les métamodèles existants et futurs de l'OMG parmi lesquels UML et CORBA. C'est dans ce contexte que la nécessité d'un standard pour la transformation de modèles dans l'approche MDA émerge.

### Appel à propositions

Centrales à l'architecture dirigée par les modèles, les transformations de modèles à modèles font l'objet dès 2002 d'un appel à propositions (en anglais : Request For Proposal) de l'OMG. L'objectif de cet appel à propositions est de mettre au point un standard de transformations de modèles compatible avec le méta-métamodèle MOF et les technologies existantes du MOF. Il est le sixième des sept appels de l'OMG pour construire la version 2.0 du MOF. Les concepts de requête, vue et transformation sont introduits dans l'appel à propositions afin d'en unifier les réponses$^,$ et de tirer parti d'avancées déjà effectuées avant la standardisation comme le modèle de transformation du Common Warehouse Metamodel.
L'appel à propositions pour QVT compte treize exigences, dont sept obligatoires :
* La proposition doit définir un langage de requête pour les modèles ;
* La proposition doit définir un langage de définition de transformations entre un métamodèle source et un métamodèle cible. La définition de la transformation doit permettre de générer un modèle conforme au métamodèle cible à partir d'un modèle conforme au métamodèle source. Les deux métamodèles sont conformes au MOF et peuvent être identiques ;
* Les langages de la proposition doivent eux-mêmes être définis comme des métamodèles conformes au MOF ;
* Le langage de définition de transformations doit contenir toute l'information nécessaire à une exécution automatique de la transformation ;
* Le langage de définition de transformations doit permettre la création d'une vue d'un métamodèle ;
* Le langage de définition de transformations doit être déclaratif afin de permettre l'exécution incrémentale de la transformation ;
* Tous les mécanismes définis dans la proposition doivent fonctionner sur des instances de métamodèles conformes à la version 2.0 du MOF.
Les exigences optionnelles proposent des fonctionnalités pouvant être intégrées au langage de définition de transformations, parmi lesquelles la bidirectionnalité et l'héritage de transformations.

### Réponses à l'appel

L'appel à propositions obtient huit réponses. Ces réponses sont formulées conjointement par une trentaine d'éditeurs de logiciel et d'instituts de recherche en génie logiciel, parmi lesquels IBM, Thales, le King's College de Londres et l'Université d'York$^,$.
Toutes les réponses considèrent que les requêtes font partie des transformations et sont nécessaires à leur spécification. Il n'y a pas de consensus pour le langage de requête : quatre contributions proposent un langage déclaratif (dont OCL ou F-logic), trois contributions proposent un langage hybride ou impératif et une contribution ne propose aucun langage. Sept réponses sur huit considèrent que le résultat d'une transformation doit être une vue. En fin de compte, toutes les réponses sauf une définissent un cadre unifié pour les requêtes, les vues et les transformations. Quatre d'entre elles proposent l'utilisation d'un seul langage pour ces trois aspects tandis que trois autres proposent l'utilisation d'OCL pour les requêtes puis divers formalismes pour les vues et les transformations.

### Standardisation

À la suite de son adoption, la spécification est publiée en phase de finalisation pour la première fois en novembre 2005$^,$, soit plus de trois ans après l'appel à propositions. Il s'agit d'un délai important par rapport aux processus de standardisation habituels de l'OMG. Le langage de requête retenu est OCL, tandis que le concept de vue n'apparait pas dans la spécification$^,$.
La phase de finalisation s'achève en avril 2008 avec la publication de la version 1.0 du standard QVT.
Historique des versions du standard QVT :
| Version | Adoption | Changements majeurs |
| Ancienne version, plus prise en charge : Bêta 1 | novembre 2005 | Première adoption du standard QVT |
| Ancienne version, plus prise en charge : Bêta 2 | juillet 2007 | Conformité de QVT avec le méta-métamodèle MOF |
| Ancienne version, toujours prise en charge : 1.0 | avril 2008 | Première publication du standard QVT |
| Ancienne version, toujours prise en charge : 1.1 | janvier 2011 | Génération de la syntaxe abstraite des langages de QVT |
| Ancienne version, toujours prise en charge : 1.2 | février 2015 | Correction des incohérences dans les métamodèles de QVT, mise à jour des diagrammes |
| Dernière version stable: 1.3 | juin 2016 | Description de QVT Operational (signatures de transformations, traces), utilisation d'OCL dans QVT |
| Légende :Ancienne versionAncienne version, toujours prise en chargeDernière version stableDernière version avancéeVersion future |||

## Implémentations
### Langages propres à QVT

Plusieurs implémentations du standard QVT existent. La plupart d'entre elles sont abandonnées ou inachevées, souvent en raison de l'absence d'une formalisation suffisante des langages du standard. Après une refonte du standard en 2016, l'implémentation est principalement poursuivie par le projet Eclipse MMT (en) (Model-to-Model Transformations) qui utilise lui-même les outils du projet Eclipse Modeling Framework.

### Langages compatibles avec QVT

* Tefkat (en) : autre langage et moteur de transformation de modèles. Propose une compatibilité avec QVT.
* ATL : implémentation du langage du même nom, très librement inspiré du langage QVT.
* VIATRA (en) : environnement de transformation de modèle. Propose une compatibilité avec QVT.
* GReAT (en) : autre langage de transformation de modèles. Propose une compatibilité avec QVT.

## Approches complémentaires

Il est d'usage en ingénierie dirigée par les modèles de spécifier séparément les transformations qui utilisent ou qui produisent du texte (par exemple, du code source ou de la documentation), bien que le texte soit lui-même un modèle. Cela permet de réutiliser certaines fonctionnalités des compilateurs comme la génération de code ou l'analyse syntaxique.
Le standard QVT a été conçu pour les transformations modèle-à-modèle (M2M). Pour les transformations modèle-à-texte (M2T), l'OMG propose le standard MOF2Text.