Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1...
Transcript of Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1...
![Page 1: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/1.jpg)
MetaprogramaciónComputando en tiempo de compilación
Marcelo Arroyo
U.N.R.C.
FCEIA, JCC - 2010
![Page 2: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/2.jpg)
Contenidos
1 IntroducciónMetaprogramaciónHerramientas de metaprogramación
2 Lenguajes de dos nivelesC++ templatesConvergeTemplate Haskell
3 Lenguajes de dominio específicosDSLs en C++
4 Programación orientada a lenguajesLenguajes extensiblesVentajas y desventajas de la metaprogramaciónConclusión
![Page 3: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/3.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Metaprogramación
Conjunto de técnicas y herramientas para manipularprogramas en tiempo de compilación
Metaprograma
escrito en algún metalenguajeel programa manipulado se denomina lenguaje objetoun lenguaje reflexivo permite ser su propio metalenguaje
ImplementaciónMacrosSistemas de transformación de programas
![Page 4: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/4.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Metaprogramación
Conjunto de técnicas y herramientas para manipularprogramas en tiempo de compilación
Metaprograma
escrito en algún metalenguajeel programa manipulado se denomina lenguaje objetoun lenguaje reflexivo permite ser su propio metalenguaje
ImplementaciónMacrosSistemas de transformación de programas
![Page 5: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/5.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Metaprogramación
Conjunto de técnicas y herramientas para manipularprogramas en tiempo de compilación
Metaprograma
escrito en algún metalenguajeel programa manipulado se denomina lenguaje objetoun lenguaje reflexivo permite ser su propio metalenguaje
ImplementaciónMacrosSistemas de transformación de programas
![Page 6: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/6.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 7: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/7.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 8: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/8.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 9: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/9.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 10: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/10.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 11: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/11.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Metaprogramación
Aplicaciones
Programación genérica
C++ STLBibliotecas C++ Boost
Optimización a nivel de aplicación
Biltz++: Object Oriented Scientific Computation
Independencia de herramientas externasEvaluación parcialProgramación orientada a aspectosLenguajes de dominio específico (DSLs)
fp++lp++ag++
![Page 12: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/12.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Herramientas de metaprogramación
Lenguajes de programación
LISP: quasiquote expressionsC++ templatesTemplate HaskellConvergeScala
Herramientas de generación de procesadores lenguajes
ADF-SDF Meta EnvironmentStratego/XTJetBrains MTSAntLR, . . .
![Page 13: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/13.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Herramientas de metaprogramación
Lenguajes de programación
LISP: quasiquote expressionsC++ templatesTemplate HaskellConvergeScala
Herramientas de generación de procesadores lenguajes
ADF-SDF Meta EnvironmentStratego/XTJetBrains MTSAntLR, . . .
![Page 14: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/14.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
C++ templates
C++ templates: Características
Soporte para programación genérica (tipos y funcionesparametrizadas)Especialización de templates y pattern matching
Templates recursivosPermiten implementar evaluación parcialComputación estáticaImplementación de instropección (estática)Static checking
C++ templatesFragmento Turing-computable
![Page 15: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/15.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
C++ templates
C++ templates
Computación estática
template < i n t n>struct f a c t o r i a l {
s t a t i c const i n t r e s u l t =n∗ f a c t o r i a l <n−1 >:: r e s u l t ;
} ;
template <> / / s p e c i a l i z a t i o nstruct f a c t o r i a l <0> {
s t a t i c const i n t r e s u l t = 1 ;} ;
i n t fac12 = f a c t o r i a l <12 >:: r e s u l t ;
![Page 16: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/16.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
C++ templates
C++ templates
Generación de código
template < i n t i >i n l i n e f l o a t meta_dot ( f l o a t a [ ] , f l o a t b [ ] ){
return meta_dot< i −1>(a , b ) + a [ i ] ∗ b [ i ] ;}
template <>i n l i n e f l o a t meta_dot <0>( f l o a t a [ ] , f l o a t b [ ] ){
return a [ 0 ] ∗ b [ 0 ] ;}
f l o a t x [ 3 ] , y [ 3 ] , z = meta_dot <2>(x , y ) ;/ / z=x [ 0 ] ∗ y [ 0 ] + x [ 1 ] ∗ y [ 1 ] + x [ 2 ] ∗ y [ 2 ]
![Page 17: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/17.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
C++ templates
C++ templates
Calculando tipos: traits
template typename<T> −− defaul t . T −> Tstruct a v g _ t r a i t s {
typedef T type ;} ;template typename<> −− i n t −> f l o a tstruct avg_ t ra i t s < int > {
typedef f l o a t type ;} ;typename avg_ t ra i t s < int > : : type r ;r = sum_array ( a ,N ) /N;
![Page 18: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/18.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Converge
Converge
Un ejemplofunc expand_power(n, x):if n == 0:
return [| 1 |]else:
return [| $c{x}*$c{expand_power(n-1,x)} |]
func mk_power(n):return [|
func (&x):return $c{expand_power(n, [| &x |])}
|]
power3 := $<mk_power(3)>-- power3 = func(x): return x*x*x*1
![Page 19: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/19.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Converge
Splice
$<expr> se evalúa (expande) en compilación
Quasi-quotes e insercionesQuasi-quote: [| expr |] denota un ASTInserciones:
${e} evalúa una expresión y retorna el AST resultantedentro del quasi-quote en el que aparecen.Renombra las variables apareciendo en e por nombresfrescos$c{e} idem al anterior pero sin renombre de variables,permitiendo la captura de variables libres$p{e} pragma: evalúa la expresión y descarta su resultado
![Page 20: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/20.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Converge
Splice
$<expr> se evalúa (expande) en compilación
Quasi-quotes e insercionesQuasi-quote: [| expr |] denota un ASTInserciones:
${e} evalúa una expresión y retorna el AST resultantedentro del quasi-quote en el que aparecen.Renombra las variables apareciendo en e por nombresfrescos$c{e} idem al anterior pero sin renombre de variables,permitiendo la captura de variables libres$p{e} pragma: evalúa la expresión y descarta su resultado
![Page 21: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/21.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Template Haskell
Metaprogramación en Template-Haskell
Template-HaskellMacro-procesador escrito en Haskell e integrado encompiladores e intérpretes por boostrapping.
Ejemplo
import Language . Haske l l .TH
tupleRep : : I n t −> Q ExptupleRep n = do id <− newName " x "
return$ LamE ( VarP id )(TupE $ rep l ica te n $ VarE id )
tupleReplicate 3⇒ (\x .(x , x , x))
![Page 22: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/22.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Template Haskell
Template-Haskell
Splices: denotados como $id o $(expr)
main = do pr in t ( $ ( tupleRep 2) 1) −− ( 1 ,1 )
Quotation: generadores de ASTs (mónada Q t)
[| expr |], retorna un valor de tipo Q Exp[p| pattern |], retorna un valor de tipo Q Pat[d| decl-list |], retorna un valor de tipo Q [Dec][t| type |], retorna un valor de tipo Q Type
Ejemplo: [| \x -> x |] se traducirá a
(do id <− newName " x " ; return $ LamE [ VarP id ] ( VarE id ) )
![Page 23: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/23.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
DSLs en C++
Definición de parsers. C++/Boost::Spirit
EBNFgroup ::= ’(’ expression ’)’factor ::= integer | groupterm ::= factor ((’*’ factor) | (’/’ factor))*expression ::= term ((’+’ term) | (’-’ term))*
EBNF en Boost::Spirit
group = ’ ( ’ >> expression >> ’ ) ’ ;f a c t o r = i n t e g e r | group ;term = f a c t o r >> ∗ ( ( ’ ∗ ’ >> f a c t o r )
| ( ’ / ’ >> f a c t o r ) ) ;expression = term >> ∗ ( ( ’ + ’ >> term )
| ( ’− ’ >> term ) ) ;
![Page 24: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/24.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
DSLs en C++
Programación funcional en C++
Expresiones λ en boost::lambdaλx .λy .x + y ≡ _1 + _2
l i s t < int > v ( 1 0 ) ;for_each ( v . begin ( ) , v . end ( ) , _1 = 1 ) ;s o r t ( vp . begin ( ) , vp . end ( ) , ∗_1 > ∗_2 ) ;
FP++
L i s t < int > in tege rs = enumFrom ( 1 ) ;L i s t < int > evens = f i l t e r ( even , i n t ege rs ) ;
![Page 25: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/25.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
DSLs en C++
Programación lógica en C++:lc++
FUN1( male , s t r i n g )DECLARE( Kid , s t r i n g , 2 ) ;DECLARE( Par , s t r i n g , 3 ) ;. . .l a s s e r t ( male ( ba r t ) ) ;l a s s e r t ( male ( homer ) ) ;l a s s e r t ( female ( l i s a ) ) ;l a s s e r t ( parent ( homer , ba r t ) ) ;l a s s e r t ( f a t h e r (Dad , Kid ) −= parent (Dad , Kid ) &&
male (Dad) ) ;L i s t <IE> l = lquery ( ancestor ( Anc , bar t ,X) ) ;while ( ! n u l l ( l ) ) {
IE env = head ( l ) ;env−>show ( ) ;l = t a i l ( l ) ;
}
![Page 26: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/26.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
DSLs en C++
Gramáticas de atributos. C++::ag++
symbol ( Expr ) {i n t va l ;char type ;
} ;symbol ( Plus ) { } ;symbol ( Times ) { } ;r u l e r1 = Expr<0> >> ( Expr <1>,Plus , Expr <2 >).
compute (Expr <0>. va l = Expr <1>. va l + Expr <2>. val ,Expr <0>. type = ’+ ’
) ;r u l e r2 = Expr<0> >> ( Expr <1>,Times , Expr <2 >).
compute (Expr <0>. va l = Expr <1>. va l ∗ Expr <2>. val ,Expr <0>. type = ’ ∗ ’
) ; . . .
![Page 27: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/27.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Programación orientada a lenguajes
Solución a un problema: creación de un lenguajeisomórfico a descripciones de usuariosRequerimientos:
Ambientes de meta-programaciónLenguajes de programación extensibles
Paradigmas relacionados
Programación orientada a aspectosProgramación basada en conceptosLenguajes de dominios específicosProgramación intensionalProgramación orientada a gramáticas
![Page 28: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/28.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Lenguajes extensibles
Extensibilidad en lenguajes de programación
Lenguaje extensible
Permite al programador la definición de sus propiasextensiones sintácticas y semánticas.Requisitos: Parser extensible, exposición y manipulación delAST durante la compilación
Seed7OpenC++Scalaxtc (eXTensible C)XL (eXtensible Language)
![Page 29: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/29.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Ventajas y desventajas de la metaprogramación
Metaprogramación
VentajasIndependencia de herramientas externasIntegración de diferentes paradigmasEficiencia (código o datos generados en compilación)Optimizaciones lógicas a nivel de aplicaciónInteracción con el ambiente de compilación
DesventajasRequiere soporte del compiladorAlgunos mecanismos inducen programas poco legiblesMayor tiempo de compilación
![Page 30: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/30.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Ventajas y desventajas de la metaprogramación
Metaprogramación
VentajasIndependencia de herramientas externasIntegración de diferentes paradigmasEficiencia (código o datos generados en compilación)Optimizaciones lógicas a nivel de aplicaciónInteracción con el ambiente de compilación
DesventajasRequiere soporte del compiladorAlgunos mecanismos inducen programas poco legiblesMayor tiempo de compilación
![Page 31: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/31.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Conclusión
Gracias!!!
¿Preguntas?
![Page 32: Metaprogramación - Computando en tiempo de compilación · 2015-08-20 · Contenidos 1 Introducción Metaprogramación Herramientas de metaprogramación 2 Lenguajes de dos niveles](https://reader033.fdocumento.com/reader033/viewer/2022050113/5f4a10fc91bb81620f672706/html5/thumbnails/32.jpg)
Introducción Lenguajes de dos niveles Lenguajes de dominio específicos Programación orientada a lenguajes
Conclusión
Gracias!!!
¿Preguntas?