1 Static Metaprogramming In C++ K. CZARNECKI e U. EISENECKER Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística.

Slides:



Advertisements
Apresentações semelhantes
Funções em C.
Advertisements

1 Java: Tratamento de Exceções Alcides Calsavara.
Programando com Threads em C
2008 LCG/UFRJ. All rights reserved. 1 Standard Template Library STL Claudio Esperança Paulo Roma Cavalcanti.
1 Estruturas de Controle Márcia J. N. Rodrigues Lucena Especialização em Técnicas e Ferramentas de Apoio à Decisão Departamento.
Prof. José Fernando Rodrigues Júnior Pacotes Material original: Profa. Elaine Parros Machado de Sousa SCC Bancos de Dados e Suas Aplicações.
Implementando um Montador com LEX e YACC
Banco de Dados Aula 01: Conceitos Básicos
Computação: Cursos, Atuação e Interação Profissional Marcos José Santana Departamento de Ciências de Computação e Estatística ICMC-USP - São Carlos.
Grupo Paralelismo – Unesp RC
INTRODUÇÃO À COMPUTAÇÃO PARALELA
Introdução à Lógica de Programação
Arquitetura de computadores
Universidade Federal da Bahia – Centro de Processamento de Dados – Preview Computadores 1 Uma Ferramenta Orientada a Modelos para Geração de Aplicações.
Gustavo Vieira Pereira
Modelando com UML CMP 231 – Sistemas Embarcados
Servidores e Programação Web Redes de Computadores.
Profa. Graziela Santos de Araújo Algoritmos e Programação II, 2010
Geração de Código Cap. 8. Introdução Fase final para um compilador Entrada é uma representação intermediária do código fonte e a saída é um programa para.
Arquitetura de Computadores I
O Fluxo de Testes © Alexandre Vasconcelos
TerraRadar Aplicativo para tratamento de imagem de Radar Utilizado através de dois tipos de interface : TerraView - (QT) Browser - (PHP)
Design Patterns – Composite e Visitor
Funções definidas pelo usuário STL oferece a possibilidade de que o usuário escreva seus próprios algoritmos para processar os elementos de coleções #include.
Templates e Questões de Design Programas são geralmente construídos segundo um design que é relativamente bem mapeado nos mecanismos oferecidos pela linguagem.
Funções de um computador
Arquitetura de Sistemas de Informação
Sistemas de Tutoria Inteligente (STI) Visam proporcionar instrução de forma adaptada a cada aprendiz. STIs adaptam o processo de instrução a determinadas.
CES-11 LAB 03 Bitmap Quadtree
CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica.
Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura.
1.3 – Interpretadores – Compiladores versus Interpretadores
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
CES-41 COMPILADORES Aulas Práticas
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo VII Variáveis Indexadas Numéricas.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo XI Noções de Estruturas de Dados.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,
CES-41 COMPILADORES Capítulo I Introdução.
MAC499 - Trabalho de Formatura Supervisionado Sistema de Reconhecimento de Escrita On-Line.
EEL170 COMPUTAÇÃO I Antonio Cláudio Gómez de Sousa 1a série de slides versão 19/03/2012.
ARQUITETURA DE COMPUTADORES SOFTWARE PROGRAMA SEQUENCIA DE INSTRUÇÕES
Administração de Sistemas de Informação
Organização de Sistemas de Computadores
C/C++.
Prof. Giovanny Lucero Introdução Prof. Giovanny Lucero
Linguagens Formais e Tradutores Linguagens Regulares (Revisão)
Recursividade Estrutura de Dados.
Curso de Programação em C++
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
LINGUAGENS DE PROGRAMAÇÃO
Programação Concorrente com Thread Java
Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura.
Renderização de cenas por traçado de raios na Placa Gráfica Fabiano Segadaes Romeiro Sistemas Gráficos 3D IMPA.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Usando Java no Oracle Por Edson Almeida Junior
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
PROGRAMAÇÃO ESTRUTURADA II
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 30 (1) Empacotamento de Dados em MPI Tópicos: Buffer de Mensagem Empacotamento/Desempacotamento.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Procedural vs. OO (Figuras Geométricas: Área do triângulo)
Metaprogramação Estática André Knabben Pricilla Padaratz.
//. retangulo. c - exibe um retangulo vermelho no vídeo
Introdução a Programação
Linguagem C Para programadores Python
Algoritmos e Estruturas de Dados I
COMPILADORES 06 Prof. Marcos.
Fundamentos de Programação 1
DIFERENTES TIPOS DE RODAS
Transcrição da apresentação:

1 Static Metaprogramming In C++ K. CZARNECKI e U. EISENECKER Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Edson Ricardo Amboni John Cleber Jaraceski Ronivaldo Fernando Moretti

