Meta-Programação com. Julia Lima. Agosto 2010



Documentos relacionados
ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

Introdução à Programação com Classes em C++

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Templates. Introdução. Motivação. Thiago Rosso Adams

INFORMÁTICA E COMPUTAÇÃO CMP 1060 CONTROLE DE FLUXO ESTRUTURA CONDICIONAL 1

Prof. Jhonatan Fernando

Algoritmos e Programação

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

Tipo de Dados em Linguagem C

Programação científica C++

Fundamentos de Programação Linguagem C++ Entrada e saída com arquivos

Tipo Abstrato de Dados

Programação Estruturada I

Computação II Orientação a Objetos

Aula 8- Standard Template Library. Arthur Ribacki Gabriel Portal Leonardo Chatain Luiz Fernando Scheidegger Rosália Schneider

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Programando em C++ Histórico da Linguagem C

INTRODUÇÃO À LINGUAGEM C++

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

Algoritmo e Técnica de Programação - Linguagem C

O COMPUTADOR. Introdução à Computação

Carga horária : 4 aulas semanais (laboratório) Professores: Custódio, Daniel, Julio foco: introdução a uma linguagem de programação Linguagem Java

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Algoritmos e Técnicas de

Estruturas de Dados Aula 15: Árvores 17/05/2011

Princípios de programação em Linguagem C++

Trabalho 3: Agenda de Tarefas

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Conceito de classe em C++

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Programação de Computadores Primeiros Passos Práticos em C++

Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

Introdução à Programação. Programação Imperativa (Registros X Classes e Métodos Nativos )

9 Comandos condicionais

GERADOR DE DOCUMENTAÇÃO PARA LINGUAGEM C, UTILIZANDO TEMPLATES. Acadêmico: Vilmar Orsi Orientadora: Joyce Martins

Programação Funcional. Aula 5. Funções Recursivas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

Variáveis e Comandos de Atribuição

Introdução a Computação

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

LINGUAGEM C. Estrutura básica de um programa

Programação: Estruturas de seleção

2. Constantes e Variáveis

Introdução à linguagem de programação C++ Tulio Marcus R. Calixto Centro de Informática de Ribeirão Preto

String em C++ Verificando o tamanho da string

Hashing (Tabela de Dispersão)

Manual do Usuário - JIDOSHA

Pilhas. Profa Morganna Diniz

Linguagem de Programação C

Sumário. Parte I Filosofia e Modelagem Orientada a Objetos... 23

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Aula 1 Tipo Abstrato de Dados

Programação Orientada a Objetos C++

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

10/02/2015. Introdução. Podemos classificar os tipos de dados a serem processados em dados e instruções Dados: Algoritmos e Lógica de Programação

Linguagens de Programação

AULA 1: PARADIGMAS DE PROGRAMAÇÃO

ILP - Introdução à Linguagem de Programação. Plano de estudo: - Constantes e variáveis. - Atribuindo valores às variáveis.

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

Estrutura Condicional C++

Guia de Consulta Rápida C++ STL. Joel Saade. Novatec Editora

E/S CPU. Memória (Instruções e dados) 2 PARADIGMA IMPERATIVO. Instruções e dados. Resultados das operações. Unidade lógica e aritmética

Linguagem de Programação III

INF 1007 Programação II

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Operadores unários de incremento/decremento. Ciclo for

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Algoritmo Iterativo. Dilema do Martelo x Edifício. O Martelo. O Edifício 01/06/2014. Dilema das ações x declarações

Programação científica C++

Programação em C++: Introdução

Introdução à Programação Orientada a Objetos com C++ Antonio Mendes da Silva Filho

Estrutura de Dados Básica

Simulado de Algoritmos - Respostas

Programação: Tipos, Variáveis e Expressões

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Linguagem de Programação I. Orientação a Objetos em Java

Um Exemplo de Refatoração. Prof. Alberto Costa Neto DComp/UFS

