Metaprogramozás

A metaprogramozás , amelyet a metaadatokkal és metaosztályokkal analóg módon neveznek meg , olyan programok írására utal, amelyek manipulálják az adatokat, amelyek maguk írják le a programokat. Abban a konkrét esetben, amikor a program a saját utasításait manipulálja a végrehajtása során, önmódosító programról beszélünk .

Használható a fordító által értelmezett kód előállítására, és állandó eredményt ad a kézi számítás elkerülése érdekében. Lehetővé teszi a program végrehajtási idejének csökkentését is, ha az állandó eredményt a program hagyományosan kiszámította, mint a változó eredményeket.

Ez a módszer nemcsak a számításokra vonatkozik, hanem állandó adatok, például tömbök vagy bonyolultabb struktúrák kitöltésére is. Ez a technika azonban csak állandó értékek esetén működik. Valójában, ha a metaprogram által kezelt adatelem a program bemenete, például a felhasználó bemenete, akkor a program végrehajtása előtt nem lehet tudni. Ezért lehetetlen, hogy egy ilyen metaprogramot egy fordító értelmezzen. A metaprogrammal történő optimalizálás ekkor teljesen elvész.

A metaprogramozás nem csak olyan adatok írásáról szól, amelyek programot tartalmaznak a fordító számára. Ez egyszerűen egy program manipulálása lehet változó bemenetek alapján. Például egy program a bemeneteitől függően mutálhatja a metaprogram kódját. Ez a metaprogram későbbi végrehajtásra vagy kódgenerálásra szolgálhat.

Folyamat

Ennek különböző módjai vannak:

Az első két technika áll rendelkezésre statikusan gépelt nyelvekhez . Ez a metaprogramozás erőteljes, de korlátozott formája. A kódgenerátor elve egy fordító felépítését jelenti, amely tartalmazza az adott nyelv szemantikáját, kiegészítésekkel. Ez a megközelítés ezért nem könnyen hordozható. A sablon alapú programozás lehetővé teszi az operátorok elkészítését teljesen heterogén adattípusokhoz - ez hasznos a C ++ verzióban. A közös Lisp sablonok általánosabbak. Ez a két technika csak az összeállítási szakaszt érinti. Néhány akadémiai nyelv (például a MetaOcaml ) gépelést biztosít, amely biztosítja, hogy a metaprogram által létrehozott programok helyesen legyenek beírva.

A reflektív nyelvek az önvizsgálat és a végrehajtás során történő módosítás módját kínálják , nemcsak az alkalmazás tartományának értékeit és objektumait, hanem a rendszer viselkedését is (nyelvként és szabványos könyvtárakként értve). A metaobjektum-protokollok lehetővé teszik a viselkedés meghatározását maguknak az osztályoknak a szintjén (osztályokat, módszereket egy adott tartomány objektumának tekintünk).

A makródefiníciós rendszer (vagy makrók) lehetővé teszik a forrás-forrás átalakítások végrehajtását: így új operátorokat adhatunk hozzá egy nyelvhez anélkül, hogy megváltoztatnánk annak specifikációját vagy módosítanánk a fordítót (ellentétben a kódgenerátorok elvével). Csak az s-kifejezésekkel ábrázolt nyelvek kínálnak kielégítő és használható makrórendszert, a programok absztrakt szintaxisa és konkrét szintaxisuk közötti konvergencia miatt .

Egyes szakértői rendszerek meta-szabályokkal vagy meta-ismeretekkel magyarázzák vagy irányítják következtetési motorjuk működését, amelyek metaprogramnak tekinthetők.

Példa

Például a 10-nél (vagy bármely más állandó értéknél) kisebb egész számok véges összegének kiszámításához el kell végezni a számítást 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10, és így tehetjük:

Az első esetben létrehozunk egy függvényt, amely lehetővé teszi a program számára a számítás elvégzését. Ez a technika szükségtelennek tűnhet, és pazarolja az időt a program futtatásakor, mert minden állandó. A program akkor lenne optimalizálhatóbb, ha a számítást már a végrehajtása előtt elvégezték.

A második esetben mi magunk számoljuk ki az értéket, és tesszük a program forráskódjába. Ez két hátránnyal jár:

A harmadik esetben a számítást a fordítónak szánt program programozásával hajtjuk végre. Ez végrehajtja ezt a metaprogramot, hogy állandó adatokká alakítsa át. Ez a legoptimálisabb módszer az emberi és a számítógépes számológépek számára , mivel a metaprogram csak egy adat, amelyet ebben az esetben kiértékelnek a végső program futtatása nélkül.

Lásd is

Kapcsolódó cikkek


<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">