Metaprogramação baseado em Damaševičius & Štuikys (2008) Agenda 01 02 O que é metaprogramação? Tranformação de código 03 04 Em tempo de compilação Em tempo de execução O que é metaprogramação? Agenda Style Metaprogramação ❏ São programas que geram outros programas; ❏ Metaprogramação : a arte de programar programas que leem, transformam ou escrevem outros programas;(F. Rideau) ❏ O conceito foi aplicado a uma grande variedade de situações dentro do ciclo de desenvolvimento de um software, por isso seu significado pode variar de acordo com o contexto; Conceito Agenda Style Metaprogramação ❏ A professora mandou o Joãozinho escrever um programa que imprima cem vezes na tela que ele irá se comportar, porém, para que isso servisse de lição, ele não poderia usar nenhuma estrutura de repetição no código. Como ele poderia fazer? Problema Agenda Style Metaprogramação ❏ Transformação ❏ Geração ❏ Metaprograma ❏ Reflexão ❏ Metadados ❏ Generalização ❏ SoC - Separation of Concerns ❏ Níveis de abstração Alguns conceitos de metaprogramação Agenda Style Metaprogramação ❏ A obtenção de programas a partir de uma especificação formal (BNF, Open PROMOL), de uma versão antiga ou de uma versão escrita para outra linguagem. ❏ Muda uma forma do programa (sintaxe) em outra. Transformação Agenda Style Metaprogramação ❏ Processo automatizado de criação de um programa a partir de uma especificação de alto nível, tal qual um metaprograma. ❏ A saída do gerador de código pode ser em qualquer linguagem Geração Agenda Style Metaprogramação ❏ Conjuntos de templates escritos em uma linguagem de alto nível, linguagem de macro ou uma metalinguagem; ❏ Componentes genéricos ou módulos de software que possibilitam escolher suas propriedades sem necessariamente precisar escrever o código manualmente; Metaprograma Agenda Style Metaprogramação ❏ Em metaprogramação é comum que existam dois ou mais níveis de abstração. ❏ O nível mais baixo de abstração apresenta as funcionalidades com elementos mais concretos do domínio; ❏ O nível mais alto (genérico ou meta) descreve manipulações com as unidades sintáticas do menor nível, usando uma metalinguagem específica; Níveis de Abstração Agenda Style Metaprogramação ❏ Pode ser entendida como a transformação de um programa de um domínio específico em um componente genérico que é mais reutilizável do que o original. Generalização Agenda Style Metaprogramação ❏ Em metaprogramação, o SoC é usado para separar as partes variáveis do domínio do programa de suas partes fixas; ❏ Também pode ajudar a separar os aspectos computacionais (algoritmo, comportamento) dos compositivos, isto é, aqueles que lidam com integração, interoperabilidade etc. Separation of Concerns (SoC) Agenda Style Metaprogramação ❏ É a habilidade de um programa manipular a semântica do programa como um dado durante a execução do próprio programa. ❏ Geralmente é usada no tempo de execução, porém algumas linguagens podem usar reflexão na compilação com o uso de metadados; Reflexão Agenda Style Metaprogramação ❏ São dados estruturados que descreverm características sobre entidades que guardam informações, auxiliando na identificação, descoberta, análise e gerenciamento das entidades descritas. ❏ Seu papel é descrever e representar informação adicional sobre o metanível de abstração em um metaprograma. Metadado Metaprogramação na plataforma Java Agenda Style Metaprogramação ❏ Annotations, possibilitam a metaprogramação em tempo de compilação. ❏ Java Reflection API possibilita a metaprogramação em tempo de execução; ❏ Groovy, outra linguagem que roda na JVM, permite “Monkey Patching”, isto é, alterar as assinaturas e os comportamentos de um programa em execução, tal qual no Python. Plataforma Java Agenda Style Metaprogramação ❏ Presente desde o Java 5 e incorporado ao compilado no Java 6; ❏ As annotations são tratadas pelo compilador, ferramentas de desenvolvimento e bibliotecas. ❏ Há annotations padrão que estão no pacote java.lang e não precisam ser importadas. Outras podem ser definidas pelo usuário ou pelas APIs utilizadas. Annotations Agenda Style Metaprogramação ❏ Anotações marcadoras, não tem membros, sendo identificadas apenas pelo nome. @Test no JUnit. ❏ Anotações de Valor Único - possuem um único membro, chamado valor, pode ser escrito de forma abreviada. Por exemplo.: @Teste(“lp3a5”) ❏ Anotações de valor completo - possuem mais de um valor: @OutroTeste(disc=”lp3a5”, prof=”Diego”) Annotations - Sintaxe Agenda Style Metaprogramação ❏ As annotations predefinidas estão no pacote java.lang e não precisam ser importadas. ❏ @Deprecated (quando um método é depreciado) ❏ @Override indica que um método sobrescreve o método da classe pai ❏ @SupressWarnings - elimina warnings ❏ Há ainda outras anotações no pacote java.lang.annotation Annotations predefinidas Agenda Style Metaprogramação ❏ Lombok - framework que facilita a metaprogramação em tempo de compilação com o uso de annotation ❏ Bibliotecas de Teste - Mockito, Junit etc. Facilitam criar e modificar o uso de classes durante um teste ❏ APIs e frameworks de persistência : permitem gerar código a partir de metadados das tabelas do banco. Annotations - possibilidades Agenda Style Metaprogramação ❏ Permite tratar o programa em execução como um dado, extraindo informações sobre os métodos, atributos, visibilidade e também executar classes e métodos passando o nome deles como um texto. Reflexão em Java Agenda Style Metaprogramação ❏ É preciso trabalhar com o Class<T> ❏ Para obté-lo pode-se usar: ❏ .getClass() um método do Object, portanto, existente em todas as classes; ❏ .class literal, MinhaClasse.class ❏ Ou o método Class.forName(“br.edu.ifsp.MinhaClasse); ❏ Class<T> .newInstance(), instancia novos objetos e o .getDeclaretedMethod(“nome”) retorna um Method Reflexão em Java Agenda Style Metaprogramação ❏ Taxonomia dos conceitos fundamentais de metaprogramação (Damasevicius e Stuikys) ❏ Tutorial Annotations DevMedia Referências e Indicações de Estudo

