19-lekciya_paradigma_qq
.pdf19-lekciya. Metaprogrammalastırıw. Metaprogrammalastırıw túrleri.
Jobası:
1.Metaprogrammalastırıw túsiniginiń mánisi hám tiykarǵı filosofiyası.
2.Kompilyaciya waqtındaǵı metaprogrammalastırıw (Makroslar hám shablonlar).
3.Orınlanıw waqtındaǵı metaprogrammalastırıw (Refleksiya hám dinamikalıq kod).
4.Metaprogrammalastırıwdıń qollanılıwı hám keleshegi (DSL, Kod generaciyası).
Metaprogrammalastırıw túsinigi hám filosofiyası
Metaprogrammalastırıw – bul "kod haqqında kod jazıw" yamasa "programmalar ushın programmalar jazıw" kórkem óneri. Ápiwayı programmalastırıwda biz maǵlıwmatlardı (sanlar, qatarlar, obyektler) qayta isleytuǵın kod jazsaq, metaprogrammalastırıwda biziń maǵlıwmatımız – bul kodtıń ózi bolıp tabıladı. Yaǵnıy, metaprogramma basqa programmanı oqıwı, analizlewi, ózgertiwi yamasa pútinley jańa kodtı generaciya etiwi múmkin. "Meta" sózi grek tilinen alǵanda "keyin" yamasa "ústinde" degen mánisti bildiredi, bul jerde ol abstrakciyanıń joqarı dárejesin ańlatadı.
Metaprogrammalastırıwdıń tiykarǵı maqseti – bul "Qaytalawdı azaytıw" (DRY - Don't Repeat Yourself) hám kodtıń "Ekspressivligin" (mánisliligin) arttırıw. Kóp jaǵdaylarda baǵdarlamashılar birdey strukturaǵa iye bolǵan kod bóleklerin (boilerplate code) qayta-qayta jazıwǵa májbúr boladı. Mısalı, maǵlıwmatlar bazasındaǵı keste ushın klass jaratqanda, onıń barlıq maydanları ushın getter hám setter metodların jazıw kerek. Metaprogrammalastırıw bul processti avtomatlastırıwǵa imkaniyat beredi: biz bir ǵana "meta-kod" jazamız, ol biz ushın júzlegen qatar ápiwayı kodtı avtomat túrde jaratıp beredi.
Bul paradigma eki túrli kózqarasqa iye: biri – kodtı "text" retinde qaraw (mısalı, C preprocessorı), ekinshisi – kodtı "struktura" (AST - Abstract Syntax Tree) retinde qaraw (mısalı, Lisp makrosları). Birinshi jaǵdayda kod ápiwayı almastırıw (substitution) arqalı ózgertilse, ekinshi jaǵdayda kodtıń sintaksislik tereklerin manipulyaciyalaw arqalı tereń ózgerisler kirgiziledi. Bul baǵdarlamashıǵa tildiń sintaksisin ózgerte alatuǵın dárejede kúshli qurallar beredi.
Metaprogrammalastırıw kóbinese "Sıyqır" (Magic) dep te ataladı. Sebebi ol kodtıń sırtqı kórinisi menen onıń haqıyqıy háreketin bir-birinen ajıratıp jiberedi. Mısalı, siz klassqa @Entity degen bir ǵana annotaciyanı qosıp qoyasız (Java Hibernate), al metaprogramma onıń arqasında úlken maǵlıwmatlar bazası menen islesiw mexanizmin iske túsiredi. Bul "sıyqır" paydalanıwshı ushın júdá qolaylı, biraq onıń ishki islew mexanizmin túsiniw hám qátelerdi ońlaw (debugging) qıyın bolıwı múmkin.
Kompilyaciya waqtındaǵı metaprogrammalastırıw (Compile-time)
Metaprogrammalastırıwdıń birinshi úlken túri – bul "Kompilyaciya waqtında" (Compile-time) kodtı generaciya etiw. Bul process programma iske túspesten burın, kodtı kompilyator oqıp atırǵan waqıtta júz beredi. Bunıń eń klassikalıq mısalı – "Makroslar". C hám C++ tillerindegi preprocessor (#define) makrosları kodtaǵı belgili bir sózlerdi basqa kod bóleklerine almastıradı. Biraq bul ápiwayı tekstlik almastırıw. Al Lisp, Rust yamasa Scala tillerindegi "Gigienik makroslar" (Hygienic Macros) kodtıń sintaksislik strukturası menen jumıs islep, qáwipsiz hám kúshli kod transformaciyasın ámelge asıradı.
C++ tilinde "Shablonlı metaprogrammalastırıw" (Template Metaprogramming - TMP) degen bólek taraw bar. C++ shablonları dáslep "generik" (tiplerge ǵárezsiz) kod jazıw ushın oylap tabılǵan edi, biraq keyinirek olardıń "Tyuring-tolıq" (Turing complete) ekeni anıqlandı. Yaǵnıy, shablonlar járdeminde kompilyaciya waqtında qálegen esaplawlardı (mısalı, faktorialdı esaplaw yamasa quramalı tipler dizimin qayta islew) orınlawǵa boladı. Bul usıl programmanıń orınlanıw waqtındaǵı (runtime) júklemeni azaytadı, sebebi esaplawlar aldın ala orınlanıp qoyıladı.
Compile-time metaprogrammalastırıwdıń jáne bir quralı – bul "Kod generatorları" (Source Code Generators). Java-daǵı Annotation Processing (mısalı, Lombok, Dagger) texnologiyası bunıń ayqın mısalı. Siz kodqa arnawlı belgilerdi (annotaciyalardı) qoyasız, kompilyator olardı kórip, siz jazbaǵan qosımsha klasslardı hám metodlardı avtomat túrde jaratıp (generate) qosıp jiberedi. Mısalı, @Getter annotaciyası klass ushın barlıq getter metodların "hawadan" payda etedi.
Bul túrdiń tiykarǵı artıqmashılıǵı – "Ónimlilik" (Performance). Barlıq "sıyqır" kompilyaciya waqtında bolıp ótetuǵınlıqtan, tayın programma (binary code) ádettegi qol menen jazılǵan kod sıyaqlı tez isleydi. Heshqanday qosımsha tekseriwler yamasa orınlanıw waqtındaǵı analizler (overhead) bolmaydı. Degen menen, kemshiligi – kompilyaciya waqtınıń uzayıwı hám qátelerdiń (error messages) túsiniwge qıyın bolıwı.
Orınlanıw waqtındaǵı metaprogrammalastırıw (Runtime)
Metaprogrammalastırıwdıń ekinshi túri – bul "Orınlanıw waqtında" (Runtime) ámelge asırılatuǵın manipulyaciyalar. Bul tiykarınan dinamikalıq tillerde (Python, Ruby, JavaScript) hám geybir statikalıq tillerde (Java, C#) "Refleksiya" (Reflection) arqalı iske asadı. Refleksiya – bul programmanıń jumıs islep turǵan waqıtta óziniń strukturasın (klasslardıń atların, metodların, atributların) tekseriw hám ózgertiw qábileti. Mısalı, Java-da Class.forName("MyClass") dep klastı júklep, onıń metodların atı arqalı tawıp (getMethod), shaqırıwǵa (invoke) boladı.
Dinamikalıq tillerde (Python, Ruby) metaprogrammalastırıw oǵada keń imkaniyatlarǵa iye. Bul tillerde klasslar hám obyektler "ashıq" (open) bolıp tabıladı. Yaǵnıy, programma islep turǵan waqıtta klassqa jańa metod qosıwǵa, bar metodtı óshiriwge yamasa onıń islesiwin ózgertiwge (Monkey Patching) boladı. Mısalı, Python-da __getattr__ sıyaqlı "sıyqırlı metodlar" (magic methods) bar. Eger siz obyektte joq atributqa baylanıssańız, usı metod shaqırıladı hám siz bul jaǵdaydı dinamikalıq túrde basqarıp, qálegen nátiyjeni qaytarıwıńız múmkin.
Ruby tili metaprogrammalastırıwdıń "patshası" dep esaplanadı. Ataqlı "Ruby on Rails" freymvorkı tolıǵı menen usı principke qurılǵan. Rails-te siz maǵlıwmatlar bazasındaǵı keste atın aytıwıńız benen, freymvork sol kestege sáykes keletuǵın metodlardı (findByEmail, findById h.t.b.) "jolday" (on the fly) jaratadı. Siz bul metodlardı kodta jazbaysız, olar programma iske túskende avtomat payda boladı. Bul "Convention over Configuration" (Konfiguraciyadan góre kelisim) principine tiykarlanǵan.
Orınlanıw waqtındaǵı metaprogrammalastırıwdıń artıqmashılıǵı – oǵada úlken "Iykemlilik" (Flexibility). Kodtıń minez-qulqın paydalanıwshınıń kirgiziwlerine yamasa konfiguraciya fayllarına qaray dinamikalıq túrde ózgertiwge boladı. Degen menen, kemshilikleri de salmaqlı: birinshiden, refleksiya hám dinamikalıq shaqırıwlar ádettegi metod shaqırıwlarına qaraǵanda ástelew isleydi. Ekinshiden, kodtıń qáwipsizligi tómenleydi – kompilyator qátelerdi taba almaydı, qáteler tek programma islep turǵanda (runtime error) shıǵadı.
BAQLAW SORAWLARÍ:
1.Metaprogrammalastırıw degende neni túsinesiz hám onıń tiykarǵı maqseti ne?
2.Kompilyaciya waqtındaǵı (Compile-time) hám Orınlanıw waqtındaǵı (Runtime) metaprogrammalastırıwdıń ayırmashılıǵı nede?
3.Makroslar (Macros) kodtı transformaciyalawda qanday rol oynaydı?
4.Refleksiya (Reflection) mexanizmi programmaǵa qanday imkaniyatlar beredi?
5.Metaprogrammalastırıwdıń artıqmashılıqları (DRY) hám kemshilikleri (quramalılıq, ónimlilik) qanday?