Registros. Técnicas de Programação. Rafael Silva Guimarães

INF 1010 Estruturas de Dados Avançadas

Estrutura switch if-else switch switch switch if-else-if switch switch case default break switch switch break Observações: case

Filas: conceitos e implementações

GABARITO COMENTADO SISTEMAS OPERACIONAIS. PROF. Cláudio de C. Monteiro, Evanderson S. de Almeida, Vinícius de M. Rios

Estruturas compostas

Técnicas de Programação I

Resumo da última aula. Compiladores. Tipos. Regras semânticas. Expressões de tipos. Análise Semântica e checagem de tipos.

A linguagem C oferece quatro estruturas de decisão: if, if-else, switch e o operador condicional.

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Tipos de Dados Simples

Transcrição:

Meta-Programação com Templates Julia Lima Agosto 2010

O que é Meta-programação Desenvolver um programa que gera um outro programa Meta-programas A linguagem usada para criar um metaprograma permite a manipulação dos elementos simbólicos da linguagem na qual o programa resultante será descrito.

Meta-programação por Templates Meta-programação por Templates (Template Meta-programming, ou TMP) é o conjunto de técnicas de programação que utilizam o mecanismo de instanciação de templates com o objetivo de prover capacidade de metaprogramação a uma linguagem de programação. C++ é a principal linguagem de desenvolvimento de TMP

Os primórdios Todd Veldhuizen lançou as bases para aplicações práticas utilizando TMP e demonstrou que o mecanismo de instanciação de templates da linguagem C++ é uma linguagem de poder computacional equivalente a qualquer outra linguagem de programação de uso geral.

Padronização de TMP Algumas técnicas de TMP estão sendo consideradas pelo comitê de padronização ISO/IEC para as próximas versões da biblioteca padrão de C++

Um exemplo clássico #include <iostream> using namespace std; template<int N> struct Fact { enum { value = N * Fact<N-1>::value }; }; template<> struct Fact<1> { enum { value = 1 }; }; int main() { int result = Fact<3>::value; cout << "Resultado: " << result << endl; } int Example = Fact<3>::value; int Example = 3 * Fact<2>::value; int Example = 3 * 2 * Fact<1>::value; int Example = 3 * 2 * 1; int Example = 6;

Características da TMP Um meta-programa é avaliado em tempo de compilação Um meta-programa é composto basicamente de elementos estáticos da linguagem como definições de tipos (class, struct, union, typedef, enum), funções livres, funções e variáveis membro estáticas.

Características da TMP Programação Funcional o conceito de mudança de estado no qual a programação imperativa se baseia não é compatível com a natureza estática da TMP na programação funcional, um programa é concebido como um grupo de declarações, que relacionam entradas às saídas específicas as técnicas e algoritmos usados em TMP são baseados principalmente em técnicas e algoritmos usados em linguagens funcionais.

Características da TMP Code Bloat (ou código inchado) cada instância de um template gera um tipo de dados, com sua implementação diferente de outras instâncias do mesmo template Para prevenir ou reduzir o Code Bloat, as estruturas usadas em TMP devem ser desprovidas de conteúdo dinâmico, o quanto possível, contendo somente elementos que não geram código executável ou consomem espaço de armazenamento em tempo de execução Exs: tipos definidos (typedef), enumerações (enum) e funções inline

Características da TMP Dependência do Compilador Técnicas de TMP tendem a levar o compilador ao limite e podem não ser suportadas por compiladores com baixo grau de aderência ao padrão.

Recursos da Linguagem usados em TMP Templates Referência para Parâmetro de Template Especialização de Templates Funções Inline

Técnicas de TMP: Bases Base É um template que armazena referências para seus parâmetros, criando uma entidade identificável dentro do meta-programa, capaz de armazenar informações para uso futuro. template<typename T> struct Type { typedef T type; }; template<typename T, T V> struct Value { enum { value = V }; }; template<int V> struct Int : Value<int,V> {};