Metaprogramação baseado em Damaševičius & Štuikys (2008) Agenda 01 02 O que é metaprogramação? Tranformação de código 03 04 Em tempo de compilação Em tempo de execução O que é metaprogramação? Agenda Style Metaprogramação ❏ São programas que geram outros programas; ❏ Metaprogramação : a arte de programar programas que leem, transformam ou escrevem outros programas;(F. Rideau) ❏ O conceito foi aplicado a uma grande variedade de situações dentro do ciclo de desenvolvimento de um software, por isso seu significado pode variar de acordo com o contexto; Conceito Agenda Style Metaprogramação ❏ A professora mandou o Joãozinho escrever um programa que imprima cem vezes na tela que ele irá se comportar, porém, para que isso servisse de lição, ele não poderia usar nenhuma estrutura de repetição no código. Como ele poderia fazer? Problema Agenda Style Metaprogramação ❏ Transformação ❏ Geração ❏ Metaprograma ❏ Reflexão ❏ Metadados ❏ Generalização ❏ SoC - Separation of Concerns ❏ Níveis de abstração Alguns conceitos de metaprogramação Agenda Style Metaprogramação ❏ A obtenção de programas a partir de uma especificação formal (BNF, Open PROMOL), de uma versão antiga ou de uma versão escrita para outra linguagem. ❏ Muda uma forma do programa (sintaxe) em outra. Transformação Agenda Style Metaprogramação ❏ Processo automatizado de criação de um programa a partir de uma especificação de alto nível, tal qual um metaprograma. ❏ A saída do gerador de código pode ser em qualquer linguagem Geração Agenda Style Metaprogramação ❏ Conjuntos de templates escritos em uma linguagem de alto nível, linguagem de macro ou uma metalinguagem; ❏ Componentes genéricos ou módulos de software que possibilitam escolher suas propriedades sem necessariamente precisar escrever o código manualmente; Metaprograma Agenda Style Metaprogramação ❏ Em metaprogramação é comum que existam dois ou mais níveis de abstração. ❏ O nível mais baixo de abstração apresenta as funcionalidades com elementos mais concretos do domínio; ❏ O nível mais alto (genérico ou meta) descreve manipulações com as unidades sintáticas do menor nível, usando uma metalinguagem específica; Níveis de Abstração Agenda Style Metaprogramação ❏ Pode ser entendida como a transformação de um programa de um domínio específico em um componente genérico que é mais reutilizável do que o original. Generalização Agenda Style Metaprogramação ❏ Em metaprogramação, o SoC é usado para separar as partes variáveis do domínio do programa de suas partes fixas; ❏ Também pode ajudar a separar os aspectos computacionais (algoritmo, comportamento) dos compositivos, isto é, aqueles que lidam com integração, interoperabilidade etc. Separation of Concerns (SoC) Agenda Style Metaprogramação ❏ É a habilidade de um programa manipular a semântica do programa como um dado durante a execução do próprio programa. ❏ Geralmente é usada no tempo de execução, porém algumas linguagens podem usar reflexão na compilação com o uso de metadados; Reflexão Agenda Style Metaprogramação ❏ São dados estruturados que descreverm características sobre entidades que guardam informações, auxiliando na identificação, descoberta, análise e gerenciamento das entidades descritas. ❏ Seu papel é descrever e representar informação adicional sobre o metanível de abstração em um metaprograma. Metadado Metaprogramação na plataforma Java Agenda Style Metaprogramação ❏ Annotations, possibilitam a metaprogramação em tempo de compilação. ❏ Java Reflection API possibilita a metaprogramação em tempo de execução; ❏ Groovy, outra linguagem que roda na JVM, permite “Monkey Patching”, isto é, alterar as assinaturas e os comportamentos de um programa em execução, tal qual no Python. Plataforma Java Agenda Style Metaprogramação ❏ Presente desde o Java 5 e incorporado ao compilado no Java 6; ❏ As annotations são tratadas pelo compilador, ferramentas de desenvolvimento e bibliotecas. ❏ Há annotations padrão que estão no pacote java.lang e não precisam ser importadas. Outras podem ser definidas pelo usuário ou pelas APIs utilizadas. Annotations Agenda Style Metaprogramação ❏ Anotações marcadoras, não tem membros, sendo identificadas apenas pelo nome. @Test no JUnit. ❏ Anotações de Valor Único - possuem um único membro, chamado valor, pode ser escrito de forma abreviada. Por exemplo.: @Teste(“lp3a5”) ❏ Anotações de valor completo - possuem mais de um valor: @OutroTeste(disc=”lp3a5”, prof=”Diego”) Annotations - Sintaxe Agenda Style Metaprogramação ❏ As annotations predefinidas estão no pacote java.lang e não precisam ser importadas. ❏ @Deprecated (quando um método é depreciado) ❏ @Override indica que um método sobrescreve o método da classe pai ❏ @SupressWarnings - elimina warnings ❏ Há ainda outras anotações no pacote java.lang.annotation Annotations predefinidas Agenda Style Metaprogramação ❏ Lombok - framework que facilita a metaprogramação em tempo de compilação com o uso de annotation ❏ Bibliotecas de Teste - Mockito, Junit etc. Facilitam criar e modificar o uso de classes durante um teste ❏ APIs e frameworks de persistência : permitem gerar código a partir de metadados das tabelas do banco. Annotations - possibilidades Agenda Style Metaprogramação ❏ Permite tratar o programa em execução como um dado, extraindo informações sobre os métodos, atributos, visibilidade e também executar classes e métodos passando o nome deles como um texto. Reflexão em Java Agenda Style Metaprogramação ❏ É preciso trabalhar com o Class<T> ❏ Para obté-lo pode-se usar: ❏ .getClass() um método do Object, portanto, existente em todas as classes; ❏ .class literal, MinhaClasse.class ❏ Ou o método Class.forName(“br.edu.ifsp.MinhaClasse); ❏ Class<T> .newInstance(), instancia novos objetos e o .getDeclaretedMethod(“nome”) retorna um Method Reflexão em Java Agenda Style Metaprogramação ❏ Taxonomia dos conceitos fundamentais de metaprogramação (Damasevicius e Stuikys) ❏ Tutorial Annotations DevMedia Referências e Indicações de Estudo