Dialetos e linguagens específicas de assuntos ajudam as pessoas a se comunicarem com precisão e eficácia sobre seus respectivos assuntos. O MPS traz a mesma flexibilidade ao mundo das linguagens de programação. Diferentemente das linguagens de programação tradicionais, com sintaxe e semântica estritas, o MPS permite que uma linguagem seja criada do zero, alterada ou estendida por seus usuários.
O principal problema de estender linguagens reside nos analisadores, que analisam strings para construir estruturas de dados. Os analisadores restringem a representação persistente do código a uma única notação, o que significa que não podem ser facilmente combinados com outros analisadores, impedindo a modularização da linguagem.
A implementação da apresentação não textual do código do programa é a alternativa mais comumente proposta para resolver esse problema. Um grande benefício dessa abordagem é que ela elimina a necessidade de análises. No entanto, no MPS, propomos outra alternativa. Nossa solução é sempre manter o código em uma árvore de sintaxe abstrata (AST), uma estrutura de dados que consiste em nós com um conjunto de atributos (propriedades, filhos e referências) que descrevem totalmente o código do programa.
A tarefa do editor MPS é então visualizar a AST de maneira amigável e fornecer os meios para sua edição eficiente. Por exemplo, se você está criando uma linguagem que simule uma linguagem textual padrão, o editor deve fornecer uma experiência que reproduza o uso de um editor de texto comum. Da mesma forma, se você está criando uma linguagem com notações gráficas, o editor deve fornecer a mesma experiência que você teria usando um editor de diagramação.
Ao criar uma linguagem no MPS, você define as regras para editar o código e especificar como ele é renderizado para o usuário. Você também pode especificar o sistema de tipos e as restrições da linguagem, como um conjunto de regras aplicadas à sua linguagem. Combinadas, essas características permitem que o MPS verifique o código do programa em tempo real e tornam a programação com a nova linguagem fácil e menos suscetível a erros.
O MPS usa uma abordagem generativa. Isso significa que você pode definir geradores para sua linguagem para transformar a entrada do usuário final em uma linguagem mais convencional, normalmente de uso geral. Atualmente, o MPS é particularmente bom em, mas não está limitado a, gerar código Java. Você também pode gerar C, C#, XML, FHTML, PDF, LaTeX, JavaScript e muito mais.
"Linguagens de programação que aumentam o nível de abstração além da programação, especificando a solução que usa diretamente conceitos e regras de um domínio de problema específico."
Kelly e Tolvanen (2008)
Com o MPS, você pode definir editores personalizados para uma nova linguagem e simplificar o uso dessas DSLs. Mesmo especialistas em domínio, que não estão familiarizados com a programação tradicional, podem trabalhar facilmente no MPS com linguagens específicas de domínio projetadas com base em sua terminologia específica de domínio.
Um editor de projeção permite que o usuário edite a representação do código da árvore de sintaxe abstrata (AST) de maneira eficiente. Ele pode imitar o comportamento de um editor de texto para anotações de texto, um editor de diagrama para linguagens gráficas, um editor de tabela para editar tabelas e assim por diante. O usuário interage com o código por meio de recursos visuais intuitivos na tela, que podem ser alternados para várias exibições do mesmo código.
A JetBrains é conhecida por seus IDEs de alto desempenho e ferramentas de desenvolvimento, e o MPS não é exceção.
O MPS é um IDE poderoso, com tudo o que você precisa para aproveitar ao máximo as DSLs. Alguns dos recursos incluídos são: preenchimento de código, navegação, refatoração, verificação de erros, correções rápidas, depuração de DSLs, controle de versão de linguagens com migrações automáticas e integração com os principais sistemas de controle de versão.
A construção da ponte semântica entre o domínio comercial e o domínio de implementação é controlada pelo gerador do MPS.
Através de uma série de etapas, o gerador gradualmente transforma o modelo específico de domínio original em um modelo representado em uma linguagem de propósito geral de baixo nível, como Java, C, JavaScript ou XML. O modelo resultante pode ser posteriormente transformado em arquivos de origem textual, que podem ser alimentados em compiladores tradicionais para gerar binários executáveis.
Enquanto uma linguagem específica de domínio formaliza o conhecimento comercial dos especialistas em domínio, o gerador encapsula a implementação desse conhecimento em uma determinada tecnologia. O gerador preserva a experiência dos desenvolvedores de software mais antigos de forma reutilizável e permite que outros se beneficiem dela.
A separação clara do conhecimento comercial, contido na linguagem, e o conhecimento de implementação, mantido no gerador, permite que os usuários se voltem para várias plataformas ao mesmo tempo, usando vários geradores para a mesma linguagem. Os usuários também podem poupar esforços ao trocar a tecnologia de implementação de destino, pois apenas o gerador precisa ser alterado. O conhecimento comercial contido nos modelos específicos de domínio existentes pode permanecer intacto.
O MPS originalmente incluía uma linguagem universal pronta para uso chamada BaseLanguage, que era uma cópia do Java. Com o tempo, outras linguagens foram adicionadas, como XML, C e JavaScript. Elas mesmas podem ser usadas para criar programas. No entanto, o ponto forte do MPS é quando ele é usado para estender a BaseLanguage ou outras linguagens universais e criar novas linguagens sobre elas. O MPS vem com várias extensões úteis da BaseLanguage para trabalhar com strings, coleções, datas, expressões regulares etc. Você também pode usá-las como referência para criar novas linguagens. Essas poderosas ferramentas tornam o MPS bastante eficiente como um instrumento para a criação de linguagens específicas de domínio (DSL).