Taksonomija sistemov meta-programiranja.

V meta-programskem sistemu meta-programi manipulirajo z objektnimi programi. Meta programi lahko konstruirajo objektne programe, kombinirajo fragmente predmeta programa v večje objekte, opazujejo strukturo in druge lastnosti predmetnih programov ter izvajajo predmetne programe za pridobivanje njihovih vrednosti.

Obstajajo dve pomembni vrsti scenarijev meta-programiranja: generatorji programov in analize programov. Vsak od teh scenarijev ima številne značilnosti

  1. Generator
    1. Zastopanje: Strings vs. Algebraic datatype vs. Quasi-quote
    2. Samodejno in Ročno označevanje
    3. Statični Generator vs. Runtime Generator
    4. Homogena in heterogena
    5. Izpisano v primerjavi z neizpisano
    1. Statično izpisano in dinamično uničeno
    6. Dve stopnji v primerjavi z N-stopnjo
  2. Analiza
    1. Homogena in heterogena
    2. Povzetek sintakse višjega reda proti sintaksi prvega reda
    3. Izpisano v primerjavi z neizpisano

Generatorji proti analizam

Generator programa (meta-program) rešuje posebno težavo z izgradnjo drugega programa (predmetnega programa), ki rešuje problem pri roki. Običajno je ustvarjeni (predmetni) program “specializiran” za določen problem in uporablja manj virov kot splošni namen, ki ni generatorja.
Programska analiza (meta-program) upošteva strukturo in okolje predmetnega programa in izračuna nekaj vrednosti kot rezultat. Rezultati so lahko grafični prikazi podatkov ali kontrolni tok ali celo drugi objektni program s svojimi lastnostmi, ki temeljijo na lastnostih izvornega objekta. Primeri teh vrst meta-sistemov so: programski transformatorji, optimizatorji in delni sistemi vrednotenja.

Zastopanje: Strings vs. Algebraic datatype vs. Quasi-quote

Sistem meta-programiranja uporablja pripombe programa (imenovane opombe zapisov), da bi razlikovali med metaprogramom iz predmetnega programa. Objektni program mora biti prvovrstna vrednost. O tem bi morali razmišljati kot datastrukturo, ki jo je mogoče manipulirati kot katerakoli druga. Številni meta-sistemi predstavljajo objektne programe z uporabo nizov, grafov ali algebrskih podatkovnih struktur.
Z kodiranjem nizov kodo fragment f (x, y) predstavljamo preprosto kot “f (x, y)”. Medtem ko je gradnja in združevanje fragmentov, ki jih predstavljajo strune, lahko zgoščeno, njihovo dekonstruiranje je precej verbalno. Bolj resno, ni samodejno preverljivega jamstva, da so tako zgrajeni programi sintaktično pravilni. Na primer: “f (, y)” ima statični niz vrstic, vendar to očitno ne pomeni, da ta niz predstavlja sintaktično pravilen program.

Z kodiranjem podatkovnega tipa lahko odpravimo težavo sintaktične korektnosti. Kodiranje podatkovnega tipa je v bistvu enako, kot se imenuje abstraktna sintaksa ali razčleniti drevesa. Kodiranje fragmenta “f (x, y)” v podatkovnem tipu SML je lahko: Uporabi (spremenljivka “f”, tuple [spremenljivka “x”, spremenljivka “y”]) z uporabo podatkovnega tipa, ki se deklarira na naslednji način:

datatype exp = Spremenljiv niz
| Uporabi (exp * exp)
| Tuple exp list

Uporaba kodiranja podatkovnega tipa ima takojšnjo korist: pravilen tipkanje za meta-program zagotavlja pravilno sintakso za vse objektne programe. Ker SML podpira ujemanje vzorcev nad tipi datotestov, dekonstruiranje programov postane lažje kot z nizom predstavitev. Vendar je gradnja programov bolj poglobljena, ker moramo uporabiti okorne konstruktorje, kot sta Variable, Apply in Tuple.

Predstavitev Quasi-quote je poskus, da se ta omejitev zgodi. Tu je dejanska predstavitev objektne kode skrita od uporabnika s pomočjo mehanizma kotacije. Objektna koda je sestavljena tako, da dajo oznake »citat« okoli običajnih kodnih fragmentov.