2 Metaprogramming “A arte de programar programas que lêem, transformam ou escrevem outros programas” François-René Rideau, 1999 Compiladores Interpretadores Depuradores

3 Classificação Entradas Saídas Metaprogramming metaprograma Interpretador Inspector Tradutor Compilador Splitter Metainterpretador Analisador de diferenças Walker Metacompilador

4 Static Metaprogramming in C++ Metaprograma que executa antes do load- time do programa manipulado. Pré-processador Templates Standard Template Library

5 Características Aninhamento de conceitos Algoritmos especializados Sub-linguagem da própria linguagem Eliminação de overhead Compilador como máquina virtual Tecnologia padronizada Static Metaprogramming In C++

6 Classificação Metafunction Estrutura que manipula dados estáticos de um programa que ainda não foi gerado Metainformation  Trait templates Estrutura que armazena informações sobre outros elementos (tipos) Metaprogram  Generator Metafunctions que fazem geração de código Static Metaprogramming In C++

7 Pré-processador 1 Programa que processa um código fonte (eventualmente o altera) antes deste ser submetido ao compilador. Static Metaprogramming in C++

8 Pré-processador 2 Static Metaprogramming in C++ #include #define SOUnix void main() { #ifdef SOUnix cout << "SO Unix" << endl; #else cout << "SO Not Unix - MS-Windows?" << endl; #endif }

9 Templates 1 Static Metaprogramming in C++ “Os Templates presentes em C++ fornecem uma forma para reusar código fonte.” Bruce Eckel, Reutilização de código fonte ao invés de código objeto Operam sobre números e tipos de dados Algoritmos de recursão e especialização

10 Templates 2 Static Metaprogramming in C++ Reuso Código Objeto Reuso Código Fonte

11 Declaração e Utilização Static Metaprogramming in C++ Parâmetro do Template template T max(T a, T b) { return (a > b) ? a : b; }; double x = 10, y, d_max; cin >> y; d_max = max(x, y); Corpo do Template Cabeçalho do Template Uso do Template

12 Como o compilador funciona Static Metaprogramming in C++ d_max = max(x, y); template T max(T a, T b) { return (a > b) ? a : b; }; Instância do Template double max double (double a, double b) { return (a > b) ? a : b; }; d_max = max double (x, y);

13 Recursividade 1 Static Metaprogramming in C++ #include template struct fatorial { enum { RET = N * fatorial ::RET }; }; template<> struct fatorial { enum { RET = 1 }; }; void main() { cout ::RET << endl; }

14 Recursividade 2 Static Metaprogramming in C++ cout ::RET << endl; struct fatorial { enum { RET = 2 * fatorial ::RET }; }; struct fatorial { enum { RET = 1 * fatorial ::RET }; }; struct fatorial { enum { RET = 2 * 1 }; }; 1 struct fatorial { enum { RET = 1 * 1 }; };

15 Recursividade 3 Static Metaprogramming in C++ _main: pushl %ebp movl %esp,%ebp subl $8,%esp call ___main addl $-8,%esp pushl $_endl__FR7ostream addl $-8,%esp pushl $5040 pushl $_cout _main: pushl %ebp movl %esp,%ebp subl $8,%esp call ___main addl $-8,%esp pushl $_endl__FR7ostream addl $-8,%esp addl $-12,%esp pushl $7 call _fatorial__Fi addl $16,%esp movl %eax,%eax pushl %eax pushl $_cout

16 Combinação Static Metaprogramming in C++ #include #include “fatorial.h” template struct combinacao { enum { RET = fatorial ::RET / ( fatorial ::RET * fatorial ::RET ) }; void main() { cout ::RET << endl; }

17 Especialização Static Metaprogramming in C++ #include template struct potencia { enum { RET = (p > 0) ? potencia 0) ? (p - 1) : 0)>::RET * n : 1 }; template struct potencia { enum { RET = 1 }; }; void main() { cout ::RET << endl; }

18 Estruturas de controle: IF Static Metaprogramming in C++ #include template struct IF { typedef ThenType RET; }; template struct IF { typedef ElseType RET; }; void main() { IF 2), int, double >::RET valor = 1.1; cout << valor << endl; }

19 Estruturas de controle: WHILE 1 Static Metaprogramming in C++ #include #include “while.h” template struct meuComando { enum { n = i }; static void executar() { cout << i << endl; }; typedef meuComando proximo; }; struct minhaCondicao { template struct Teste { enum { avaliacao = ( Comando::n <= 10 ) }; }; void main() { WHILE >::EXECUTAR(); }

20 Estruturas de controle: WHILE 2 Static Metaprogramming in C++ // Arquivo: while.h struct Parar { static void EXECUTAR() {}; static void executar() {}; }; template struct WHILE { static void EXECUTAR() { IF ::avaliacao != 0 ), Comando, Parar >::RET::executar(); IF ::avaliacao != 0 ), WHILE, Parar >::RET::EXECUTAR(); } };

