BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Rails Summit 2009 - Ruby, Dinamismo e Metaprogramação na Construção de DSLs

Rails Summit 2009 - Ruby, Dinamismo e Metaprogramação na Construção de DSLs

Fabio Kung apresentou, no Rails Summit Latin America 2009, em São Paulo, um keynote sobre metaprogramação na construção de DSL (Domain Specific Language) em Ruby. Fabio Kung é Engenheiro da Computação pela USP. Atua como consultor, instrutor, palestrante e também lidera projetos open-source em Java e Ruby. É um dos autores do primeiro livro brasileiro sobre Design e Arquitetura de Sistemas.

Uma DSL é uma linguagem computacional construída para um domínio específico e restrito, se diferenciando das linguagens de programação tradicionais, C, Java, Ruby, que são utilizadas para desenvolvimento de programas em geral.

Segundo Martin Fowler, uma DSL possui quatro elementos chaves para sua definição:

  • linguagem de programação computacional: Uma DSL é utilizada por humanos para instruir o computador a fazer algo, assim como ajudar na comunicação entre os humanos.
  • natureza da linguagem: Uma DSL é uma linguagem de programação, e como tal deve ter um senso de fluência, onde a expressividade venha não somente das expressões individuais, mas também daquilo que elas podem representar juntas.
  • expressividade limitada: uma linguagem de programação para propósitos gerais provê um enorme leque de recursos, suportando variados tipos de dados, de controle e abstração de estruturas. Tudo isso é muito útil, mas se torna difícil para entender e utilizar. Uma DSL possui uma quantidade mínima de recursos necessários para atender seu domínio. Você não pode construir um software completo com uma DSL, contudo você utilizará uma DSL para um aspecto particular do seu sistema.
  • foco no domínio: uma linguagem limitada é somente útil se possuir o foco claro em um determinado domínio. O foco no domínio é o que faz uma linguagem limitada ser valiosa.

Fabio Kung recomenda a utilização de DSLs desde que você tenha muita certeza do que está fazendo. Afinal, uma DSL pode se tornar uma linguagem pouco expressiva, tornando sua utilização e evolução uma tarefa complexa.

Ele apresentou os principais conceitos de DSL:

DSL Interna
  • Uma linguagem criada por outra linguagem que a torna mais expressiva e restrita a um domínio
  • Gera poucos ruídos em seu contexto
  • Ruby e Scala são linguagens recomendadas para se escrever DSLs internas. Veja um exemplo poi lara cálculos de datas.
  • Java e C# não são recomendados para se escrever DSLs internas.
DSL Externa
  • Linguagem derivada de uma outra linguagem, com uma gramática formal específica
  • Geralmente pouco expressiva
  • Utilizadas para escrever testes; para descrever comportamento de sistemas; para geração de código etc.
  • Linguagens recomendadas: Treetop, Racc, Ragel.

Fabio Kung ressaltou que, ao partir para a solução de um sistema, surge a dúvida entre se utilizar os modelos Top-Down e Bottom-up. Ele citou uma pesquisa do IEEE, que constatou que a maioria dos projetistas e engenheiros de sistemas oscilam entres os modelos Top-Down e Bottom-up, quando estão pensando na solução de um sistema. Para a construção, ele sugere sempre utilizar um modelo semântico, que é capaz de representar um modelo de objeto. Um interessante artigo do Martin Fowler trata do assunto:

[...]
No contexto de uma DSL, o modelo semântico é uma representação em memória, normalmente um modelo de objetos, do mesmo assunto que a DSL descreve. Se a minha DSL descrever uma máquina de estados, então meu Modelo Semântico pode ser um modelo de objetos com classes para estados, eventos etc. Um script DSL definindo estados particulares e eventos poderá corresponder à uma população específica do schema, com uma instância de evento para cada evento declarado no script DSL.
Um Modelo Semântico é justamente um Modelo de Domínio populado por uma DSL.
[...]

No keynote, Fabio Kung apresentou, ao vivo, a solução adotada para uma necessidade real em cloud computing na Locaweb. Ele demonstrou "o poder" de uma DSL interna, em Ruby, para o gerenciamento de processos de máquinas virtuais em cloud computing. O código do keynote est disponibilizado aqui.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT