O documento discute o que são linguagens de domínio específico (DSL) e como construí-las usando o framework Xtext. Xtext permite definir uma linguagem através de gramáticas e gera automaticamente um editor para Eclipse. O comportamento da linguagem pode ser implementado através de interpretação ou geração de código usando a ferramenta Xpand para percorrer o modelo.
1. DSL – Como construir uma linguagem em 5 minutos Fábio Neves e Ricardo Mateus 23-02-2011 1
2. Outline O que é uma DSL? Utilidade de uma DSL Benefícios de uma DSL Frameworks para construção de DSLs Xtext Interpretação Geração de código Xpand Exemplos do mundo real 23-02-2011 2
3. O que é uma DSL? “A Domain Specific Language (DSL) is a computer programming language of limited expressiveness focused on a particular domain. (…) Each DSL can only handle one specific aspect of a system.” (Martin Fowler) Exemplosconhecidos: Mathemathica, Graphviz (dot), SQL 23-02-2011 3
7. Benefícios de uma DSL? Abstracções de programação próxima dos conceitos do domínio. Tempo de aprendizagem reduzido Optimiza a resolução do problema Possibilita que especialistas do domínio especifiquem a solução do problema 23-02-2011 7
8. Frameworks para construção de DSLs Irony - http://irony.codeplex.com/ MPS - http://www.jetbrains.com/mps/index.html Spoofax - http://strategoxt.org/Spoofax XText /XPand- http://www.eclipse.org/Xtext/ 23-02-2011 8
9. Xtext Framework integrada com eclipse Permite: Definir linguagem Referências cruzadas Validações semânticas Sintaxe Concreta Gerar um editor para eclipse Auto-complete Outline Validação sintáctica e semântica 23-02-2011 9
17. Comportamento Interpretação Parser da linguagem gerado por Xtext (Java) Árvore de execução obtida através do parser Geração de código XPand 23-02-2011 17
19. Interpretador Parser gerado automaticamente (Xtext) AST Modelo Dividir o grande problema em pequenos problemas. Cada nó corresponde a uma das regras declaradas Avaliamos apenas o necessário a cada nó. 23-02-2011 19
20. Interpretador Parser gerado automaticamente (Xtext) AST Modelo Dividir o grande problema em pequenos problemas. Cada nó corresponde a uma das regras declaradas Avaliamos apenas o necessário a cada nó. Adaptação do algoritmo de busca em profundidade. 23-02-2011 20
21. Interpretador Parser gerado automaticamente AST Modelo Dividir o grande problema em pequenos problemas. Cada nó corresponde a uma das regras declaradas Avaliamos apenas o necessário a cada nó. Adaptação do algoritmo de busca em profundidade. Execução Lenta 23-02-2011 21
23. Compilador/Gerador de código Processo análogo ao Interpretador Recurso a ferramentas que percorram o modelo : Xpand 23-02-2011 23
24. Compilador/Gerador de código Processo análogo ao Interpretador Recurso a ferramentas que percorram o modelo : Xpand Execução rápida e optimizada 23-02-2011 24
25. Compilador/Gerador de código Processo análogo ao Interpretador Recurso a ferramentas que percorram o modelo : Xpand Execução rápida e optimizada Integração com outras tecnologias. 23-02-2011 25
Martin Fowler – Trabalha na ThoughWorks e gosta mt de falar de DSLs DSL pretende atacar um objectivo específico de forma a maximizar a eficiência na resolução desse objectivo. Linguagem tem um conjunto restrito ao nível da expressividade Não é suficiente para a implementação de um sistema inteiro mas sim resolve um problema específico do sistema Não substitui uma GPL. É uma “ferramenta” mais especializada para o programador. Mathematica – resolução de problemas matemáticos (fácil especificação) Graphviz – Definição simples de grafos com correcta disposição dos nós. SQL – linguagem de acesso a dados (usada tradicionalmente sobre um SGBD)
Existe mesmo uma necessidade de uma DSL?
Existe mesmo uma necessidade de uma DSL? Não, mas será que um cirugião fazia o seu trabalho da melhor forma com este tipo de ferramentas? Uma DSL não irá introduzir um conjunto acrescido de erros, vindo da própria implementação da DSL?
Precisão/Eficiência - Um cirugião com um bisturi consegue ser mais preciso na resolução do seu problema. Acréscimo de ponto de falha? - Um bisturi é mais afiado, corta melhor, mas também não introduz novos perigos em relação a uma outra ferramenta menos aguçada? Mas é mais eficiente não é? A responsabilidade está sempre em quem utiliza a ferramenta
* Falar no SQL
Construir uma linguagem é sempre complicado. Podemos sempre programar tudo à mão, criar o parser, os modelos a trabalhar em memória... A não ser que já exista algum tipo de trabalho pré-realizado e que nos facilite o nosso trabalho... Existem algumas frameworks que já tratam de gerar parsers e modelos em memória. Irony – solução em .NET MPS – solução implementada sobre o IDE IntelliJ Spoofax – Solução para eclipse.( concorrente directo do Xtext) XText – framework para eclipse. Robusta. Oferece um editor customizável para além do parser e modelos. ( mais robusto que o Spoofax)
Xtext é uma Ferramenta que permite definir a linguagem Gramática definida via sintaxe própria (adaptação da sintaxe standard EBNF) Permite definir referências cruzadas e com isso automatizar a geração de auto-complete como validações sintáticas (podemos extrapolar para validações semânticas logo). Gera um parser da linguagem definida. Gera uma AST (modelo de beans) a trabalhar em memória. Gera um editor tradicional de eclipse bastante configurável, desde o nível de validação sintática/semântica, a escopo de variáveis, a apresentação visual (fontes, cores, etc...) Xpand é outra tecnologia que se integra com Xtext e que permite definir o comportamento da linguagem.
EBNF Parser ANTLR por base – Gerador de parser/ast com base na gramática. Um dos mais reputados e utilizados A própria sintaxe para definição da linguagem/gramática é uma DSL O plugin Xtext tem ele próprio o habitual nos IDEs ao desenvolvermos um programa numa GPL, auto-complete, outline, Code-highlighting
EBNF Parser ANTLR por base – Gerador de parser/ast com base na gramática. Um dos mais reputados e utilizados A própria sintaxe para definição da linguagem/gramática é uma DSL O plugin Xtext tem ele próprio o habitual nos IDEs ao desenvolvermos um programa numa GPL, auto-complete, outline, Code-highlighting
EBNF Parser ANTLR por base – Gerador de parser/ast com base na gramática. Um dos mais reputados e utilizados A própria sintaxe para definição da linguagem/gramática é uma DSL O plugin Xtext tem ele próprio o habitual nos IDEs ao desenvolvermos um programa numa GPL, auto-complete, outline, Code-highlighting
Definindo a gramática e carregando num simples botão...temos um editor tradicional eclipse da nossa linguagem!! Tudo automáticamente Se a gramática for bem desenhada pouco vamos ter de nos proecupar em implementar validações semânticas/sintáticas e melhorias au auto-complete.
Definindo a gramática e carregando num simples botão...temos um editor tradicional eclipse da nossa linguagem!! Tudo automáticamente Se a gramática for bem desenhada pouco vamos ter de nos proecupar em implementar validações semânticas/sintáticas e melhorias au auto-complete.
Definindo a gramática e carregando num simples botão...temos um editor tradicional eclipse da nossa linguagem!! Tudo automáticamente Se a gramática for bem desenhada pouco vamos ter de nos proecupar em implementar validações semânticas/sintáticas e melhorias au auto-complete.
Temos um editor...temos uma linguagem...mas serve-nos de alguma coisa neste momento? Se alguém falar em linguagem gestual com alguém que não perceba nada dos símbolos entende alguma coisa? Humm... Se calhar é preciso saber interpretar... definir a linguagem é só metade da solução...
Uma das soluções é gerar um interpretador. O modelo gerado é uma árvore, uma AST.
Cada nó corresponde a uma “regra” gramatical. Dividir para reinar.
Adaptação do algoritmo DFS. Cada nó é avaliado e produz uma pequena acção
Um linguagem interpretada é lenta.
Necessitamos de eficiência em runtime? Se calhar é melhor compilar a nossa linguagem para um programa numa linguagem mais rápida.
Para este processo podemos utilizar um processo análogo ao interpretador e gerar código a cada nó... Podemos utilizar uma ferramenta Xpand que integra com Xtext e já executa isto por nós..
Podemos gerar para um qualquer tipo de tecnologias, para vários tipo de linguagem de programação... Podemos gerar código...mas podemos gerar também documentação automaticamente.... =)
Baseia-se em templates para cada regra.... Vários templates, gerações diferentes...tecnologias diferentes... =)
Ferramenta já faz crawl do modelo autopmáticamente
Tem uma sintaxe própria...mas com um conjunto de operadores muito reduzido...fácil de aprender portanto. Extensões a estes operadores pode ser feito em Java (métodos auxiliares..)
É tudo muito giro...mas será que alguém usa algo disto? Xtext claro...o SQL toda a gente usa Sistema que permite compôr pautas de música. Tipo latex. Gera mesmo uma pauta!!!
E definir interfaces para Android/Iphone...da mesma forma.... Applause faz isto. DSL que permite definir menus, navegação, e gerar código para as duas plataformas. Quem já desenvolveu mobile sabe que dá bastante trabalho definir toda a navegação....