V preostalem delu tega dokumenta bomo uporabili kvazitacijsko notacijo sistema meta-programiranja MetaML. V kvazi citati MetaML je le ena od večih opomb o zaporedju. V MetaML-u so zapisi zapisov Brackets <>, Escape ~, dviganje in zagon. Izraz <e> gradi kodno predstavitev e; črta kodo, ki jo dobimo z vrednotenjem e v telo bližnjega izraza Bracketed; in zaženite e, ocenjuje e, da pridobi kos kode, nato pa oceni ta del kode. Pomembno je omeniti, da je ~ e le zakonito v oklepajih z lexico.

Kot pri predstavitvi programov v datotečnem prikazu, z uporabo označevalnih zapisov zagotavlja sintaktično pravilnost predmetnih programov z uporabo pravilnosti meta-programov, vendar ohranja enostavnost gradnje objektnih programov. S postopnim sistemom tipa (glej spodaj) lahko pravilnost meta-programov prav tako zagotavlja pravilnost (in sintaktično pravilnost) predmetnih programov.

Samodejno vs. Ročno

Kličemo sistem meta-programiranja, pri katerem programer postavlja pripombe v zaporedje neposredno v sistem ročnega nastavljanja. Če so opombe za zaporedje postavljene s samodejnim procesom, je sistem za meta-programiranje samodejni strežniški sistem.
Off-line delno ovrednotenje je meta-sistem za samodejno uprizoritev. Razmislite o preprosti delni funkciji vrednotenja PE s tipom <s -> d -> a> -> (s -> <d -> a>)

PE predstavlja predstavitev programa z enim statičnim parametrom in enim dinamičnim parametrom ter vrne odgovor. Analizira ta program in samodejno izdela priglašeni program, ki pri dodeljevanju statičnega parametra kot vhod producira predstavitev funkcije iz dinamičnega parametra za odgovor. Na primer:

PE <fn s => fn d => d + (s + 3)>

vrednoti

fn s => <fn d => d + ~ (dvigalo (s + 3))>

Samodejni sistemi meta-programiranja shranjujejo uporabnika, da se trudi postavljati opombe, toda uporabnik samodejnega sistema izgubi nadzor nad strukturo proizvodnje.

Trdilo se je, da je programe, ki se izvajajo ročno, težko pisati in so precej večji od njihovih neizpostavljenih kolegov, ki bi jih lahko vnesli v sistem PE, kar bi prihranilo uporabniku veliko dela. S prihodom sodobnih meta-programskih sistemov s pripisi navajanja kvazitomov je še vedno videti, ali ta argument še vedno velja. Naše izkušnje so bile, da so ročno pripisani programi (v nekaj odstotkih) enake velikosti kot njihovi nepredvideni kolegi.

Statični Generator vs. Runtime Generator

Programski generatorji so na voljo v dveh okvirih: statični generatorji, ki ustvarjajo kodo, ki je nato “zapisana na disk”, obdelana z običajnimi prevajalniki itd. In generatorji kode, ki so programi, ki napišeta ali izdelujejo druge programe, nato pa takoj izvedejo programe so jih ustvarili. Primeri programskih generatorjev so sistemi za generiranje kode, kot sta sintezno jedro, in statični programski generatorji, kot je Yacc.

Homogena in heterogena

Obstajata dve vrsti meta-programskih sistemov: homogeni sistemi, kjer sta meta-jezik in predmetni jezik enaka, in heterogeni sistemi, kjer se meta-jezik razlikuje od predmetnega jezika.

Obe vrsti sistemov sta uporabni za predstavitev programov za avtomatizirano programsko analizo in manipulacijo. Vendar pa obstajajo pomembne prednosti za homogene sisteme. Samo homogeni sistemi so lahko večplastni, pri čemer je lahko predmetni program sam metapodatkov, ki manipulira z objektno programsko opremo druge stopnje. Samo v homogenem meta-sistemu lahko enotni tip tipa vnaša tako meta-jezik kot tudi predmetni jezik. Samo homogeni meta-sistemi lahko podpirajo refleksijo (kjer je meta-jezik dovolj bogat, da se lahko vsak primitiv na objektnih programih izrazi kot meta-program). Samo homogeni meta-sistemi lahko enotno podpirajo operacijo “run” ali “eval”. To je tisto, zaradi česar je možna generacija kode. Homogeni sistemi imajo tudi pomembno pedagoško in uporabnostno lastnost, ki jo uporabnik potrebuje le za učenje enega samega jezika.

Izpisano v primerjavi z neizpisano

