Metaprogramování - Metaprogramming

Metaprogramování je programovací technika, ve které počítačové programy mají schopnost zacházet s jinými programy jako se svými daty. To znamená, že program může být navržen tak, aby četl, generoval, analyzoval nebo transformoval jiné programy a dokonce se sám upravoval za běhu. V některých případech to umožňuje programátorům minimalizovat počet řádků kódu pro vyjádření řešení, čímž se zkrátí doba vývoje. Umožňuje také programům větší flexibilitu, aby efektivně zvládaly nové situace bez překompilace.

Metaprogramming mohou být použity pro pohyb výpočty z běhu na kompilaci-čas , pro generování kódu pomocí kompilaci výpočty, a k tomu, aby self-modifikovat kód . Schopnost programovacího jazyka být vlastním metajazykem se nazývá reflexe . Reflexe je cenná jazyková funkce, která usnadňuje metaprogramování.

Metaprogramování bylo populární v 70. a 80. letech minulého století pomocí jazyků pro zpracování seznamu, jako je LISP . Hardwarové stroje LISP byly populární v 80. letech minulého století a umožňovaly aplikace, které dokázaly zpracovat kód. Často byly používány pro aplikace umělé inteligence .

Přístupy

Metaprogramování umožňuje vývojářům psát programy a vyvíjet kód, který spadá do obecného programovacího paradigmatu. Velmi užitečné je také mít samotný programovací jazyk jako prvotřídní datový typ (jako v Lisp , Prolog , SNOBOL nebo Rebol ); toto je známé jako homoiconicita . Obecné programování vyvolává metaprogramovací zařízení v jazyce tím, že umožňuje psát kód bez obav z určování datových typů, protože je lze při použití zadat jako parametry.

Metaprogramování obvykle funguje jedním ze tří způsobů.

  1. Prvním přístupem je vystavit interní součásti modulu run-time programovacímu kódu prostřednictvím rozhraní pro programování aplikací (API), jako je tomu u emulátoru .NET IL .
  2. Druhým přístupem je dynamické provádění výrazů, které obsahují programovací příkazy, často složené z řetězců, ale mohou být také z jiných metod využívajících argumenty nebo kontext, například Javascript. „Programy mohou psát programy“. Přestože oba přístupy lze použít ve stejném jazyce, většina jazyků se přiklání k jednomu nebo druhému.
  3. Třetím přístupem je zcela vystoupit z jazyka. Systémy transformace programů pro obecné účely, jako jsou kompilátory, které přijímají popisy jazyků a provádějí v těchto jazycích libovolné transformace, jsou přímými implementacemi obecného metaprogramování. To umožňuje aplikovat metaprogramování prakticky na jakýkoli cílový jazyk bez ohledu na to, zda má tento cílový jazyk nějaké vlastní schopnosti metaprogramování. Lze to vidět při práci se Scheme a jak to umožňuje řešit některá omezení, kterým v C čelí, pomocí konstruktů, které byly součástí samotného jazyka Scheme, k rozšíření C.

Lisp je pravděpodobně typický jazyk s nástroji pro metaprogramování, a to jak kvůli své historické prioritě, tak kvůli jednoduchosti a síle svého metaprogramování. V metaprogramování Lisp operátor bez uvozovek (obvykle čárka) zavádí kód, který je vyhodnocen v době definice programu, nikoli v době běhu; viz sebehodnocující formuláře a citace v Lispu . Metaprogramovací jazyk je tedy identický s hostitelským programovacím jazykem a stávající rutiny Lisp lze v případě potřeby přímo znovu použít pro metaprogramování. Tento přístup byl implementován v jiných jazycích začleněním tlumočníka do programu, který pracuje přímo s daty programu. Existují implementace tohoto druhu pro některé jazyky společné vysoké úrovně, jako je například RemObjects ' Pascal Script pro Object Pascal .

Využití

Generování kódu

Jednoduchým příkladem metaprogramu je tento skript POSIX Shell , který je příkladem generativního programování :

