Linguagens de Domínio Específico

Documentos relacionados
Fundamentos de Programação. Diagrama de blocos

Aula 11: Desvios e Laços

MDS II Aula 04. Concepção Requisitos Diagrama de Casos de Uso (Use Cases)

Engenharia de Software II

Programação Orientada a Objetos SANTOS, Rafael

Algoritmos e Programação II

DIMENSÕES DE PESQUISA EM ENGENHARIA DE SOFTWARE

Banco de Dados. Banco de Dados Parte 2. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Análise e Projeto Orientado a Objetos. Nazareno Andrade Baseado no material dos profs. Hyggo Almeida e Jacques Sauvé

ENG1000 Introdução à Engenharia

Os salários de 15 áreas de TI nas cinco regiões do Brasil

Porquê PADRÕES? - Exemplo

Tratamento e Análise de Dados e Informações (TADI)

Prof. Daniela Barreiro Claro

Modelo Entidade Relacionamento (MER) Professor : Esp. Hiarly Alves

Conceito Básicos de Programação com Objetos Distribuídos. Programação com Objetos Distribuídos (C. Geyer) Conceitos de POD 1

Banco de Dados I. Prof. Edson Thizon

Gestão da Qualidade. Aula 5. Prof. Pablo

Plano de Projeto. Tema 3. Gerência de Projetos Profa. Susana M. Iglesias

Conteúdo programático

PESQUISA OPERACIONAL -PROGRAMAÇÃO LINEAR. Prof. Angelo Augusto Frozza, M.Sc.

ADMINISTRAÇÃO DE BANCOS DE DADOS MÓDULO 8

Aula 5. Uma partícula evolui na reta. A trajetória é uma função que dá a sua posição em função do tempo:

Princípios e Conceitos de Desenho de Software. Projeto de Sistemas de Software Prof. Rodrigo Ribeiro

Tópicos Avançados em Banco de Dados Dependências sobre regime e controle de objetos em Banco de Dados. Prof. Hugo Souza

Introdução à orientação a objetos

Programação de Computadores - I. Profª Beatriz Profº Israel

ENGENHARIA DE SOFTWARE

Capítulo 6. Projeto de arquitetura Pearson Pren0ce Hall. Todos os direitos reservados. 1. slide 1

Cadeira de Tecnologias de Informação. Ano lectivo 2009/2010. Sites dinâmicos. Com Expression Web TI2009/10 EWD_1. Filipa Pires da Silva (2009)

Fundamentos de Sistemas Operacionais

Introdução à Informática

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

2. ALGORITMOS. Unesp Campus de Guaratinguetá

Exemplo COMO FAZER UM TRABALHO ESCOLAR O QUE DEVE CONSTAR EM UM TRABALHO ESCOLAR? Um Trabalho Escolar que se preze, de nível fundamental, deve conter:

Universidade Federal de Pernambuco Mestrado em Ciência da Computação

I. Conjunto Elemento Pertinência

Tutorial do aluno Ambiente Virtual de Aprendizagem (AVA) Rede e-tec Brasil

VIII Oficinas de Formação A Escola na Sociedade da Informação e do Conhecimento praticar ao Sábado. E-learning. 3 de Março de 2007

Gestão da Qualidade. Aula 13. Prof. Pablo

Manual Geral de Aplicação Universal Entrada 2008

TECNÓLOGO EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PROGRAMAÇÃO DE COMPUTADORES I

Modelo Lógico: Tabelas, Chaves Primárias e Estrangeiras

Módulo de Princípios Básicos de Contagem. Segundo ano

Arquitecturas de Software Enunciado de Projecto

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

Como utilizar a tecnologia a favor da sua central de atendimento

Criando scanner para dectar BackupExec vulneráveis ao exploit do Metasploit. Inj3cti0n P4ck3t

Prova de Fundamentos de Bancos de Dados 1 a Prova

E-Learning Uma estratégia para a qualidade do ensino/aprendizagem. Ensino a Distância

10. CPU (Central Processor Unit) Conjunto das instruções Estrutura interna Formato das instruções...

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Disciplina: Unidade III: Prof.: Período:

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação WEB. Prof. André Gustavo Duarte de Almeida www3.ifrn.edu.br/~andrealmeida. Aula II jquery UI

AULA 19 Análise de Variância

Carlos de Salles Soares Neto Segundas e Quartas, 17h40 às 19h10

Informática I. Aula Aula 19-20/06/06 1

OBJETIVO GERAL DA DISCIPLINA

MODELAGENS. Modelagem Estratégica

Tecnologia da Informação

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Hardware: Componentes Básicos. Sistema de Computador Pessoal. Anatomia de um Teclado. Estrutura do Computador. Arquitetura e Organização

PROGRAMAÇÃO DE COMPUTADORES

Consulta à Sociedade: Minuta de Resolução Complementar sobre Acreditação de Comitês de Ética em Pesquisa do Sistema CEP/CONEP

Algoritmos APRENDENDO A PROGRAMAR COM C#

Recorrendo à nossa imaginação podemos tentar escrever números racionais de modo semelhante: 1 2 =

