Dynamic semantics — dastur bajarilganda expression, statement va boshqa til konstruksiyalari holatga qanday ta’sir qilishi hamda qanday natija hosil qilishini belgilovchi qoidalardir. Operatorning qiymat hisoblash usuli, function call, memory update, exception va concurrency xatti-harakati shunga kiradi. Static semantics kodni bajarmasdan tekshirsa, dynamic semantics runtime ma’noni ifodalaydi.
Evaluation qoidalari
a + b expressioni operandlarni baholash, ularning qiymatiga addition qo‘llash va natijani qaytarishni anglatadi. Operand evaluation order tilga qarab chapdan o‘ngga, o‘ngdan chapga yoki ayrim holatda belgilanmagan bo‘lishi mumkin. Side effect mavjud bo‘lsa tartib ko‘rinadigan natijani o‘zgartiradi.
Short-circuit operator o‘ng operandni shartga qarab umuman bajarmaydi. Function call argument bahosi, stack frame yaratish, parameter binding va return bilan tasvirlanadi. Tail-call optimization kuzatiladigan semantikani saqlab, implementation stackini o‘zgartirishi mumkin.
Operational semantics
Small-step semantics bitta konfiguratsiyadan keyingi kichik hisoblash qadamiga o‘tishni ko‘rsatadi. U concurrency, exception va infinite computationni nozik tasvirlaydi. Big-step semantics expressionni yakuniy qiymatga bevosita bog‘laydi va normal tugaydigan hisobni sodda ifodalaydi.
Konfiguratsiya expression bilan birga environment, store va control state’ni saqlashi mumkin. Assignment store’ni yangilaydi, declaration environmentga binding qo‘shadi. Formal transition rule implementatsiya va proof uchun aniq model beradi.
Denotational yondashuv
Denotational semantics dastur konstruksiyasini matematik obyekt yoki funksiyaga map qiladi. Compositional yondashuv katta expression ma’nosini qismlari ma’nosidan quradi. Nontermination, mutable state va concurrency uchun domain theory kabi murakkab vositalar kerak bo‘lishi mumkin.
Axiomatic semantics esa bajarilish qadamidan ko‘ra precondition va postcondition orqali dastur xususiyatini ifodalaydi. Hoare logic formal verificationda “agar P rost bo‘lsa, statementdan so‘ng Q rost” tarzidagi mulohazani beradi.
Runtime xatolar
Nolga bo‘lish, null dereference, bounds violation va uncaught exception dynamic semantika bilan belgilanadi. Til xatoni exception, trap, sentinel yoki undefined behavior sifatida belgilashi mumkin. Bir xil syntax turli tilda boshqa runtime natija berishi mumkin.
Undefined behavior implementatsiyaga istalgan xatti-harakatga ruxsat berishi mumkin; u oddiy “tasodifiy qiymat” emas. Checked mode yoki sanitizer developmentda xavfli holatni erta trap qiladi. Production policy til va performance talabiga bog‘liq.
Concurrency
Memory model threadlar orasidagi read va write qachon ko‘rinishini belgilaydi. Data race, atomic operation va happens-before dynamic natijaga ta’sir qiladi. Faqat source statement tartibi CPU va compiler reorderini to‘liq cheklamaydi.
Nondeterministic scheduling bir dasturdan bir nechta qonuniy execution trace hosil qilishi mumkin. Semantics ruxsat etilgan natijalar to‘plamini belgilaydi. Concurrency test va formal model shu variantlarni tekshiradi.
Implementation va spetsifikatsiya
Interpreter semanticsni bevosita bajarishi, compiler esa unga teng machine code hosil qilishi mumkin. Optimization observable behaviorni saqlashi kerak. Differential testing bir dasturni bir nechta implementation yoki optimization darajasida ishlatib, natija farqini topadi.
Reference interpreter sodda, ammo sekin model sifatida xizmat qilishi mumkin. U ham spetsifikatsiyaning mutlaq o‘rnini bosmaydi: reference implementatsiyada bug bo‘lishi mumkin. Versionlar orasida overflow, string comparison yoki exception tartibi o‘zgarsa behavioral breaking change yuz beradi. Compatibility testlar real edge case va oldingi artefaktlarni qamrab oladi.
Bog‘liq tushunchalar
Operational semantics, Denotational semantics, Static semantics, Evaluation order, Side effect, Runtime, Memory model