Metaprogrammalastırıw
Metaprogrammalastırıw — bul kompyuter programmalarınıń basqa programmalardı ózleriniń maǵlıwmatları retinde qarastırıw imkaniyatına iye bolǵan kompyuter programmalastırıw texnikası. Bul programma basqa programmalardı oqıw, dúziw, analizlew yamasa transformaciyalaw, hátte islep turǵan waqıtta ózin-ózi ózgertiw ushın proektlestiriliwi múmkin ekenin bildiredi[1]. Geypara jaǵdaylarda bul baǵdarlamashılarǵa sheshimdi ańlatıw ushın kod qatarları sanın minimallastırıwǵa múmkinshilik beredi, bul óz gezeginde islep shıǵıw waqtın azaytadı[2]. Ol sonıń menen birge programmalardıń qayta kompilyaciyasız jańa jaǵdaylardı nátiyjeli qayta islew ushın kóbirek beyimligin támiyinleydi.
Metaprogrammalastırıw esaplawlardı orınlanıw waqtınan kompilyaciya waqtına kóshiriw, kompilyaciya waqtındaǵı esaplawlar arqalı kod payda etiw hám ózin-ózi ózgertiwshi kodqa imkaniyat beriw ushın qollanılıwı múmkin. Programmalastırıw tiliniń óziniń metatili bolıw imkaniyatı reflektiv programmalastırıwǵa imkaniyat beredi hám refleksiya dep ataladı[3]. Refleksiya — bul metaprogrammalastırıwdı ańsatlastırıw ushın áhmiyetli til ózgesheligi.
Metaprogrammalastırıw 1970 hám 1980-jılları Lisp sıyaqlı dizimdi qayta islew tillerin paydalanıp keń tarqalǵan edi. Lisp mashina apparatlıq támiynatı 1980-jılları biraz itibarǵa iye boldı hám kodtı qayta isley alatuǵın qosımshalarǵa múmkinshilik berdi. Olar kóbinese jasalma intellekt qosımshaları ushın qollanılǵan.
Usıllar
Metaprogrammalastırıw baǵdarlamashılarǵa ulıwma programmalastırıw paradigmasına kiretuǵın programmalar jazıwǵa hám kod islep shıǵıwǵa imkaniyat beredi. Programmalastırıw tiliniń óziniń birinshi dárejeli maǵlıwmat túri retinde bolıwı (Lisp, Prolog, SNOBOL yamasa Rebol sıyaqlı) da júdá paydalı; bul gomoikonlıq dep ataladı. Ulıwma programmalastırıw bir tildegi metaprogrammalastırıw imkaniyatın maǵlıwmat túrlerin kórsetiwge itibar bermey kod jazıwǵa imkaniyat beriw arqalı iske túsiredi, sebebi olar parametr retinde beriliwi múmkin.
Metaprogrammalastırıw ádette úsh usıldıń birinde isley aladı[4].
- Birinshi usıl — bul .NET Common Intermediate Language (CIL) emitteri ushın qosımsha programmalastırıw interfeysleri (API) sıyaqlı orınlanıw waqtı sistemasınıń (dvijoktıń) ishki dúzilisin programmalastırıw kodına ashıq etiw.
- Ekinshi usıl — bul programmalastırıw buyrıqların óz ishine alǵan ańlatpalardıń dinamikalıq orınlanıwı, olar kóbinese qatarlardan, biraq sonday-aq argumentler yamasa kontekst paydalanatuǵın basqa metodlardan da dúziliwi múmkin, JavaScript sıyaqlı. Solay etip, «programmalar programmalardı jaza aladı». Eki usıldı da bir tilde paydalanıwǵa bolǵanı menen, kópshilik tiller birine yamasa ekinshisine kóbirek beyim.
- Úshinshi usıl — tilden tolıq shıǵıw. Kompilyatorlar sıyaqlı ulıwma maqsetli programma transformaciya sistemaları, olar til sıpatlamaların qabıl etedi hám sol tillerge qálegen transformaciyalardı orınlaydı, ulıwma metaprogrammalastırıwdıń tikkeley implementaciyaları bolıp tabıladı. Bul metaprogrammalastırıwdı derlik hár qanday maqsetli tilge, sol maqsetli tildiń óziniń metaprogrammalastırıw imkaniyatlarına iye bolıwına qaramastan, qollanıwǵa imkaniyat beredi. Bunı Scheme tilinde hám onıń C tilinde ushırasatuǵın ayırım sheklewlerdi C-di keńeytiw ushın Scheme tiliniń bir bólimi bolǵan konstrukciyalardı paydalanıp qalay sheshetuǵınında kóriwge boladı[5].
Lisp, bálkim, metaprogrammalastırıw imkaniyatlarına iye eń jaqsı til bolıp tabıladı, óziniń tariyxıy úlgisi sebepli de, óziniń metaprogrammalastırıwınıń ápiwayılıǵı hám kúshi sebepli de. Lisp metaprogrammalastırıwında, unquote operatorı (ádette útir) orınlanıw waqtında emes, al programmanı anıqlaw waqtında bahalanatuǵın kodtı kirgizedi. Solay etip, metaprogrammalastırıw tili xost programmalastırıw tili menen birdey hám bar Lisp rutinaları qálegen jaǵdayda metaprogrammalastırıw ushın tikkeley qayta paydalanılıwı múmkin. Bul usıl basqa tillerde programmanıń maǵlıwmatları menen tikkeley isleytuǵın interpretatordı programmaǵa kirgiziw arqalı ámelge asırılǵan. Ayırım keń tarqalǵan joqarı dárejeli tiller ushın bunday implementaciyalar bar, mısalı, Object Pascal ushın RemObjects' Pascal Script.
Qollanılıwı
Kod generaciyası
Metaprogrammanıń ápiwayı bir mısalı — bul generativ programmalastırıwdıń mısalı bolǵan usı POSIX Shell skripti:
#!/bin/sh
# metaprogram
echo '#!/bin/sh' > program
for i in $(seq 992)
do
echo "echo $i" >> program
done
chmod +x program
Bul skript (yamasa programma) 1-den 992-ge shekemgi sanlardı basıp shıǵaratuǵın jańa 993 qatarlı programma payda etedi. Bul tek kodtıń kóbirek kod jazıw ushın qalay paydalanılıwın kórsetiw illyustraciyası; bul sanlar dizimin basıp shıǵarıwdıń eń nátiyjeli usılı emes. Soǵan qaramastan, baǵdarlamashı bul metaprogrammanı bir minuttan az waqıt ishinde jazıp, orınlay aladı hám sol waqıt ishinde 1000 nan artıq kod qatarın payda etedi.
Quine — bul óziniń derek kodın óziniń shıǵıwı retinde payda etetuǵın arnawlı metaprogramma túri. Quine-lar ulıwma alǵanda tek oyın-zawıq yamasa teoriyalıq qızıǵıwshılıq ushın ǵana.
Barlıq metaprogrammalastırıw generativ programmalastırıwdı óz ishine almaydı. Eger programmalar orınlanıw waqtında ózgertiliwi múmkin bolsa yamasa inkremental kompilyaciya qoljetimli bolsa (C#, Forth, Frink, Groovy, JavaScript, Lisp, Elixir, Lua, Nim, Perl, PHP, Python, Rebol, Ruby, Rust, R, SAS, Smalltalk hám Tcl sıyaqlı), onda derek kodın generaciyalamay metaprogrammalastırıwdı orınlaw ushın texnikalar qollanılıwı múmkin.
Generativ usıldıń bir stili — arnawlı tarawǵa-qánigelesken tillerdi (DSL) qollanıw. DSL-lerdi qollanıwdıń júdá keń tarqalǵan mısalı generativ metaprogrammalastırıwdı óz ishine aladı: leksikalıq analizatorlar hám parserlerdi generaciyalaw ushın paydalanılatuǵın eki qural lex hám yacc, paydalanıwshıǵa tildi turaqlı ańlatpalar hám kontekstsiz grammatikalar arqalı táriyiplewge imkaniyat beredi hám tildi nátiyjeli analizlew ushın kerekli quramalı algoritmlerdi jaylastıradı.
Kod instrumentaciyası
Metaprogrammalastırıwdıń bir qollanılıwı — bul dinamikalıq programma analizin orınlaw ushın programmalardı instrumentaciyalaw.
Qıyınshılıqlar
Geyparalar metaprogrammalastırıw ózgesheliklerin tolıq paydalanıw ushın qatań úyreniw izbe-izligi bar dep esaplaydı[6]. Metaprogrammalastırıw orınlanıw waqtında kóbirek iykemlilik hám konfiguraciyalanıw imkaniyatın bergenlikten, metaprogrammalastırıwdı nadurıs paydalanıw yamasa qáte paydalanıw ortasha baǵdarlamashı ushın sazlawı júdá qıyın bolǵan kerek emes hám kútilmegen qátelerge alıp keliwi múmkin. Eger abaylap qollanılmasa, ol sistemaǵa qáwip-qáterler kirgiziwi hám onı hálsizirek etiwi múmkin. Metaprogrammalastırıwdı qáte paydalanıw sebepli payda bolıwı múmkin bolǵan ayırım keń tarqalǵan máseleler — kompilyatordıń jetispeytuǵın konfiguraciya parametrlerin anıqlay almawı, nadurıs yamasa qáte maǵlıwmatlar belgisiz ayrıqsha jaǵdayǵa yamasa basqa nátiyjelerge alıp keliwi múmkin[7]. Usı sebepli, geyparalar tek joqarı qánigeli baǵdarlamashılar ǵana tilde yamasa platformada metaprogrammalastırıwdı qollanatuǵın ózgesheliklerdi islep shıǵıw ústinde islewi kerek dep esaplaydı hám ortasha baǵdarlamashılar bul ózgesheliklerdi ádet boyınsha paydalanıwdı úyreniwi kerek.
Derekler
- ↑ Sondergaard. «Course on Program Analysis and Transformation» (2013). Qaraldı: 18-sentyabr 2014-jıl.
- ↑ Walker. «The Art of Metaprogrmming in Java». New Circle. Qaraldı: 28-yanvar 2014-jıl.
- ↑ Krauss. «Programming Concepts: Type Introspection and Reflection». 10-mart 2016-jılda túp nusqadan arxivlendi. Qaraldı: 10-mart 2016-jıl.
- ↑ Joshi. «What Is Metaprogramming? – Part 2/2». Perpetual Enigma (5-aprel 2014-jıl). Qaraldı: 14-avgust 2014-jıl.
- ↑ «Art of Metaprogramming». IBM.
- ↑ Bicking. «The challenge of metaprogramming». IanBicking.org. Qaraldı: 21-sentyabr 2016-jıl.
- ↑ Terry. «Beware of Metaprogramming». Medium.com. Medium Corporation (21-avgust 2013-jıl). Qaraldı: 21-avgust 2014-jıl.