Bosh sahifa Wiki Intermediate representation

Intermediate representation

Intermediate representation — kompilyatorda manba til bilan yakuniy mashina kodi orasida ishlatiladigan dastur tasviridir. Odatda IR qisqartmasi bilan ataladi. U manba tilning murakkab sintaksisini soddalashtirib, tahlil, optimizatsiya va turli protsessorlar uchun kod generatsiyasini yagona ichki shaklda bajarishga imkon beradi.

Tuzilishi va darajalari

Abstrakt sintaksis daraxti dastur sintaksisiga yaqin bo‘lsa-da, u ham oraliq tasvirning bir turi sifatida qaralishi mumkin. Yuqori darajali IR massiv, obyekt yoki istisno kabi til konstruksiyalarini saqlaydi. Pastroq darajaga tushirilganda bu amallar manzil hisoblash, tarmoqlanish va sodda arifmetik operatsiyalarga ajraladi. Mashina IR esa maqsad protsessor registrlari va ko‘rsatmalariga juda yaqin bo‘ladi.

Ko‘p kompilyatorlar uch manzilli koddan foydalanadi: har bir ko‘rsatma oz sonli operand va bitta natijaga ega. Boshqaruv oqimi basic blocklarga bo‘linadi va control-flow graph orqali bog‘lanadi. Static single assignment shaklida har bir virtual o‘zgaruvchiga faqat bir marta qiymat beriladi; turli yo‘llardan kelgan qiymatlar maxsus phi tugunlari bilan birlashtiriladi. Bu xususiyat qiymatlarning kelib chiqishini tahlil qilishni yengillashtiradi.

Kompilyator arxitekturasidagi foyda

IR frontend va backendni ajratadi. Har bir manba tili umumiy IRga tarjima qilinadi, har bir apparat backend esa shu IRdan o‘z mashina kodini yaratadi. Natijada N ta til va M ta arxitektura uchun N×M to‘liq kompilyator o‘rniga frontendlar va backendlar alohida ishlab chiqiladi. Amalda maqsadga xos xususiyatlar sabab integratsiya baribir murakkab, lekin ajratish kodni qayta ishlatishni sezilarli oshiradi.

Optimizatsiyalar IR ustida ishlaydi. Constant folding oldindan ma’lum ifodani hisoblaydi, dead code elimination natijasi ishlatilmaydigan amallarni olib tashlaydi, common subexpression elimination esa takroriy hisobni birlashtiradi. Alias analysis ikki ko‘rsatkich bir xil xotiraga murojaat qilishi mumkinligini baholaydi. IR aniq yon ta’sir va xotira modelini ifodalasa, bunday o‘zgartirishlarning to‘g‘riligini isbotlash osonroq bo‘ladi.

Lowering va metama’lumot

Lowering yuqori darajali amalni pastroq darajadagi amallar ketma-ketligiga aylantiradi. Masalan, obyekt yaratish xotira ajratish, maydonlarni boshlash va konstruktor chaqirig‘iga ajralishi mumkin. Bu jarayon bir necha bosqichda amalga oshib, har bir bosqich o‘z invariantlariga ega bo‘ladi. Validator yoki verifier IR shu invariantlarga mosligini tekshiradi.

Manba qatori, o‘zgaruvchi nomi va scope haqidagi debug metama’lumot optimizatsiyadan keyin ham saqlanishi kerak. Aks holda debugger mashina ko‘rsatmalarini asl kod bilan bog‘lay olmaydi. JIT kompilyator ham IRdan foydalanadi, lekin kompilyatsiya vaqtini cheklash uchun tez va qimmat optimizatsiyalar o‘rtasida muvozanat tanlaydi.

IR dizayni

Yaxshi IR faqat amallar ro‘yxati emas, aniq semantik shartnomadir. Integer overflow, xotira tartibi, istisno tashlash va undefined behavior qanday ifodalanishi optimizatsiya imkonini belgilaydi. Juda umumiy IR turli tillarni qabul qiladi, lekin tilga xos foydali ma’lumotni erta yo‘qotishi mumkin; juda maxsus IR esa backendlarni qayta ishlatishni cheklaydi. Shu sababli amaliy kompilyatorlar bir nechta darajani saqlab, har lowering bosqichida invariantlarni tekshiradi. IR matn ko‘rinishida chiqarilsa, testlar o‘tish natijasini solishtirishi va muhandis optimizatsiya xatosini aniq bosqichda topishi osonlashadi.

IR serialization kompilyatsiya keshini va alohida jarayonlar orasidagi pipeline’ni qo‘llashi mumkin. Format versiyasi qat’iy boshqariladi, chunki eski producer yaratgan tasvir yangi pass kutgan invariantga mos kelmasligi mumkin.

Bog‘liq tushunchalar

Compiler, Abstract syntax tree, SSA, Control-flow graph, Optimization, Code generation, Machine code