A metaprogramozás olyan programozási típus , amely olyan programok létrehozásához kapcsolódik, amelyek munkájuk eredményeként más programokat generálnak [ 1] (különösen a forráskódjuk fordításának szakaszában ), vagy olyan programokat, amelyek futás közben változnak ( önmódosító kód ) ). Az első lehetővé teszi, hogy kevesebb idővel és erőfeszítéssel kapjon programokat a kódoláshoz, mintha a programozó teljesen kézzel írta volna őket, a második pedig a kód tulajdonságainak (méretének és sebességének) javítását teszi lehetővé.
Ezzel a megközelítéssel a programkódot nem manuálisan írják, hanem egy másik programon alapuló generátorprogram automatikusan létrehozza.
Ennek a megközelítésnek akkor van értelme, ha a programozás során különféle kiegészítő szabályokat dolgoznak ki (magasabb szintű paradigmák , külső könyvtárak követelményeinek teljesítése, sztereotip módszerek bizonyos funkciók megvalósítására stb.). Ebben az esetben a kód (vagy adat) egy része elveszti értelmes jelentését, és csak a szabályok mechanikus megvalósításává válik. Amikor ez a rész jelentőssé válik, felmerül az ötlet, hogy csak a tartalmi részt állítsuk be kézzel, a többit pedig automatikusan adjuk hozzá. Ezt csinálja a generátor.
A kódgenerálásnak két alapvetően különböző típusa van:
Az első eset leggyakoribb és legnyilvánvalóbb példája a GUI builders , ahol a metaprogram a felhasználói programozást célozza meg , lehetővé téve, hogy a nem programozó ergonómusok közvetlenül részt vegyenek a szoftvertermékek fejlesztésében. Ebben az esetben a metaprogram nyilvánvalóan sokkal bonyolultabbnak, nagyobb és időigényesebbnek bizonyul, mint az általa generált kód, fejlesztését pedig használatának gyakorisága indokolja. Meg kell jegyezni, hogy a gyakorlatban általában (de nem feltétlenül) az ilyen metaprogramokat kötelező nyelveken írják a kötelező nyelveken való használatra, és lefordított formában szállítják. Ennek a módszernek az a hátránya, hogy új, összetettebb metaprogramok fejlesztése során nem lehet újra felhasználni a metaprogram kódját.
További példák az elemző és lexer generátorok , mint például a Lex , YACC , ANTLR , bison .
A második eset a nyelvi beágyazás , és három statikus módszerrel valósítják meg nyelvi makrók vagy tiszta beágyazás használatával. Ebben az esetben a metaprogramok fejlesztése során felhalmozott tapasztalatok intenzíven újrahasznosíthatók a jövőben új metaprogramok fejlesztéséhez [2] .
Egyéb példák:
Az a képesség, hogy futás közben módosítani vagy hozzáadni tudja a programot, virtuális géppé varázsolja a programot . Bár egy ilyen lehetőség hosszú ideig létezett a gépi kódok szintjén (és aktívan használták például polimorf vírusok létrehozásakor ), a metaprogramozás általában az ilyen technológiák magas szintű nyelvekre történő átviteléhez kapcsolódik.
Főbb megvalósítási módok:
A Prolog nyelvben a metaprogramozás lehetővé teszi a Prolog programok fejlesztésének és ellenőrzésének (tulajdonságok ellenőrzésének) automatizálását. A metaprogramok a Prolog programokat terminusnak tekintik, és lehetővé teszik tulajdonságaik és kapcsolataik elemzését, programok létrehozását más Prolog programok vezérlésére [4] .