Metaprogramování je typ programování spojený s tvorbou programů , které generují jiné programy jako výsledek své práce [1] (zejména ve fázi kompilace jejich zdrojového kódu ) nebo programů, které se samy mění za běhu ( samomodifikující kód ). První umožňuje získat programy s menším časem a úsilím na kódování, než kdyby je programátor psal zcela ručně, druhý umožňuje vylepšit vlastnosti kódu (velikost a rychlost).
S tímto přístupem se programový kód nezapisuje ručně, ale je vytvářen automaticky generátorovým programem založeným na jiném programu.
Tento přístup má smysl, pokud se během programování vyvinou různá další pravidla ( paradigmata vyšší úrovně , plnění požadavků externích knihoven, stereotypní metody implementace určitých funkcí atd.). V tomto případě část kódu (nebo data) ztrácí svůj smysluplný význam a stává se pouze mechanickou implementací pravidel. Když se tato část stane významnou, vznikne nápad nastavit ručně pouze obsahovou část a zbytek přidat automaticky. Toto dělá generátor.
Existují dva zásadně odlišné typy generování kódu:
Nejběžnějším a zřejmým příkladem prvního případu jsou GUI buildery , kde je metaprogram zaměřen na uživatelské programování , což umožňuje neprogramujícím ergonomům přímo se podílet na vývoji softwarových produktů. V tomto případě se metaprogram zjevně ukazuje jako mnohem složitější, rozsáhlejší a časově náročnější na vývoj než kód, který generuje, a jeho vývoj je odůvodněn četností jeho používání. Je třeba poznamenat, že v praxi jsou takové metaprogramy zpravidla (ale ne nutně) napsány v imperativních jazycích pro použití v imperativních jazycích a jsou dodávány v kompilované podobě. Nevýhodou této metody je nemožnost opětovného použití kódu metaprogramu při vývoji nových, složitějších metaprogramů.
Dalšími příklady jsou generátory parserů a lexerů jako Lex , YACC , ANTLR , bison .
Druhým případem je vkládání jazyka a je implementováno třemi statickými metodami pomocí jazykových maker nebo čistého vkládání. V tomto případě lze zkušenosti nashromážděné v procesu vývoje metaprogramů v budoucnu intenzivně znovu využít pro vývoj nových metaprogramů [2] .
Další příklady:
Schopnost upravit nebo přidat se za běhu změní program na virtuální stroj . Ačkoli taková možnost na úrovni strojových kódů existovala dlouhou dobu (a byla aktivně využívána například při vytváření polymorfních virů ), metaprogramování je obvykle spojeno s přenosem takových technologií do jazyků vysoké úrovně.
Hlavní způsoby implementace:
V jazyce Prolog vám metaprogramování umožňuje automatizovat vývoj a ověřování (kontrolu vlastností) programů Prolog. Metaprogramy považují programy Prolog za termíny a umožňují vám analyzovat jejich vlastnosti a vztahy, vytvářet programy pro ovládání jiných programů Prologu [4] .