Macro — manba kodidagi belgilangan yozuvni kompilyatsiya yoki undan oldingi bosqichda boshqa kod bo‘lagiga aylantiradigan mexanizmdir. Makro funksiya chaqirig‘idan farqli ravishda odatda bajarilish vaqtida alohida obyekt bo‘lmaydi: uning natijasi dastur yig‘ilishidan oldin kodga qo‘shiladi. Aniq imkoniyat va xavflar tilning makro tizimiga bog‘liq.
Matnli makrolar
C oilasidagi preprocessor makrolari token yoki matnga yaqin almashtirish bajaradi. Parametrli makro qisqa ifodani qayta ishlatishga imkon beradi, lekin parametr bir necha marta kengaysa, yon ta’sirli argument ham bir necha marta bajarilishi mumkin. Operator ustuvorligi sabab kutilmagan natijani kamaytirish uchun parametr va butun ifoda qavsga olinadi. Shunga qaramay, type checking makro kengaygandan keyingina ishlaydi va diagnostika asl yozuvdan uzoqlashishi mumkin.
Shartli kompilyatsiya platforma, arxitektura yoki feature flag bo‘yicha kod variantini tanlaydi. Bu bir manbani bir nechta muhitda yig‘ishga yordam beradi. Juda ko‘p shart kombinatsiyasi sinovdan o‘tmagan yo‘llar yaratadi, shuning uchun qo‘llab-quvvatlangan variantlar CI’da alohida build qilinadi.
Sintaktik va protsedurali tizimlar
Zamonaviy tillardagi hygienic macro identifikatorlarni scope qoidalariga mos boshqarib, makro ichidagi vaqtinchalik nomning chaqiruvchi kod nomi bilan tasodifiy to‘qnashishini cheklaydi. Sintaktik makro oddiy matn emas, parser tushunadigan token daraxti yoki AST ustida ishlaydi. Shu sababli hosil qilingan kodning grammatik tuzilishi aniqroq nazorat qilinadi.
Procedural macro kirish tokenlarini dastur orqali tahlil qilib, yangi tokenlar hosil qiladi. U atribut, serialization kodi, tekshiruv yoki DSL yaratishda ishlatiladi. Bunday makro compiler plaginiga o‘xshash kuchga ega bo‘lishi mumkin; uning build vaqti, determinizmi va ishonchliligi nazorat qilinadi. Tarmoq yoki tasodifiy tashqi holatga bog‘liq generatsiya reproducible buildni buzadi.
Foydalanish chegaralari
Makro takroriy boilerplate’ni kamaytiradi va tilning o‘zida yo‘q abstraksiyani yaratadi. Lekin oddiy funksiya, generik yoki modul yetarli bo‘lsa, ular ko‘pincha o‘qilishi va testlanishi osonroq. Makro kengaytmasini ko‘rsatuvchi compiler vositasi hosil bo‘lgan kodni tekshirishda yordam beradi. Xato xabarlari chaqiruv joyi va generatsiya qilingan qismni bog‘lashi kerak.
Security nuqtayi nazaridan dependency ichidagi procedural macro build paytida kod bajarishi mumkin. Paket manbasi, versiyasi va ruxsatlari tekshiriladi. Generatsiya qilingan kod ham oddiy kod kabi review, lint va testdan o‘tadi; makro avtomatik yaratgani uni xavfsiz yoki to‘g‘ri qilmaydi.
+## Testlash va versiyalash
Makroning o‘zi bilan birga kengaytirilgan natija ham test qilinadi. Compile-fail test noto‘g‘ri kirish uchun kutilgan diagnostikani, snapshot test esa token yoki AST shaklini tekshiradi. Public makro tilning sintaksisi va compiler API’siga bog‘liq bo‘lsa, yangi toolchain versiyasi bilan moslik CI’da oldindan sinovdan o‘tadi. Makro chaqiruvchining yashirin importi yoki global holatiga tayanmasligi kerak. Kengayish kod hajmini ko‘paytirsa, binar hajm va kompilyatsiya vaqti o‘lchanadi. Recursive kengayish uchun depth limiti qo‘yilib, xato sikl build jarayonini cheksiz band qilmaydi. Hujjatda parametrlar qaysi kontekstda bir marta yoki ko‘p baholanishi aniq ko‘rsatiladi.
IDE makro kengayishidagi tokenni asl chaqiruv qatoriga bog‘lab, rename va navigationni saqlashi kerak. Source map bo‘lmasa, generated koddagi xato foydalanuvchiga tushunarsiz ichki fayl manzilini ko‘rsatadi. Shu sababli makro API diagnostika spanlarini ataylab belgilaydi.
Bog‘liq tushunchalar
Preprocessor, Metaprogramming, AST, Code generation, Hygienic macro, Compiler, DSL