Metaprogramování

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).

Generování kódu

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:

  1. generátor je fyzicky samostatný binární program, který nemusí být nutně napsán v cílovém jazyce.
  2. cílový jazyk je zároveň jazykem implementace generátoru, takže metaprogram tvoří s cílovým programem jeden celek.

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:

Samomodifikační kód

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:

Umožňuje prohlížet, vytvářet a upravovat definice typů, zásobník volání za běhu , přistupovat k proměnné podle názvu získaného dynamicky atd.

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] .

Viz také

Poznámky

  1. Jonathan Bartlett, Umění metaprogramování, 1. část: Úvod do metaprogramování . Získáno 4. října 2012. Archivováno z originálu dne 24. prosince 2013.
  2. Pavel Hudák. Modulární jazyky a nástroje specifické pro doménu . — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Archivováno z originálu 17. října 2013.
  3. Lingua::Romana::Perligata - search.cpan.org
  4. Metakides, G. a Nerode, A. (1998): Principy logiky a logického programování (překlad do rumunštiny). Technické nakladatelství, Bukurešť.

Odkazy