Introdução à Programação de Computadores Parte I

Usando potências de 10

4 Sistema Computacional:

ESCOLA ESTADUAL DR. MARTINHO MARQUES VERA LUCIA DOS SANTOS GIVANILZA ALVES DOS SANTOS MARIA APARECIDA CRIVELI SIRLEI R. C. DO P.

Álgebra Linear Aplicada à Compressão de Imagens. Universidade de Lisboa Instituto Superior Técnico. Mestrado em Engenharia Aeroespacial

NOVA VERSÃO SAFE DOC MANUAL

Arquitetura de Aplicações J2EE. Jorge Fernandes Outubro de 2003

Programação de Computadores I. Linguagem C Função

PLANIFICAÇÃO INTRODUÇÃO ÀS TECNOLOGIAS DE INFORMAÇÃO BLOCO I

FERRAMENTAS DA QUALIDADE FOLHA DE VERIFICAÇÃO

Organização e Arquitetura de Computadores. Ivan Saraiva Silva

MANUAL HAE - WEB MANUAL WEB HAE

RELATÓRIO DEFINIÇÃO. Resumo

UNIVERSIDADE ESTADUAL DO CENTRO-OESTE - UNICENTRO CURSO DE PÓS GRADUAÇÃO EM MÍDIAS NA EDUCAÇÃO JULIANA LEME MOURÃO ORIENTADOR: PAULO GUILHERMETI

Sobre o Visual C

Módulo 1 - Mês 1- Aula 3

SISTEMA CAÇA-TALENTOS MANUAL DE OPERAÇÃO PERFIL SECRETARIA

INICIADOS - 2ª Sessão ClubeMath

MINISTÉRIO DA EDUCAÇÃO FUNDO NACIONAL DE DESENVOLVIMENTO DA EDUCAÇÃO DIRETORIA DE ASSISTÊNCIA A PROGRAMAS ESPECIAIS

OPERAÇÕES COM FRAÇÕES

Exercício. Exercício

MÓDULO 2 Topologias de Redes

Fundamentos de Bancos de Dados 3 a Prova Caderno de Questões

Nivel de Linguagem de Montagem (Assembly)

Linguagem de Programação

BUSCA DE FIDELIZACÃO DOS CLIENTES ATRAVES DA QUALIDADE NO ATENDIMENTO

Avaliação de Interfaces Humano- Computador

Árvores Parte 1. Aleardo Manacero Jr. DCCE/UNESP Grupo de Sistemas Paralelos e Distribuídos

Capítulo 1. Importação de Dados de Instituições Financeiras - Arquivo TXT 3

Análise da Base Nacional Comum Curricular de Matemática. Revisado por Phil Daro, USA Common Core Standards

ARTIGO. Sobre monitoramento a Distancia e aplicação automática de medicamentos. Sistema de monitoração a distancia e aplicação de medicamentos.

Roteiro... Sistemas Distribuídos Aula 4. Troca de mensagens. Comunicação entre processos. Conceitos de SD, vantagens e desvantagens

Transcrição:

Linguagens de Domínio Específico Fabio Mascarenhas 2017.1 http://www.dcc.ufrj.br/~fabiom/dsl

Definindo DSLs Linguagem específica de domínio: uma linguagem de programação de computadores de expressividade limitada focada em um domínio específico Linguagem de programação de computadores: uma linguagem usada por humanos para instruir um computador a fazer algo Natureza de linguagem: senso de fluência, composicionalidade Expressividade limitada: mínimo de recursos para ser útil ao seu domínio Foco no domínio: foco claro em um domínio pequeno

DSLs externas Separadas da linguagem principal Sintaxe customizada Análise sintática usual de linguagens de programação Não necessariamente arquivos separados, pode ser embutida em strings na linguagem principal Exemplos: expressões regulares, SQL, Graphviz DOT, makefiles, arquivos de configuração

DSLs internas Uma maneira estilizada de usar uma linguagem de propósito geral Código de uma DSL interna é código válido em sua linguagem principal, mas usa apenas um subconjunto de seus recursos Normalmente a linguagem principal tem recursos de metaprogramação, seja sintática (macros) ou dinâmica (reflexão) Exemplos: vários frameworks nas linguagens Ruby (especialmente o Ruby on Rails) e Scala, arquivos de configuração em Lua

DSLs internas vs APIs comando-consulta Em uma API comando-consulta, seus métodos são de certa forma autossuficientes, e podem ser usados isoladamente Em uma DSL interna, seus métodos frequentemente só fazem sentido no contexto de uma expressão que compõe vários desses métodos

DSLs autossuficientes e fragmentárias A DSL do controlador da última aula é um exemplo de DSL autossuficiente Podemos examinar um programa em uma DSL autossuficiente e entender o que ele faz isoladamente do programa principal DSLs também podem ser fragmentária, usando pedaços de DSL como melhorias em uma linguagem hospedeira Dois bons exemplos de DSLs fragmentárias são expressões regulares e SQL

