Les dialectes et les langages spécifiques à une thématique aident les personnes à communiquer de manière précise et efficace sur leurs sujets respectifs. MPS apporte la même flexibilité au domaine des langages de programmation. Contrairement aux langages de programmation traditionnels dont la syntaxe et la sémantique sont strictes, MPS permet à un langage d'être créé de toutes pièces, modifié et étendu par ses utilisateurs.
Le problème central de l'extension des langages réside dans les analyseurs, qui analysent les chaînes pour construire des structures de données. Les analyseurs limitent la représentation du code persistant à une seule notation, ce qui signifie qu'ils ne peuvent pas être facilement combinés avec d'autres analyseurs, ce qui empêche la modularisation du langage.
L'implémentation de la présentation non textuelle du code de programme est l'alternative la plus couramment proposée pour résoudre ce problème. Cette approche présente l'avantage majeur d'éliminer le besoin d'analyse. Cependant dans MPS, nous proposons une autre alternative. Notre solution consiste à toujours maintenir le code dans ce que l'on appelle une arborescence de syntaxe abstraite (AST), une structure de données qui consiste en des nœuds avec un ensemble d'attributs (propriétés, enfants et références) qui décrivent entièrement le code du programme.
La mission de l'éditeur MPS consiste alors à visualiser l'AST de manière conviviale et à fournir les moyens de l'éditer efficacement. Par exemple, si vous créez un langage qui simule un langage textuel standard, l'éditeur doit fournir une expérience qui reproduit celle de l'utilisation d'un éditeur de texte commun. De même, si vous créez un langage avec des notations graphiques, l'éditeur doit fournir la même expérience que celle que vous auriez en utilisant un éditeur de diagrammes.
Lorsque vous créez un langage dans MPS, vous définissez les règles d'édition du code et spécifiez comment le code est restitué à l'utilisateur. Vous pouvez également spécifier le système de types et les contraintes du langage, en tant qu'ensemble de règles appliquées à votre langage. Combinées, ces caractéristiques permettent à MPS de vérifier le code du programme à la volée, et elles rendent la programmation avec le nouveau langage facile et moins susceptible aux erreurs.
MPS utilise une approche générative. Cela signifie que vous pouvez définir des générateurs pour votre langage afin de transformer les entrées de l'utilisateur final en un langage plus conventionnel, typiquement à usage général. Actuellement, MPS est particulièrement doué pour, mais ne se limite pas à, la génération de code Java. Vous pouvez également générer du C, C#, XML, FHTML, PDF, LaTeX, JavaScript et plus encore.
« Des langages de programmation qui élèvent le niveau d'abstraction au-delà de la programmation en spécifiant la solution qui utilise directement les concepts et les règles d'un domaine de problèmes spécifique. »
Kelly et Tolvanen (2008)
Avec MPS, vous pouvez définir des éditeurs personnalisés pour un nouveau langage et simplifier l'utilisation de langages DSL. Même les experts d'un domaine, qui ne sont pas familiers avec la programmation traditionnelle, peuvent travailler facilement dans MPS avec des langages DSL conçus autour de la terminologie spécifique de leur domaine.
Un éditeur de projection permet à l'utilisateur d'éditer efficacement la représentation AST (arborescence de syntaxe abstraite) du code. Il peut imiter le comportement d'un éditeur de texte pour les notations textuelles, d'un éditeur de diagramme pour les langages graphiques, d'un éditeur tabulaire pour modifier vos tables, etc. L'utilisateur interagit avec le code à travers des visuels intuitifs à l'écran qui lui permettent même de basculer entre plusieurs affichages du même code.
JetBrains est reconnu pour ses IDE et ses outils de développement très performants, et MPS ne fait pas exception.
MPS est un IDE puissant avec tout ce dont vous avez besoin pour tirer pleinement parti des langages DSL. Citons parmi les fonctionnalités incluses : la saisie automatique du code, la navigation, la refactorisation, la vérification des erreurs, les correctifs rapides, le débogage des langages DSL, le versioning des langages avec migrations automatiques et l'intégration aux systèmes de contrôle de version courants.
Le générateur MPS se charge de combler le fossé sémantique entre le domaine métier et le domaine d'implémentation.
Par une série d'étapes, le générateur transforme progressivement le modèle original spécifique au domaine en un modèle représenté dans un langage à usage général de bas niveau, tel que Java, C, JavaScript ou XML. Le modèle résultant peut ensuite être transformé en fichiers sources textuels, qui peuvent être introduits dans des compilateurs traditionnels afin de générer des binaires exécutables.
Tandis qu'un langage spécifique à un domaine formalise les connaissances métiers des experts du domaine, le générateur encapsule la mise en œuvre de ces connaissances dans une technologie donnée. Le générateur préserve l'expertise des développeurs de logiciels les plus expérimentés sous une forme réutilisable et permet aux autres d'en bénéficier.
La séparation claire des connaissances métier, contenues dans le langage, et des connaissances d'implémentation, contenues dans le générateur, permet aux utilisateurs de cibler plusieurs plateformes en même temps, en utilisant plusieurs générateurs pour le même langage. Cela permet également de réduire la charge de travail lors d'un changement de technologie d'implémentation cible, puisque seul le générateur doit être changé. Les connaissances métiers contenues dans les modèles spécifiques au domaine existants peuvent rester intactes.
MPS incluait à l'origine un langage universel prêt à l'emploi appelé BaseLanguage qui était une copie de Java. Au fil du temps, d'autres langages ont été ajoutés, comme XML, C et JavaScript. Ces derniers peuvent eux-mêmes être utilisés pour créer des programmes. Cependant, la vraie force de MPS est de permettre d'étendre BaseLanguage ou d'autres langages universels et de créer de nouveaux langages en plus de ceux-ci. MPS est fourni avec plusieurs extensions utiles à BaseLanguage pour travailler avec des chaînes de caractères, des collections, des dates, des expressions régulières, etc. Vous pouvez également les utiliser comme référence pour créer de nouveaux langages. Ces outils puissants font de MPS un instrument très efficace pour la création de langages spécifiques à un domaine (DSL).