¿Cómo funciona MPS?

Los dialectos y lenguajes específicos acerca de un tema ayudan a las personas a comunicarse de un modo preciso y eficaz acerca de sus respectivas cuestiones. MPS trae la misma flexibilidad al mundo de los lenguajes de programación. A diferencia de los lenguajes de programación tradicionales con sintaxis y semántica estrictas, MPS permite crear un lenguaje desde cero y que sus usuarios lo modifiquen o amplíen.

El problema principal de ampliar lenguajes son los analizadores o parsers, que analizan las cadenas para crear estructuras de datos. Los parsers restringen la representación persistente de código a una única anotación, lo que significa que no pueden combinarse fácilmente con otros parsers, y esto evita la modularización del lenguaje.

La alternativa propuesta más habitualmente para abordar este problema es implementar la presentación no textual del código del programa. Un gran beneficio de este enfoque es que elimina la necesidad de analizar. Sin embargo, en MPS proponemos otra alternativa. Nuestra solución es que el código siempre se mantenga en lo que se denomina un árbol de sintaxis abstracta (AST), una estructura de datos que consta de nodos con un conjunto de atributos (propiedades, hijos y referencias) y describe completamente el código del programa.

La tarea del editor de MPS es entonces visualizar el AST de una forma sencilla y proporcionar una herramienta para una edición efectiva. Por ejemplo, si está creando un lenguaje que simula un lenguaje textual estándar, el editor debería ofrecerle una experiencia similar a la de utilizar un editor de texto común. De mismo modo, si está creando un lenguaje con anotaciones gráficas, el editor debería ofrecerle la misma experiencia que la de un editor de diagramación.

Al crear un lenguaje en MPS, usted define las reglas de edición de código y especifica cómo se presentará el código al usuario. También puede especificar el sistema de tipos del lenguaje y sus restricciones, como un conjunto de reglas aplicadas a su lenguaje. Estas características combinadas permiten a MPS verificar el código del programa sobre la marcha, para hacer que programar con el nuevo lenguaje sea fácil y menos propenso a errores.

MPS usa un enfoque generativo. Esto significa que puede definir generadores para que su lenguaje transforme las entradas de los usuarios finales en un lenguaje más convencional, normalmente de uso general. Actualmente, MPS es especialmente bueno generando código Java, aunque no solo en esto. También puede generar C, C#, XML, FHTML, PDF, LaTeX, JavaScript y más.

¿Qué son los Lenguajes de dominio específico (DSL)?

«Lenguajes de programación que elevan el nivel de abstracción por encima de la programación al especificar la solución que usa directamente conceptos y reglas de correspondientes a un dominio de problemas específico.»

Kelly y Tolvanen (2008)

Con MPS, usted puede definir editores a medida para un nuevo lenguaje y hacer que usar estos DSL sea más simple. Incluso los expertos del dominio, que no están familiarizados con la programación tradicional, pueden trabajar con facilidad en MPS, con lenguajes de dominio específico diseñados en torno a la propia terminología de ese dominio.

Editor de proyecciones

Un editor de proyecciones permite al usuario editar la representación de código de Árbol de sintaxis abstracto (AST, Abstract syntax tree) de una forma eficiente. Puede replicar el comportamiento de un editor textual para notaciones textuales, un editor de diagramas para lenguajes gráficos, un editor tabular para editar tablas, etc. El usuario interactúa con el código a través de intuitivos gráficos en pantalla entre los cuales incluso es posible alternar para múltiples formas de representar visualmente el mismo código.

Compatibilidad de IDE

JetBrains es famoso por sus IDE y herramientas para desarrolladores de alto rendimiento, y MPS no es la excepción.

MPS es un potente IDE con todo lo que necesita para aprovechar al máximo los DSL. Algunas de las funcionalidades incluidas son: finalización de código, navegación, refactorización, detección de errores, arreglos rápidos, depuración de DSL, versionado de lenguajes con migraciones automáticas e integración con sistemas de control de versiones.

Generación de código

El generador de MPS se encarga de cerrar la brecha semántica entre el dominio del negocio y el de implementación.

Mediante una serie de pasos, el generador transforma gradualmente el modelo original de dominio específico en un modelo representado en un lenguaje de bajo nivel de propósito general, como puede ser Java, C, JavaScript o XML. El modelo resultante entonces se puede transformar a su vez en archivos fuente textuales, los cuales pueden ser procesados por compiladores tradicionales para generar binarios ejecutables.

Mientras un lenguaje de dominio específico formaliza el conocimiento sobre el negocio de los expertos en el dominio, el generador encapsula la implementación de ese conocimiento en una tecnología dada. El generador preserva la maestría de los mejores desarrolladores de software en un formato reutilizable y permite que otros se beneficien de ella.

La clara separación del conocimiento del negocio, contenido en el lenguaje, y el conocimiento sobre implementación, alojado en el generador, permite a los usuarios apuntar a múltiples plataformas a la vez al utilizar múltiples generadores para el mismo lenguaje. Los usuarios también pueden ahorrar esfuerzos al cambiar la tecnología objetivo de implementación, ya que solo es necesario cambiar el generador. El conocimiento del negocio contenido en los modelos existentes específicos para cada dominio pueden preservarse intacto.

MPES para crear DSL y Extensiones de lenguaje

MPS originalmente incluía un lenguaje universal listo para usar, llamado BaseLanguage, que era una copia de Java. A lo largo del tiempo hemos agregado lenguajes adicionales como XML, C y JavaScript. Estos se pueden usar por sí mismos para crear programas. Sin embargo, la verdadera utilidad de MPS reside en usarlo para extender BaseLanguage u otros lenguajes universales y crear nuevos lenguajes sobre ellos. MPS incluye varias extensiones útiles a BaseLanguage para trabajar con cadenas, colecciones, fechas, expresiones regulares, etc. También puede usarlas como una referencia para crear nuevos lenguajes. Estas potentes herramientas logran que MPS sea muy eficiente como instrumento para crear Lenguajes de dominio específico (DSL).