Técnicas de TMP: Bases Sem TMP: enum Tasks { A, B, C }; void foo(tasks t) { switch(t) { case A: /* Tarefa A */; break; case B: /* Tarefa B */; break; case C: /* Tarefa C */; break; } }; foo(a); Usando TMP: void foo(value<tasks, A>) { /* Tarefa A */ }; void foo(value<tasks, B>) { /* Tarefa B */ }; void foo(value<tasks, C>) { /* Tarefa C */ }; foo(value<tasks, A>());

Técnicas de TMP: Meta-Funções Meta-funções Meta-funções são templates contendo expressões e construções que são avaliadas durante o processo de instanciação e cujo resultado é guardado em uma Base template<int V> struct Times2 : Int<2*V> {}; template<int V> struct Times2 { enum { value = 2 * V }; };

Técnicas de TMP: Wrappers Wrappers Bases e meta-funções que encapsulam dados nativos e suas operações typedef Value<bool,true> True; typedef Value<bool,false> False; template<typename B> struct Not : Value<bool,!B::value> {}; template<typename LHS, typename RHS> struct And : Value<bool, LHS::value && RHS::value> {}; template<typename LHS, typename RHS> struct Or : Value<bool, LHS::value RHS::value> {};

Técnicas de TMP: Type Traits Type Traits Obter e manipular informações sobre um tipo Usa especialização de templates template<typename T> struct IsNil : False {}; template<> struct IsNil<Nil> : True {}; template<typename T1, typename T2> struct IsEq : False {}; template<typename T> struct IsEq<T,T> : True {}; template<typename T> struct IsConst : False, Type<T> {}; template<typename T> struct IsConst<const T> : True {}; template<typename T> struct IsPtr : False, Type<T> {}; template<typename T> struct IsPtr<T*> : True, Type<T> {};

Técnicas de TMP: Meta Ifs Meta Ifs Uso de seleções do tipo if-then-else em metaprogramas. Usa especialização parcial de templates template<bool B, typename Then, typename Else> struct If : Type<Then> {}; template<typename Then, typename Else> struct If<false,Then,Else> : Type<Else> {};

Técnicas de TMP: Meta Ifs template<typename T> struct DeepCopy { static inline void apply(container<t>& src, Container<T>& dst) {...} }; template<typename T> struct ShallowCopy { static inline void apply(container<t>& src, Container<T>& dst) {...} }; template<typename T> class Container {... void copy(container<t>& that) { If< And< IsConst<T>, Or< IsPtr<T>, IsRef<T> > >::value, ShalowCopy, DeepCopy >::type::apply(that, *this); }... };

Técnicas de TMP: Lista Encadeada Lista Encadeada estrutura de dados do tipo lista encadeada para tipos template<typename T, typename N=Nil> struct LI : Type<T> { } typedef N next; typedef LI<signed char, LI<short, LI<long > > > Integers

Técnicas de TMP: Lista Encadeada Sem TMP: void foo() { TimeLog::begin(); Module1::exec(); TimeLog::end(); TimeLog::begin(); Module2::exec(); TimeLog::end(); //... TimeLog::begin(); ModuleN::exec(); TimeLog::end(); };

Técnicas de TMP: Lista Encadeada Com TMP: template<typename T> struct Foo { static inline void exec() { TimeLog::begin(); T::type::exec(); TimeLog::end(); Foo<typename T::next>::exec(); }; }; template<> struct Foo<Nil> { static inline void exec() {}; }; typedef Foo< LI<Module1, LI<Module2,... LI<ModuleN>...> > > myfoo; myfoo::exec()

Conclusões TMP é um recurso poderoso Eficiência Flexibilidade Menor quantidade de linha de código Não é simples! Exige um nível de abstração do compilador Estilo de programação funcional Difícil de entender