Za avtomatiziranje procesa meta-programiranja in zmanjšanje napak je treba omogočiti, da nekatere lastnosti predmetnih programov statično sklepamo iz meta-programov, ki jih manipulirajo. Pomemben napredek, ki ga zagotavlja sistem meta-programiranja MetaML, je sistem, ki je vgrajen v sistem. Sistem s postopnim tipom združuje pomembne informacije o meta-programiranju postavljanja in tipov v en sistem.
Sistem s postopnim tipom natančno določa nastavitvene omejitve sistema, kot tudi zahteve za tipizacijo posamezne stopnje. Ena prednost sistema s postopnim tipom je, da so meta-programi, ki manipulirajo z zlorabljenimi predmeti, sami vneseni. To daje odlične povratne informacije pisateljem meta-programov.

Sistemi zaporednih tipov so še posebej primerni za homogene sisteme, saj je potreben samo en sistem tipa. Takšni sistemi zajemajo statično in dinamično ločevanje parametrov delne ocene. Tako program f s tipom: f :: a -> <d> -> <b -> <c>> nam pove kar precej o programu.

Piše, da je f funkcija z dvema parametroma. prvi je statični (poznan zdaj) parameter vrste “a”, drugi pa je dinamičen (ni znan do druge stopnje) parameter tipa “d”. Ta program ustvari predmetni program, ki je tudi meta-program (drugostopenjski), z enim (drugostopenjskim) statičnim parametrom tipa “b”, ki proizvaja (tretji korak) predmetski program tipa “c” .

Pomembni so tudi tipični heterogeni meta-sistemi. Tukaj vrsta meta-programa nekako vključuje vrste predmetnega jezika. To omogoča, da meta-programi šifrirajo samo vrste, ki so skladne (na ravni objekta) transformacije predmetne kode, ali pa vnašajo prevode iz enega predmeta v drugega. V tem primeru obstajata trije tipski sistemi, ki morajo delovati usklajeno (sistem meta-ravni in dva sistema objektnega nivoja).

Statično izpisano in dinamično uničeno

Dve stopnji v primerjavi z N-stopnjo

Dvostopenjski meta-programski sistem omogoča samo eno meta-stopnjo in eno samo fazo objekta. V metapodirnem sistemu N-stopenj je lahko vsak predmetni program tudi meta-program.

Vmesnik človek-stroj

Poleg teh operativnih lastnosti mora meta-sistem imeti tudi dober vmesnik med človekom in sistemom. Naše izkušnje s sistemi meta-programiranja so nas pripeljale do oblikovanja naslednjega meta-programiranja vmesnika humanega sistema desiderata:

  1. Gradnja. Ustvariti bi bilo treba kodo z uporabo nekakšnih vzorčnih predlog objektnih kod. Predloge morajo “izgledati” kot jezik predmeta, ki ga predstavljajo.
  2. Splicing. Programske fragmente bi bilo treba enostavno združiti v večje programske fragmente, kar najbolje doseže parameterizabilni mehanizem spajanja, kot je “predloge z luknjami”.
  3. Tipkanje. V homogenem sistemu ima objektna koda parametrično vrsto, to je koda s tipom Int, kodo s tipom Float itd. Pravilnost tipov meta-programa mora zagotavljati pravilnost objektnih programov, ki jih gradi.
  4. Higiena. Obvezne spremenljivke v predlogah je treba obravnavati na prefinjen način, ki ne zagotavlja nobenega imena in se drži pravil statičnega obsevanja. Proste spremenljivke v programskih predlogah se morajo nanašati na vrednost spremenljivke na statični lokaciji, kjer je predloga definirana, ne pa na kraju, kjer je bila izvedena.
  5. Run. Objektne programe je mogoče zagnati. Ustvarjena koda se lahko “testira” znotraj meta-sistema.
  6. Tiskanje. Objektne programe lahko natisnete. To je bistveno za razhroščevanje meta-programov. Objektni programi morajo biti precej natisnjeni na način, ki ga običajno napiše programer. Ne smejo jih predstavljati nekatere abstraktne predstavitve, ki niso znane programerju.
  7. Opazovanje. Objektni programi imajo strukturo. Treba bi bilo omogočiti analizo predmetnih programov, jih ločiti, itd.

Vir: http://web.cecs.pdx.edu/~sheard/staged.html

 

Leave a Reply

Your email address will not be published. Required fields are marked *