Avant de présenter les nouveautés plus en détail, rappelons qu'un langage dédié (en anglais, Domain specific language ou DSL) est un langage de programmation dont les spécifications sont conçues pour répondre aux contraintes d’un domaine d'application précis. Il s'oppose conceptuellement aux langages de programmation classiques (ou généralistes) comme Java ou C, qui tendent à traiter un ensemble de domaines. Dans de nombreux cas, les DSL ne sont pas conçus pour être utilisés par des développeurs, mais par des non-programmeurs maîtrisant parfaitement le domaine couvert par le langage dédié.
La construction des langages dédiés diffère fondamentalement de celle d'un langage classique. Le processus de développement peut s’avérer très complexe. Sa conception nécessite en effet une double compétence dans le domaine à traiter et en développement informatique. Mais un langage dédié étant basé sur les concepts et les fonctionnalités d'un domaine spécifique, il reste un moyen efficace de décrire et de générer des programmes dans ce domaine ; ce que veut faciliter JetBrains avec MPS.
MPS vous permet de concevoir votre propre langage dédié avec un environnement de développement complet. Il offre un éditeur de code et est fourni avec son propre moteur de génération de code, qui peut être utilisé pour fournir une sémantique aux DSL basés sur MPS. Vous pouvez donc créer des générateurs pour compiler votre DSL dans plusieurs langages cibles, tels que Java, C, XML, etc. Cela dit, pour ceux qui sont déjà familiers à MPS en particulier, quelles sont les nouveautés et améliorations de cette nouvelle version ?
Annotations de la fenêtre Inspector
Les annotations sont désormais accessibles depuis la fenêtre Inspector et le processus d'annotation est maintenant effectué sur la racine entière. Cette action est accessible en faisant un clic droit sur la bordure gauche de la fenêtre Inspector. L'annotation s'ouvre à la fois dans l'éditeur Inspector et l'éditeur principal.
Prise en charge améliorée dans MPS Kotlin
De nombreux problèmes propres à l'éditeur ont été corrigés pour offrir une meilleure expérience de saisie. Plus précisément :
- Les portées ont été refactorisées pour prendre en charge davantage de cas d'utilisation (par exemple, les types de récepteur personnalisés) et améliorer les filtres (moins de duplications, accès aux fonctions masquées).
- Prise en charge des opérateurs de déconstruction par système de type.
- Littéraux numériques : insertion plus facile des valeurs flottantes et longues, et transition entre les nombres non signés et signés.
- Littéraux de chaîne : toutes les chaînes peuvent passer de monoligne à multiligne et inversement en appuyant sur Entrée dans un littéral de chaîne et certains problèmes d'insertion ont été corrigés.
- Les stubs Kotlin prennent en charge le chargement des annotations et des types de fonction avec le récepteur (par exemple, T.() -> R qui était précédemment chargé comme (T) -> R).
- Littéraux lambdas :
- Prise en charge du paramètre implicite it.
- Les littéraux lambdas dont le type comporte un récepteur (par exemple, Receiver.() -> Unit) utiliseront correctement ce type de récepteur en tant que paramètre implicite this dans le corps de la lambda.
Langage SModel pour MPS Kotlin
La prise en charge de SModel est désormais disponible dans MPS Kotlin avec le nouveau langage jetbrains.mps.kotlin.smodel. Outre la prise en charge étendue de la compilation, cela permet d'utiliser le code Kotlin dans les modules de langage (tels que les classes auxiliaires, par exemple).
En supplément des types ordinaires (nœuds, concepts, liens et références), cette solution exploite la flexibilité de MPS Kotlin pour introduire les paramètres de type Concept. Les fonctions, les variables et les classes peuvent désormais déclarer et utiliser ces paramètres et les recycler en tant que types internes, ce qui simplifie la saisie et permet d'exploiter les casts intelligents de Kotlin.
Mises à jour de la compilation de Kotlin
La compilation de Kotlin offre davantage de persistance. Dans cet esprit, les classes Kotlin ne sont plus effacées au redémarrage de MPS.
Une nouvelle option a été ajoutée dans les scripts de build pour marquer un module comme devant être compilé par le compilateur Kotlin. Cet indicateur est inséré manuellement et aucune vérification automatique n'est actuellement disponible pour le définir sur « true ». L'indicateur doit être ajouté lorsqu'un module contenant des fichiers Kotlin est sur le point d'être compilé en JVM.
Styles de texte disponibles dans les commentaires BaseLanguage
Vous pouvez désormais mettre en forme vos commentaires BaseLanguage avec un style de texte. Les styles gras (Ctrl + B), non italique (Ctrl + I), souligné (Ctrl + U) et gras non italique (Ctrl + B -> Ctrl + I) sont désormais pris en charge dans les commentaires.
Transformation Postfix
Dans BaseLanguage, il est désormais possible d'effectuer des transformations Postfix qui vous permettent de transformer le code en ajoutant du texte à l'expression. Cela permet de faire gagner du temps aux développeurs, car ils n'ont pas à déplacer le caret vers l'avant de l'expression ou à sélectionner l'expression de façon à appliquer une transformation.
Découverte différée de modèles avec SModel
Précédemment, MPS découvrait les modèles dès leur enregistrement dans un référentiel. La découverte d'un modèle dans un module de projet ordinaire impliquait précédemment de parcourir le système de fichiers pour identifier les fichiers et leur type, et de lire au minimum les informations d'en-tête relatives au modèle.
Désormais, les modules ne lancent la découverte de modèles que si cela est nécessaire. La nouvelle API SModule (SModule.forEachRegisteredModel()) permet de cibler les modèles déjà connus par un module, sans passer par la découverte ou le chargement de modèles. Si vous utilisez les clients d'API SModel, et notamment les sous-classes SRepositoryContentAdapter, il peut être intéressant d'utiliser la nouvelle API pour bénéficier de l'amélioration.
Amélioration des liens de type Association, également appelés SReference
MPS inclut désormais une API cohérente pour créer des références, ainsi qu'une représentation interne mise à jour de ces références. Ces modifications permettent d'améliorer le système de référence/persistance du modèle, qui est planifié pour les versions ultérieures. Ce changement permet dès à présent de réduire d'environ 5 % le stockage en mémoire de n'importe quel modèle.
Stubs Java
La nouvelle version de MPS tient compte des entrées de version jar et permet d'exposer les classes Java ayant une version correspondant à la valeur d'exécution réelle de Java.
Migration de Log4j vers JUL (Java Util Logging)
Même si MPS et la plateforme IntelliJ utilisaient une version très simplifiée de la bibliothèque Log4j sans problème de sécurité connu, ils utilisent désormais tous les deux le package java.util.logging pour la journalisation. Une couche de compatibilité a été implémentée (sur la base de SLF4J) pour rediriger les requêtes de l'API Log4j vers une implémentation JUL (Java Util Logging).
L'action Debug Log Settings vous permet de configurer les niveaux DEBUG et TRACE pour les catégories. D'autre part, vous disposez à présent du nouveau fichier de configuration bin/log.properties qui utilise le format de configuration JUL reconnu. Contrairement au fichier log.xml des versions précédentes, ce fichier de configuration n'est pas lu par défaut, mais les utilisateurs peuvent demander un accès à cette configuration (ou toute autre configuration externe) via la propriété système idea.log.config.properties.file.
Tâche Make accessible depuis la ligne de commande
Les scripts de build Ant que MPS génère à partir des déclarations lang.build utilisent des tâches différentes pour générer et compiler des sources (<generate> pour MPS et <javac> pour la version standard d'Ant). Vous disposez à présent de la nouvelle tâche <mps.make> qui correspond au processus Make lancé depuis l'EDI. Il est responsable de la transition complète d'un modèle, jusqu'au niveau du code compilé. La tâche combine à la fois la génération et la compilation du code, ce qui permet de gagner du temps puisque MPS nécessite des classes compilées pour son module de chargement des classes (car les tâches <javac> dupliquent souvent les efforts de compilation déjà réalisés lors de la phase <generate>). Cela rend également les builds de ligne de commande Ant et le processus Make lancé depuis l'EDI bien plus similaires et augmente la fiabilité de votre processus de build.
Tests de générateur
Les tests de générateur ont été améliorés et incluent des options de correspondance qui permettent d'ignorer l'ordre des nœuds. D'autre part, une nouvelle action permet de réorganiser les racines du modèle, ce qui aide à mettre les modèles de test de référence dans l'état souhaité.
Paramètre de délai d'expiration pour TextGen
MPS plafonne le temps passé dans la partie de transformation M2T (Modèle vers texte) pour traiter les erreurs potentielles dans les aspects de TextGen. Le plafond était précédemment codé de manière irréversible. Cependant, certains gros modèles atteignaient cette limite, générant une exception indésirable de dépassement du délai. Désormais, l'EDI comporte un paramètre qui permet de contrôler le délai d'expiration. La prise en charge des builds de ligne de commande est prévue pour les versions futures.
Gestion améliorée de la dépendance Java BaseLanguage pour le processus Make
MPS enregistrait auparavant les dépendances entre les classes BaseLanguage générées dans le fichier « dependencies ». Le compilateur Java s'appuie sur cela pour déterminer si les classes de compilation dépendantes ont besoin d'être mises à jour. Cependant, suite à la modification du fichier « dependencies » dans la version 2021.2 pour stocker les dépendances à un niveau supérieur, il n'était plus nécessaire de collecter et de stocker les noms de classe par racine. MPS réduit ainsi le temps de TextGen à la fois pour le code BaseLanguage (puisqu'il n'est plus nécessaire de collecter les dépendances individuelles) et pour le processus de compilation Java (puisqu'il n'est plus nécessaire d'analyser les dépendances de fichier individuelles, d'attribuer les dépendances de fichiers aux modules et aux chemins de classe, ni de propager l'état « dirty »).
Nouveau fichier de stockage des dépendances de modules
Le nouveau fichier deps.cp stocke désormais les dépendances par module pour permettre à MPS de déduire le graphe de compilation du module. Ce fichier conserve l'état de la transformation, il est donc « verrouillé » et personnalisé (il ne liste pas les dépendances qui n'ont pas été utilisées dans la transformation), ce qui contraste avec le graphe de dépendances capturé lors de l'exécution, qui est basé sur les dépendances réelles du module.
Modifications de l'interface utilisateur
MPS ne crée plus de solutions d'exécution/de sandbox imbriquées sous un module de langage. Par défaut, ces modules sont apparentés au module de langage. En cas de changement de nom du module de langage « principal », ces modules étaient toujours reconnus comme « apparentés » et renommés en même temps que le module « principal ».
Clés composites pour le mappage d'étiquettes
Afin d'améliorer la fonctionnalité de clé d'étiquette composite introduite dans les versions précédentes, MPS prend en charge le stockage des clés composites dans les modèles de point de contrôle.
Fonctionnalités de la plateforme
Barre de progression du clonage de référentiel (Cloning repository)
Pour plus de clarté et de facilité d'utilisation, la barre de progression Cloning repository s'affiche désormais sur l'écran d'accueil et directement dans la liste des projets.
Nouvelle action Table of Contents
Il est désormais possible de générer rapidement une table des matières dans les fichiers Markdown sur la base des en-têtes de documents.
Signature GPG
Il est à présent possible de créer une signature GPG dans un commit. La signature s'affichera dans la section Commit Details de la fenêtre d'outils Git.
Exécution de commandes à partir de fichiers Markdown
Lorsque vous travaillez avec des fichiers Markdown qui contiennent des instructions avec des commandes à exécuter, vous pouvez exécuter ces commandes directement à partir du fichier en utilisant les icônes d'exécution dans la gouttière.
La liste des nouveautés et améliorations présentées ici n'est pas exhaustive. Vous trouverez plus de détails dans les notes de version de MPS 2022.2.
Nouveautés et téléchargement de MPS 2022.2