21... In Object Pascal Pré-processador “Templates”

22 Pré-processador Static Metaprogramming in Delphi Program so; {$APPTYPE CONSOLE} {$DEFINE SOUnix} Begin {$IFDEF SOUnix} WriteLn( ‘SO Unix’ ); {$ELSE} WriteLn( ‘SO Not Unix – MS-Windows?’ ); {$ENDIF} End.

23 “Templates” 1 Static Metaprogramming in Delphi _VECTOR_CLASS_= class private FArray : array of _VECTOR_DATA_TYPE_; protected function GetLength():Integer; procedure SetLength(const aLength:Integer); function GetItems(const aIndex:Integer):_VECTOR_DATA_TYPE_; procedure SetItems(const aIndex:Integer; const aValue:_VECTOR_DATA_TYPE_); public function Clear():_VECTOR_CLASS_; function Extend(const aDelta:Word=1):_VECTOR_CLASS_; function Contract(const aDelta:Word=1):_VECTOR_CLASS_; property Length:Integer read GetLength write SetLength; property Items[const aIndex:Integer]:_VECTOR_DATA_TYPE_ read GetItems write SetItems; default; constructor Create(const aLength:Integer); end;

24 “Templates” 2 Static Metaprogramming in Delphi constructor _VECTOR_CLASS_.Create(const aLength : Integer); begin inherited Create; SetLength (aLength); end;... function _VECTOR_CLASS_.Contract(const aDelta : Word) : _VECTOR_CLASS_; begin System.SetLength (FArray, System.Length (FArray) - aDelta); Result := Self; end;

25 “Templates” 3 Static Metaprogramming in Delphi unit StrVector; interface uses Classes; type _VECTOR_DATA_TYPE_ = String; {$INCLUDE TemplateVectorInterface} TStringVector = _VECTOR_CLASS_; implementation {$INCLUDE TemplateVectorImplementation} end. unit FltVector; interface uses Classes; type _VECTOR_DATA_TYPE_ = Double; {$INCLUDE TemplateVectorInterface} TFloatVector = _VECTOR_CLASS_; implementation {$INCLUDE TemplateVectorImplementation} end.

