Metaprogramování označuje různé způsoby, jakými má program znalosti sám o sobě nebo jak může sám se sebou manipulovat.
V jazycích jako C# je reflexe formou metaprogramování, protože program může zkoumat informace o sobě samém. Například vrátí seznam všech vlastností objektu.
V jazycích, jako je ActionScript, můžete za běhu vyhodnocovat funkce a vytvářet nové programy, například eval(„x“ + i). Funkce DoSomething() by ovlivnila objekt nazvaný x1, když je i 1, a x2, když je i 2.
Další běžnou formou metaprogramování je, když program může měnit sám sebe netriviálním způsobem. LISP je pro to dobře známý a je to něco, co Paul Graham obhajoval asi před deseti lety. Budu muset vyhledat některé jeho konkrétní eseje. Ale jde o to, že by program měnil jinou část programu na základě jejího stavu. To umožňuje takovou míru flexibility při rozhodování za běhu, která je ve většině dnešních populárních jazyků velmi obtížná.
Stojí také za zmínku, že za starých dobrých časů programování v přímém assembleru byly programy, které se za běhu měnily, nezbytné a velmi běžné.
Z eseje Paula Grahama „What Made Lisp Different“:
Mnoho jazyků má něco, čemu se říká makro. Lispová makra jsou však jedinečná. A věřte nebo ne, to, co dělají, souvisí se závorkami. Tvůrci jazyka Lisp nedali všechny ty závorky do jazyka jen proto, aby byl jiný. Pro programátora Blubu vypadá kód Lispu divně. Ale ty závorky tam jsou z nějakého důvodu. Jsou vnějším důkazem zásadního rozdílu mezi jazykem Lisp a ostatními jazyky.
Kód jazyka Lisp je tvořen datovými objekty jazyka Lisp. A to ne v tom triviálním smyslu, že zdrojové soubory obsahují znaky a řetězce jsou jedním z datových typů podporovaných tímto jazykem. Lispový kód je po přečtení parserem tvořen datovými strukturami, kterými lze procházet.
Pokud rozumíte tomu, jak fungují překladače, nejde ve skutečnosti ani tak o to, že Lisp má podivnou syntaxi, jako o to, že Lisp žádnou syntaxi nemá. Programy píšete v parsovacích stromech, které se generují v překladači při parsování jiných jazyků. Tyto parsovací stromy jsou však plně přístupné vašim programům. Můžete psát programy, které s nimi manipulují. V Lispu se těmto programům říká makra. Jsou to programy, které píší programy.
Programy, které píší programy? Kdy byste to vůbec chtěli dělat? Ne příliš často, pokud přemýšlíte v jazyce Cobol. Pokud přemýšlíte v jazyce Lisp, tak pořád. Tady by se hodilo, kdybych mohl uvést příklad výkonného makra a říct: Tak, a co tohle? Ale kdybych to udělal, vypadalo by to pro někoho, kdo nezná Lisp, jen jako blábolení; není zde místo na vysvětlení všeho, co byste museli vědět, abyste pochopili, co to znamená. V Ansi Common Lispu jsem se snažil postupovat co nejrychleji, a i tak jsem se k makrům dostal až na straně 160.
Myslím si ale, že mohu uvést jistý druh argumentů, které by mohly být přesvědčivé. Zdrojový kód editoru Viaweb tvořilo pravděpodobně asi 20-25 % maker. Makra se píší obtížněji než obyčejné lispovské funkce a je považováno za špatný styl používat je, když to není nutné. Takže každé makro v tom kódu je, protože tam musí být. To znamená, že nejméně 20-25 % kódu v tomto programu dělá věci, které nelze snadno udělat v žádném jiném jazyce. Ať už je programátor Blubu jakkoli skeptický k mým tvrzením o tajemných schopnostech Lispu, tohle by ho mělo zaujmout. Tento kód jsme nepsali pro vlastní pobavení. Byli jsme maličký startup, který programoval tak tvrdě, jak jen to šlo, aby postavil technické bariéry mezi nás a konkurenci.
Podezřívavého člověka by mohlo začít zajímat, jestli tu není nějaká souvislost. Velká část našeho kódu dělala věci, které se v jiných jazycích dělají velmi těžko. Výsledný software dělal věci, které software našich konkurentů neuměl. Možná tu byla nějaká souvislost. Doporučuji vám sledovat toto vlákno. Možná je v tom staříkovi, který kulhá o berlích, víc, než se na první pohled zdá.