#!/bin/sh
# metaprogram
echo '#!/bin/sh' > program
for i in $(seq 992)
do
    echo "echo $i" >> program
done
chmod +x program

Tento skript (nebo program) generuje nový 993řádkový program, který vytiskne čísla 1–992. Toto je pouze ukázka toho, jak použít kód k napsání dalšího kódu; není to nejúčinnější způsob, jak vytisknout seznam čísel. Programátor však může tento metaprogram napsat a spustit za méně než minutu a za tuto dobu vygeneruje více než 1 000 řádků kódu.

Quine je speciální druh metaprogram která produkuje vlastní zdrojový kód jako jeho výstup. Quines mají obecně pouze rekreační nebo teoretický význam.

Ne všechny metaprogramování zahrnují generativní programování. Pokud jsou programy upravitelné za běhu nebo je k dispozici přírůstková kompilace (například v C# , Forth , Frink , Groovy , JavaScript , Lisp , Elixir , Lua , Nim , Perl , PHP , Python , REBOL , Ruby , Rust , SAS , Smalltalk , a Tcl ), pak lze použít techniky k provádění metaprogramování bez generování zdrojového kódu.

Jedním stylem generativního přístupu je použití jazyků specifických pro doménu (DSL). Poměrně běžný příklad použití DSL zahrnuje generativní metaprogramování: lex a yacc , dva nástroje používané ke generování lexikálních analyzátorů a analyzátorů , umožňují uživateli popsat jazyk pomocí regulárních výrazů a bezkontextových gramatik a vložit složité algoritmy potřebné k efektivní analýze Jazyk.

Kódové vybavení

Jedním z použití metaprogramování je instrumentace programů za účelem dynamické analýzy programu .

Změny chování

Metaprogramování lze použít k tkaní změn chování v programu, jako je tomu v programování orientovaném na aspekty . Metaprogramování lze například použít k vložení příznaků funkcí nebo k prozkoumání možných oprav pro opravu chyb.

Výzvy

Někteří tvrdí, že existuje ostrá křivka učení, která umožňuje úplné využití funkcí metaprogramování. Protože metaprogramování poskytuje větší flexibilitu a konfigurovatelnost za běhu, nesprávné použití nebo nesprávné použití metaprogramování může mít za následek neodůvodněné a neočekávané chyby, jejichž ladění pro průměrného vývojáře může být extrémně obtížné. Pokud není používán s opatrností, může do systému vnést rizika a učinit jej zranitelnějším. Některé z běžných problémů, ke kterým může dojít v důsledku nesprávného použití metaprogramování, jsou neschopnost kompilátoru identifikovat chybějící konfigurační parametry, neplatná nebo nesprávná data mohou mít za následek neznámou výjimku nebo jiné výsledky. Kvůli tomu se někteří domnívají, že na vývoji funkcí, které využívají metaprogramování v jazyce nebo platformě, by měli pracovat pouze vysoce kvalifikovaní vývojáři a průměrní vývojáři se musí naučit používat tyto funkce jako součást konvence.

Využití v programovacích jazycích

Makro systémy

Sestavovatelé maker

IBM / 360 a jejich deriváty měla silný makro Assembler zařízení, které byly často použity k vytvoření kompletní montáž jazykové programy nebo části programů (pro různé operační systémy například). Makra vybavená systémem zpracování transakcí CICS měla makra assembleru, která generovala příkazy COBOL jako krok před zpracováním.

Makra podporují i další assemblery, například MASM .

Metaklasy

Metaklasy poskytují následující programovací jazyky:

Metaprogramování šablony

Postupné metaprogramování

Závislé typy

Použití závislých typů umožňuje prokázat, že generovaný kód není nikdy neplatný. Tento přístup je však okrajový a jen zřídka se vyskytuje mimo výzkumné programovací jazyky.

Implementace

Seznam pozoruhodných metaprogramovacích systémů je veden v Seznamu programových transformačních systémů .

Viz také

Reference

externí odkazy