Bosh sahifa Wiki Semantic analysis

Semantic analysis

Semantic analysis — kompilyator yoki til protsessorining sintaktik jihatdan to‘g‘ri dastur til qoidalariga ko‘ra mazmunan ham yaroqli ekanini tekshiradigan bosqichidir. Parser kodning grammatik tuzilishini aniqlagach, semantik tahlil nomlar, turlar, ko‘rinish sohasi va amallar o‘rtasidagi munosabatlarni tekshiradi. Natija odatda izohlangan abstrakt sintaksis daraxti yoki keyingi bosqich uchun tayyorlangan oraliq tasvirdir.

Asosiy tekshiruvlar

Nomlarni aniqlash jarayonida har bir identifikator tegishli e’lon bilan bog‘lanadi. Kompilyator lokal o‘zgaruvchi, parametr, modul a’zosi yoki tashqi kutubxona nomini ko‘rinish sohasi qoidalari asosida topadi. E’lon qilinmagan nom, bir sohada taqiqlangan takroriy e’lon yoki ko‘rinmaydigan a’zoga murojaat semantik xato hisoblanadi.

Tur tekshiruvi operator va funksiyalarga berilgan qiymatlar mosligini aniqlaydi. Masalan, sonli qo‘shish uchun yaroqli operandlar, funksiya argumentlari va qaytish turi tekshiriladi. Til avtomatik tur o‘zgartirishga ruxsat bersa, tahlil qaysi konversiya qo‘llanishini ham belgilaydi. Overload resolution bir nomli bir nechta funksiyadan argumentlarga eng mosini tanlaydi; noaniqlik bo‘lsa diagnostika chiqariladi.

Symbol table va kontekst

Symbol table e’lon qilingan nom, uning turi, ko‘rinish sohasi, saqlash xususiyati va manba joyini saqlaydigan tuzilmadir. Ichma-ich bloklar uchun jadvallar iyerarxiyasi yoki scope zanjiri ishlatiladi. Tahlilchi daraxtni aylanib, topilgan ma’lumotni tugunlarga biriktiradi. Keyinchalik kod generatsiyasi o‘zgaruvchi uchun xotira joyi yoki funksiya chaqirig‘i haqida shu ma’lumotdan foydalanadi.

Ba’zi qoidalar faqat turga bog‘liq emas. break operatorining sikl ichida bo‘lishi, barcha zarur yo‘llarda qiymat qaytarilishi, o‘zgarmas ifodaning o‘zgartirilmasligi yoki konstruktorga maxsus talablar shular jumlasidandir. Buning uchun kontekst steki yoki boshqaruv oqimi haqidagi dastlabki ma’lumot kerak bo‘ladi.

Diagnostika va keyingi bosqich

Yaxshi semantik diagnostika xato turini, aniq manba oralig‘ini va tegishli e’lon joyini ko‘rsatadi. Kompilyator birinchi xatodan keyin to‘xtamasdan, xavfsiz tiklanish orqali boshqa mustaqil xatolarni ham topishi mumkin. Biroq bitta noto‘g‘ri turdan kelib chiqqan o‘nlab ikkilamchi xabarlarni bostirish foydalanuvchi uchun muhimdir.

Semantik tahlildan so‘ng dastur nomlari va turlari aniqlangan bo‘ladi. Shu asosda oraliq tasvir quriladi, generik turlar konkretlashtiriladi yoki yuqori darajali konstruksiyalar soddaroq amallarga tushiriladi. Statik tiplanmagan tillarda bu tekshiruvlarning bir qismi bajarilish vaqtiga qoldiriladi, ammo scope, e’lon va modul bog‘lanishlari baribir oldindan tahlil qilinishi mumkin.

Ko‘p bosqichli va inkremental tahlil

Bir nechta modul bir-biriga murojaat qilsa, tahlil avval eksport qilingan e’lonlarni yig‘ib, keyin tanalarni tekshirishi mumkin. Bu o‘zaro rekursiv funksiyalarni hal qilishga imkon beradi. IDE muhitida har tugma bosilishida butun loyihani qayta tekshirish qimmat, shu sababli inkremental analiz o‘zgargan fayl va unga bog‘liq qismlarnigina qayta hisoblaydi. Qisman yozilgan kod sintaktik jihatdan tugallanmagan bo‘lsa ham, tahlilchi mavjud scope va tur ma’lumotidan completion berishga harakat qiladi. Keshlangan natijalar compiler bayroqlari va dependency versiyalari o‘zgarganda bekor qilinishi kerak.

Generik dasturda type constraintlar ham semantik bosqichda tekshiriladi. Trait yoki interface talabi bajarilmasa, xabar konkret argument turi va yetishmayotgan operatsiyani ko‘rsatadi. Constant evaluation talab qilinadigan joyda ifoda kompilyatsiya vaqtida hisoblanishi mumkinligi ham tasdiqlanadi.

Semantik natijalar keyingi diagnostika va refactoring vositalari uchun ham qayta ishlatiladi.

Bog‘liq tushunchalar

Parser, Abstract syntax tree, Symbol table, Type checking, Scope, Intermediate representation, Compiler