Por que usar uma DSL? Aprimorar a produtividade de desenvolvimento quanto mais fácil de ler um trecho de código e entender o que ele faz, mais fácil é encontrar erros e modifica-lo Comunicação com especialistas em domínio mesmo que um especialista não possa escrever, ele pode ler e entender o que está expresso na DSL Mudança no contexto de execução de tempo de compilação para tempo de execução, ou do programa principal para um sistema de banco de dados Modelo computacional alternativo modelos diferentes do modelo imperativo tradicional podem dar soluções mais simples para diversos problemas

Problemas com DSLs Cacofonia de linguagens ter diversas linguagens no mesmo projeto dificultaria introduzir novas pessoas ao projeto Custo de construção uma DSL tem um custo para ser implementada e mantida, pois requer conhecimento mais especializado Feature creep uma DSL que ganha muitos recursos pode acabar se tornando uma linguagem de propósito geral, usada para desenvolver sistemas completos Abstração restrita a menor expressividade das DSLs pode complicar bastante a solução de problemas que não se encaixam bem no propósito dela

Processamento de uma DSL

Modelo semântico Representação abstrata do comportamento dos programas na DSL Em uma DSL interpretada, a base para o interpretador Pode ser também uma API que a DSL encapsula, nesse caso é independente da DSL Podemos até ter várias DSLs e APIs tendo como alvo o mesmo modelo semântico Tanto DSLs externas quanto internas usam podem modelos semânticos

Analisador sintático O analisador sintático extrai uma estrutura em árvore do texto de um programa Uma estrutura em árvore é uma estrutura hierárquica das partes que compõem o programa Não existe uma estrutura única, podemos pensar em várias estruturas diferentes para representar o mesmo programa Depois de extraída essa árvore, ela é percorrida para instanciar o modelo semântico (ou o modelo é construído diretamente, e a árvore fica apenas implícita no call stack do analisador sintático)

Árvore sintática e modelo semântico

Gramáticas Uma gramática é uma descrição formal de como um texto se transforma em uma árvore sintática Basicamente é um conjunto de regras de produção, onde cada regra possui um termo sintático no lado esquerdo e um modelo de sentença para esse termo no lado direito (formado por outros termos sintáticos) additionstatement := number '+' number Uma linguagem pode ter várias gramáticas!

Contexto Depois de construir a árvore, precisamos percorrer a árvore para construir o modelo semântico Durante esse percurso, precisamos guardar o contexto atual No exemplo acima, o nome unlockdoor na lista de ações no estado idle é uma referência a comando unlockdoor definido no bloco de comandos

Exemplo de análise sintática

Tabela de símbolos Guardamos o contexto em uma tabela de símbolos Uma tabela de símbolos é um dicionário que associa um nome a um objeto contendo seus atributos Definições inserem novos elementos na tabela de símbolos, e referências são consultadas na tabela O objeto guardado na tabela depende do tipo de processamento que estamos fazendo da árvore; pode ser um objeto do modelo semântico, por exemplo A depender da linguagem mais de um percurso pode ser necessário; por exemplo, a linguagem pode permitir usos antes das definições

Mais contexto Outra espécie de contexto aparece quando temos partes de um todo Em uma linguagem de programação OO, uma espécie desse tipo de contexto é a classe onde estamos definindo métodos e campos No exemplo acima, a qual estado as ações pertencem é parte desse contexto Podemos representar esse contexto através de variáveis de contexto; elas podem inclusive ser armazenadas na tabela de símbolos

Teste de DSLs modelo semântico Podemos dividir os testes de uma DSL nos testes do modelo semântico, do analisador sintático e dos programas em si Os testes do modelo semântico se parecem com os testes de unidade tradicionais de uma biblioteca

Teste de DSLs analisador sintático Podemos testar o analisador sintático com pequenos trechos do código na DSL, conferindo que eles geram o objetos desejados no modelo semântico

Testes negativos É importante também testar o analisador com entradas inválidas, e verificar se elas estão gerando erros corretamente Podemos ter tanto entradas sintaticamente inválidas (algum termo faltando, ou escrito errado) ou semanticamente inválidas (uma referência não definida, por exemplo, ou uma operação feita com operandos inválidos)

Teste de DSLs testando os programas Uma DSL pode não ser expressiva o suficiente para se escrever nela própria O implementador da DSL deve fornecer ferramentas em volta do ambiente de execução da DSL que permitam descrever e executar testes Esse arcabouço de testes também é útil para testes de integração da implementação da DSL como um tudo O arcabouço pode até usar outra DSL!

Tratamento de erros Um bom sistema de detecção e comunicação de erros é importante em qualquer linguagem de programação, e DSLs não são exceção Um erro deve sempre indicar ao usuário pelo menos uma localização aproximada no programa fonte onde o erro foi detectado, e qual a natureza do erro Isso quer dizer que essa informação de localização tem que ser propagada desde o texto até os objetos do modelo semântico Outra coisa importante é sempre fornecer uma sintaxe para comentários na DSL, assim como uma maneira de obter um traço da execução do programa, o que ajuda muito na depuração