26 “Templates” 4 Static Metaprogramming in Delphi program VectorTest; {$DEFINE FloatVector} {$APPTYPE CONSOLE} uses SysUtils, {$IFDEF StrVector} StrVector in 'StringVector.pas'; {$ENDIF} {$IFDEF FloatVector} FltVector in 'FltVector.pas'; {$ENDIF} var Vector : _VECTOR_CLASS_; begin {$IFDEF StringVector} Vector := TStringVector.Create( 1 ); Vector[ 0 ] := 'String'; Writeln( 'Estou trabalhando com um vetor de strings!' ); Writeln( 'Vetor[0] = ''' + Vector[ 0 ] + '''' ); {$ENDIF} {$IFDEF FloatVector} Vector := TFloatVector.Create( 1 ); Vector[ 0 ] := 0.017; Writeln( 'Estou trabalhando com um vetor de floats!' ); Writeln( 'Vetor[0] = ' + FloatToStr( Vector[ 0 ] ) ); {$ENDIF} end.

27 “Templates” 5 Static Metaprogramming in Delphi program VectorTest; {$DEFINE StringVector} {$APPTYPE CONSOLE} uses SysUtils, {$IFDEF StrVector} StrVector in 'StringVector.pas'; {$ENDIF} {$IFDEF FloatVector} FltVector in 'FltVector.pas'; {$ENDIF} var Vector : _VECTOR_CLASS_; begin {$IFDEF StringVector} Vector := TStringVector.Create( 1 ); Vector[ 0 ] := 'String'; Writeln( 'Estou trabalhando com um vetor de strings!' ); Writeln( 'Vetor[0] = ''' + Vector[ 0 ] + '''' ); {$ENDIF} {$IFDEF FloatVector} Vector := TFloatVector.Create( 1 ); Vector[ 0 ] := 0.017; Writeln( 'Estou trabalhando com um vetor de floats!' ); Writeln( 'Vetor[0] = ' + FloatToStr( Vector[ 0 ] ) ); {$ENDIF} end.

28 Engenharia de domínios Família de sistemas Configuração de bases de conhecimento Mapeamento de domínios e Regras Geradores de código Generative Programming

29 Características Parametrização Modelagem de dependências Eliminação de overhead Separação de domínios Separação de interesses Generative Programming

30 Paradigmas relacionados Generic Programming Reuso por parametrização Aspect-Oriented Programming Separação de interesses Domain-Specific Language Linguagem de alto nível de abstração Generative Programming

31 Linha de Produção de Carros Domínio do problema Domínio da solução Configuração base de conhecimento Implementação dos componentes Generative Programming

32 Analisando o problema Linha de Produção de Carros

33 Definindo modelos de carros Linha de Produção de Carros

34 Utilizando gerador de carros Linha de Produção de Carros #include #include “ger_carro.h” void main() { typedef GERADOR_CARRO >::Carro Modelo_A; typedef GERADOR_CARRO >::Carro Modelo_B; typedef GERADOR_CARRO >::Carro Modelo_C; typedef GERADOR_CARRO >::Carro Modelo_D; Modelo_A meu_carro1; Modelo_B meu_carro2; Modelo_C meu_carro3; Modelo_D meu_carro4; }

35 Implementando a solução 1 Linha de Produção de Carros enum Roda { roda_normal, roda_esportiva }; enum Modelo { modelo_basico, modelo_esportivo }; enum Motor { motor_gasolina, motor_alcool }; template struct Esportivo { enum { motor = motor_gasolina, roda = roda_, modelo = modelo_esportivo }; }; template struct Basico { enum { motor = motor_, roda = roda_normal, modelo = modelo_basico }; };

36 Implementando a solução 2 Linha de Produção de Carros template struct MotorGasolina { typedef Config_ Config; MotorGasolina() { cout << "Motor Gasolina "; } }; template struct MotorAlcool{ typedef Config_ Config; MotorAlcool() { cout << "Motor Alcool "; } };

37 Implementando a solução 3 Linha de Produção de Carros template struct RodaNormal { typedef Config_ Config; enum { aro = Config::aro }; RodaAroNormal() { cout << "Roda Normal Aro " << aro << ": " ; } }; template struct RodaEsportiva{ typedef Config_ Config; enum { aro = Config_::aro }; RodaAroEsportivo() { cout << "Roda Esportiva Aro " << aro << ": "; } };

38 Implementando a solução 4 Linha de Produção de Carros template struct Carro { typedef typename Motor_::Config Config; Motor_ Motor; IF< (Config::aro == 15), RodaAroEsportivo, RodaAroNormal >::RET Roda; Carro() { cout << "Carro: " << endl << endl; } };

39 Implementando a solução 5 Linha de Produção de Carros template > struct GERADOR_CARRO { typedef GERADOR_CARRO Gerador; enum { aro = (Modelo::roda == roda_normal) ? 12 : 15 }; typedef IF< (Modelo::motor == motor_gasolina), MotorGasolina, MotorAlcool >::RET Motor_; typedef IF< (Modelo::roda == roda_normal), RodaAroNormal, RodaAroEsportivo >::RET Roda_; typedef Carro RET; struct Config { typedef Motor_ Motor; typedef Roda_ Roda; enum { aro = aro_, modelo = modelo_ }; typedef RET Carro; };

40 Deficiências Despadronização de compiladores Abstrações incompletas Complexidade de implementação Considerações econômicas Propriedade intelectual Static Metaprogramming In C++

41 Através de tabelas do Banco de Dados, gerar classes básicas do Domínio do Problema. Um Caso de Metaprogramming

42 Características Template em XSL Comunicação do Banco de Dados com pré-compiladores através de XML Geração código fonte Java Classes que representam as tabelas do banco de dados Um Caso de Metaprogramming

43 Banco de Dados Um Caso de Metaprogramming

44 Template em XSL Um Caso de Metaprogramming

45 XML de Comunicação Um Caso de Metaprogramming

46 Código Java Gerado Static Metaprogramming

47 Referências Bibliográficas R. Assenov. Templates in Object Pascal, Borland Community, 2.001, K. Czarnecki e U. Eisenecker. Generative Programming: Methods, Techniques, and Applications, Addison-Wesley, 1.999, pg K. Czarnecki e U. Eisenecker. Components and Generative Programming, Proceedings of the European Software Engineering Conference, 1.999, ilmenau.de/~czarn/eses99/ ilmenau.de/~czarn/eses99/ K. Czarnecki, U. Eisenecker, R. Glueck e D. Vandevoorde. Generative Programming and Active Libraries, Proceedings of the Dagstuhl-Seminar on Generic Programming Conference, 1.998,

48 Referências Bibliográficas K. Czarnecki, U. Eisenecker e P. Steyaert. Beyond Objects: Generative Programming, ECCOP’97, 1.997, S. Downey. Template Metaprogramming, Borland Community, 1.999, B. Eckel. Thinking in C++: Introduction to Standard C++, Prentice Hall, Volume 1, 2.000, F. Rideau. Metaprogramming and Free Availability of Sources. Conference Autour du Libre, 1.999,

49 Dúvidas - Questionamentos