Metaprogramació
La metaprogramació és una tècnica de programació informàtica en la qual els programes informàtics tenen la capacitat de tractar altres programes com les seves dades. Significa que un programa es pot dissenyar per llegir, generar, analitzar o transformar altres programes, i fins i tot modificar-se, mentre s'executa.[1][2] En alguns casos, això permet als programadors minimitzar el nombre de línies de codi per expressar una solució, reduint al seu torn el temps de desenvolupament.[3] També permet als programes més flexibilitat per manejar noves situacions de manera eficient sense recompilar.
La metaprogramació es pot utilitzar per moure càlculs del temps d'execució al temps de compilació, per generar codi mitjançant càlculs del temps de compilació i per habilitar el codi automodificable. La capacitat d'un llenguatge de programació de ser el seu propi metalenguatge permet la programació reflexiva, i s'anomena reflex.[4] La reflexió és una característica del llenguatge valuosa per facilitar la metaprogramació.
La metaprogramació va ser popular a les dècades de 1970 i 1980 utilitzant llenguatges de processament de llistes com Lisp. El maquinari de la màquina Lisp va guanyar una mica d'atenció a la dècada de 1980 i va habilitar aplicacions que podien processar codi. Sovint s'utilitzaven per a aplicacions d'intel·ligència artificial.
Aproximacions
[modifica]La metaprogramació permet als desenvolupadors escriure programes i desenvolupar codi que entra dins del paradigma de programació genèrica. Tenir el propi llenguatge de programació com a tipus de dades de primer nivell (com a Lisp, Prolog, SNOBOL o Rebol) també és molt útil; això es coneix com a homoiconicitat. La programació genèrica invoca una instal·lació de metaprogramació dins d'un llenguatge, ja que permet escriure codi sense la preocupació d'especificar tipus de dades, ja que es poden proporcionar com a paràmetres quan s'utilitzen.
La metaprogramació sol funcionar d'una de tres maneres.[5]
- El primer enfocament és exposar els elements interns del sistema d'execució (motor) al codi de programació mitjançant interfícies de programació d'aplicacions (API) com la del. Emissor Common Intermediate Language (CIL) NET.
- El segon enfocament és l'execució dinàmica d'expressions que contenen ordres de programació, sovint compostes per cadenes, però també poden ser d'altres mètodes que utilitzen arguments o context, com JavaScript. Així, "els programes poden escriure programes". Tot i que tots dos enfocaments es poden utilitzar en la mateixa llengua, la majoria de llengües tendeixen a inclinar-se cap a l'una o l'altra.
- El tercer enfocament és sortir del llenguatge completament. Els sistemes de transformació de programes de propòsit general com els compiladors, que accepten descripcions de llenguatge i realitzen transformacions arbitràries en aquests llenguatges, són implementacions directes de la metaprogramació general. Això permet que la metaprogramació s'apliqui a pràcticament qualsevol llenguatge objectiu sense tenir en compte si aquest llenguatge objectiu té cap habilitat de metaprogramació pròpia. Es pot veure això funcionant amb Scheme i com permet abordar alguns límits als quals s'enfronta el C mitjançant l'ús de construccions que formen part del llenguatge Scheme per estendre C.[6]
Lisp és probablement el llenguatge per excel·lència amb facilitats de metaprogramació, tant per la seva precedència històrica com per la simplicitat i el poder de la seva metaprogramació. A la metaprogramació de Lisp, l'operador sense cometes (normalment una coma) introdueix codi que s'avalua en el moment de la definició del programa i no en el moment d'execució. El llenguatge de metaprogramació és, per tant, idèntic al llenguatge de programació amfitrió, i les rutines Lisp existents es poden reutilitzar directament per a la metaprogramació si es desitja. Aquest enfocament s'ha implementat en altres idiomes incorporant un intèrpret al programa, que treballa directament amb les dades del programa. Hi ha implementacions d'aquest tipus per a alguns llenguatges comuns d'alt nivell, com ara el Pascal Script de RemObjects per a Object Pascal.
Reptes
[modifica]Alguns argumenten que hi ha una corba d'aprenentatge pronunciada per fer un ús complet de les funcions de metaprogramació.[7] Atès que la metaprogramació ofereix més flexibilitat i configurabilitat en temps d'execució, un mal ús o un ús incorrecte de la metaprogramació pot donar lloc a errors injustificats i inesperats que poden ser extremadament difícils de depurar per a un desenvolupador mitjà. Pot introduir riscos al sistema i fer-lo més vulnerable si no s'utilitza amb cura. Alguns dels problemes comuns, que poden ocórrer a causa d'un ús incorrecte de la metaprogramació, són la incapacitat del compilador per identificar els paràmetres de configuració que falten, les dades no vàlides o incorrectes poden donar lloc a una excepció desconeguda o resultats diferents.[8] A causa d'això, alguns creuen[7] que només els desenvolupadors altament qualificats haurien de treballar en el desenvolupament de funcions que exerceixin la metaprogramació en un llenguatge o plataforma i els desenvolupadors mitjans han d'aprendre a utilitzar aquestes funcions com a part de la convenció.
Referències
[modifica]- ↑ Sondergaard, Harald. «Course on Program Analysis and Transformation» (en anglès), 2013. [Consulta: 18 setembre 2014].
- ↑ Czarnecki, Krzysztof. Generative Programming (en anglès). Addison Wesley, 2000. ISBN 0-201-30977-7.
- ↑ Walker, Max. «The Art of Metaprogrmming in Java» (en anglès). New Circle. [Consulta: 28 gener 2014].
- ↑ Krauss, Aaron. «Programming Concepts: Type Introspection and Reflection» (en anglès). The Societa. [Consulta: 14 setembre 2014].
- ↑ Joshi, Prateek. «What Is Metaprogramming? – Part 2/2» (en anglès). Perpetual Enigma, 05-04-2014. [Consulta: 14 agost 2014].
- ↑ «Art of Metaprogramming» (en anglès). IBM.
- ↑ 7,0 7,1 Bicking, Ian. «The challenge of metaprogramming» (en anglès). IanBicking.org. [Consulta: 21 setembre 2016].
- ↑ Terry, Matt. «Beware of Metaprogramming» (en anglès). Medium.com. Medium Corporation, 21-08-2013. [Consulta: 21 agost 2014].