Kompilyatorni optimallashtirish - Optimizing compiler - Wikipedia

Yilda hisoblash, an optimallashtiruvchi kompilyator a kompilyator ba'zi bir atributlarini minimallashtirish yoki maksimal darajaga ko'tarishga harakat qiladi bajariladigan kompyuter dasturi. Umumiy talablar: minimallashtirish dastur ijro vaqti, xotira izi, saqlash hajmi va kuch iste'mol (oxirgi uchtasi mashhurdir ko'chma kompyuterlar ).

Kompilyatorni optimallashtirish odatda ketma-ketligi yordamida amalga oshiriladi transformatsiyalarni optimallashtirish, ozroq resurslardan foydalanadigan va / yoki tezroq bajaradigan, semantik jihatdan ekvivalent chiqish dasturini ishlab chiqarish uchun dasturni qabul qiladigan va o'zgartiradigan algoritmlar. Kodni optimallashtirishning ba'zi muammolari borligi ko'rsatildi To'liq emas, yoki hatto hal qilib bo'lmaydigan. Amalda, kabi omillar dasturchi Kompilyator o'z vazifasini bajarishini kutishga tayyorligi, kompilyator taqdim etishi mumkin bo'lgan optimallashtirishga yuqori chegaralarni qo'yadi. Odatda optimallashtirish juda muhimdir Markaziy protsessor - va xotira talab qiladigan jarayon. Ilgari, kompyuter xotirasidagi cheklovlar ham optimallashtirishni amalga oshirishni cheklashda asosiy omil bo'lgan.

Ushbu omillar tufayli optimallashtirish har qanday ma'noda kamdan-kam hollarda "maqbul" ishlab chiqarishni keltirib chiqaradi va aslida "optimallashtirish" ba'zi hollarda ishlashga to'sqinlik qilishi mumkin. Aksincha, ular odatdagi dasturlarda resurslardan foydalanishni yaxshilash uchun evristik usullardir.[1]

Optimallashtirish turlari

Optimallashtirishda qo'llaniladigan usullarni turli xil usullar bilan taqsimlash mumkin qamrov doiralari bu bitta bayonotdan butun dasturgacha ta'sir qilishi mumkin. Umuman aytganda, mahalliy miqyosdagi texnikani amalga oshirish globalga qaraganda osonroq, ammo kichik yutuqlarga olib keladi. Ba'zi bir misollarga quyidagilar kiradi:

Teshiklarni optimallashtirish
Odatda ular keyinchalik kompilyatsiya jarayonida amalga oshiriladi mashina kodi hosil bo'ldi. Ushbu optimallashtirish shakli bir nechta qo'shni ko'rsatmalarni o'rganadi (masalan, "ko'zdan kechirish teshigi" ni ko'rib chiqish), ularni bitta buyruq bilan almashtirish yoki qisqa ko'rsatmalar ketma-ketligi bilan almashtirish mumkinmi.[2] Masalan, qiymatning 2 ga ko'paytirilishi yanada samarali bajarilishi mumkin chapga siljish qiymat yoki o'ziga qiymat qo'shish orqali (bu misol ham ning misoli quvvatni kamaytirish ).
Mahalliy optimallashtirish
Ular faqat mahalliy ma'lumotni a asosiy blok.[3] Asosiy bloklar boshqaruv oqimiga ega bo'lmaganligi sababli, ushbu optimallashtirish juda kam tahlilga, vaqtni tejashga va saqlash talablarini kamaytirishga muhtoj, ammo bu ham sakrashlar paytida hech qanday ma'lumot saqlanmasligini anglatadi.
Global optimallashtirish
Ular "intraprocedural metodlar" deb ham nomlanadi va butun funktsiyalar bo'yicha ishlaydi.[3] Bu ularga ishlash uchun ko'proq ma'lumot beradi, lekin ko'pincha qimmat hisoblarni zarur qiladi. Eng yomon holat bo'yicha taxminlar funktsiya chaqiruvlari sodir bo'lganda yoki global o'zgaruvchilarga kirish vaqtida amalga oshirilishi kerak, chunki ular haqida kam ma'lumot mavjud.
Davrni optimallashtirish
Ular tsiklni tashkil etuvchi bayonotlar bo'yicha ishlaydi, masalan uchun masalan, pastadir kodning o'zgarmas harakati. Davrni optimallashtirish sezilarli ta'sir ko'rsatishi mumkin, chunki ko'plab dasturlar o'zlarining ko'p vaqtlarini ko'chadan o'tkazadilar.[4]
Do'konni zamonaviy optimallashtirish
Ular do'kon operatsiyalarini, agar kontekstda ruxsat berilgandan ko'ra erta sodir bo'lishiga imkon beradi iplar va qulflar. Jarayon, topshiriq bo'yicha qanday qiymat saqlanishi kerakligini oldindan bilishning biron bir usuliga muhtoj. Ushbu yengillikning maqsadi kompilyatorni optimallashtirishga to'g'ri sinxronlashtirilgan dasturlarning semantikasini saqlaydigan kodlarni qayta tashkil etishning ayrim turlarini bajarishga imkon berishdir.[5]
Interprocedural, butun dastur yoki ulanish vaqtini optimallashtirish
Ular dasturning barcha kodlarini tahlil qiladi. Olingan ma'lumotlarning ko'proq miqdori optimallashtirish faqat mahalliy ma'lumotlarga ega bo'lgan vaqtga nisbatan, ya'ni bitta funktsiya doirasiga nisbatan samaraliroq bo'lishini anglatadi. Ushbu turdagi optimallashtirish yangi texnikani amalga oshirishga imkon berishi mumkin. Masalan, funktsiya ichkariga kiritish, bu erda funktsiyaga qo'ng'iroq funktsiya tanasining nusxasi bilan almashtiriladi.
Mashina kodini optimallashtirish va ob'ekt kodini optimallashtiruvchi
Bular bajariladigan mashina kodlari bajarilgandan so'ng dasturning bajariladigan vazifa tasvirini tahlil qiladi bog'langan. Cheklangan doirada qo'llanilishi mumkin bo'lgan ba'zi usullar, masalan, ko'rsatmalarning umumiy ketma-ketliklarini yig'ish orqali joyni tejashga imkon beradigan makro siqishni, butun bajariladigan vazifa tasviri tahlil qilish uchun mavjud bo'lganda samaraliroq bo'ladi.[6]

Kengaytirilgan optimallashtirishdan tashqari yana ikkita umumiy optimallashtirish toifalari mavjud:

Dasturlash tili - mustaqil va tilga bog'liq
Ko'pgina yuqori darajadagi tillar umumiy dasturlash konstruktsiyalari va abstraktlarini baham ko'rishadi: qaror (agar, almashtirish, ish), pastadir (for, while, takrorlang .. qadar, bajaring .. while) va inkapsulyatsiya (tuzilmalar, ob'ektlar). Shunday qilib, shunga o'xshash optimallashtirish usullaridan barcha tillarda foydalanish mumkin. Biroq, ba'zi bir til xususiyatlari ba'zi turdagi optimallashtirishlarni qiyinlashtiradi. Masalan, ko'rsatgichlarning mavjudligi C va C ++ qatorga kirishni optimallashtirishni qiyinlashtiradi (qarang taxalluslarni tahlil qilish ). Biroq, kabi tillar PL / 1 (shuningdek, ko'rsatgichlarni qo'llab-quvvatlaydi), shunga qaramay, turli xil usullar bilan yaxshiroq ishlashga erishish uchun mavjud bo'lgan optimallashtiruvchi kompilyatorlar mavjud. Aksincha, ba'zi til xususiyatlari ba'zi optimallashtirishni osonlashtiradi. Masalan, ba'zi tillarda funktsiyalarga ruxsat berilmagan yon effektlar. Shuning uchun, agar dastur bir xil argumentlar bilan bir xil funktsiyaga bir nechta qo'ng'iroqlarni amalga oshirsa, kompilyator darhol funktsiya natijasini faqat bir marta hisoblash kerakligini xulosa qilishi mumkin. Funktsiyalarning yon ta'sirga ega bo'lishiga ruxsat berilgan tillarda, boshqa strategiya mumkin. Optimizator qaysi funktsiyani nojo'ya ta'sirlarini aniqlay oladi va bunday optimallashtirishlarni yon ta'sirsiz funktsiyalar bilan cheklaydi. Ushbu optimallashtirish faqat optimallashtiruvchi chaqirilgan funktsiyaga ega bo'lganda mumkin bo'ladi.
Mashinadan mustaqil va mashinaga bog'liq
Abstrakt dasturlash kontseptsiyalarida ishlaydigan ko'plab optimallashtirishlar (ko'chadan, ob'ektlar, tuzilmalar) kompilyator tomonidan yo'naltirilgan mashinadan mustaqil, ammo eng samarali optimallashtirishlarning ko'plari maqsad platformaning maxsus xususiyatlaridan eng yaxshi foydalanadiganlardir. Masalan, bir vaqtning o'zida bir nechta ishlarni bajaradigan ko'rsatmalar, masalan, kamayish registri va agar nol bo'lmasa filial.

Quyida mahalliy mashinaga bog'liq optimallashtirishning bir misoli keltirilgan. O'rnatish uchun ro'yxatdan o'tish 0 ga, aniq usul - bu registr qiymatini doimiyga o'rnatadigan ko'rsatmada '0' sobitidan foydalanish. Kamroq ravshan usul XOR o'zi bilan ro'yxatga olish. Qaysi buyruq variantini ishlatishni bilish kompilyatorga bog'liq. Ko'pchilikda RISC mashinalari, ikkala ko'rsatma ham bir xil darajada mos keladi, chunki ikkalasi ham bir xil uzunlikda va bir xil vaqtni oladi. Boshqa ko'p narsalar bo'yicha mikroprotsessorlar kabi Intel x86 oilasi, XOR varianti qisqaroq va ehtimol tezroq ekan, chunki darhol operandni dekodlash va ichki "tezkor operand registri" dan foydalanish kerak bo'lmaydi. Buning yuzaga kelishi mumkin bo'lgan muammo shundaki, XOR ma'lumotlarning registrning avvalgi qiymatiga bog'liqligini keltirib chiqarishi mumkin quvur liniyasi tokcha Biroq, protsessorlar tez-tez to'xtashga olib kelmaydigan maxsus holat sifatida XOR registriga ega.

Optimallashtirishga ta'sir qiluvchi omillar

Mashinaning o'zi
Optimallashtirish mumkin bo'lgan va bajarilishi kerak bo'lgan ko'plab tanlovlar maqsadli mashinaning xususiyatlariga bog'liq. Ba'zan ushbu mashinaga bog'liq bo'lgan ba'zi omillarni parametrlash mumkin, shuning uchun kompilyator kodining bitta bo'lagi yordamida faqat mashinani tavsiflash parametrlarini o'zgartirish orqali turli xil mashinalarni optimallashtirish mumkin. GCC ushbu yondashuvni ko'rsatadigan kompilyator.
Maqsadli CPU arxitekturasi
Soni Markaziy protsessor registrlar: Ma'lum darajada registrlar qancha ko'p bo'lsa, ishlashni optimallashtirish osonroq bo'ladi. Mahalliy o'zgaruvchilar registrlarda ajratilishi mumkin va emas suyakka. Vaqtinchalik / oraliq natijalar registrda xotiraga yozmasdan va qayta o'qimasdan qoldirilishi mumkin.
  • RISC va boshqalar CISC: CISC buyruqlar to'plami ko'pincha o'zgaruvchan buyruq uzunliklariga ega, ko'pincha ishlatilishi mumkin bo'lgan ko'rsatmalarning ko'p soniga ega va har bir ko'rsatma har xil vaqtni talab qilishi mumkin. RISC buyruqlar to'plami bularning har biridagi o'zgaruvchanlikni cheklashga harakat qiladi: buyruqlar to'plamlari odatda doimiy uzunlik, istisnolardan tashqari, odatda registrlar va xotira operatsiyalari kombinatsiyasi kamroq bo'ladi va buyruq chiqarish darajasi (vaqt oralig'ida bajarilgan ko'rsatmalar soni, odatda soat tsiklining butun soniga ko'paytmasi) odatda xotira kechikishi omil bo'lmagan hollarda doimiy bo'ladi. Muayyan vazifani bajarishning bir necha yo'li bo'lishi mumkin, odatda CISC RISCga qaraganda ko'proq alternativalarni taklif qiladi. Tuzuvchilar har xil ko'rsatmalar orasida nisbiy xarajatlarni bilishlari va eng yaxshi ko'rsatmalar ketma-ketligini tanlashlari kerak (qarang ko'rsatmalarni tanlash ).
  • Quvurlar quvurlari: Quvur liniyasi aslida CPU ga bo'linadi yig'ish liniyasi. Bu ko'rsatmalarning bajarilishini turli bosqichlarga ajratish orqali protsessorning qismlarini turli xil ko'rsatmalar uchun ishlatishga imkon beradi: buyruqlarni dekodlash, manzilni dekodlash, xotirani olish, registrni olish, hisoblash, ro'yxatdan o'tish do'koni va hk. Bir buyruq registr do'konining bosqichida bo'lishi mumkin. , boshqasi esa ro'yxatdan o'tish bosqichida bo'lishi mumkin. Quvur liniyasi mojarosi quvurning bir bosqichidagi ko'rsatma uning oldidagi boshqa yo'riqnomaning natijasiga bog'liq bo'lsa, lekin hali tugallanmagan holda yuzaga keladi. Quvur quvurlari ziddiyatlariga olib kelishi mumkin quvur liniyasi rastalari: bu erda protsessor ziddiyatni hal qilishni kutayotgan tsikllarni bekor qiladi.
Tuzuvchilar mumkin jadvalyoki ko'rsatmalarning tartibini o'zgartiring, shunda quvurlar to'xtash joylari kamroq bo'ladi.
  • Funktsional birliklar soni: Ba'zi protsessorlarda bir nechta mavjud ALUlar va FPUlar. Bu ularga bir vaqtning o'zida bir nechta ko'rsatmalarni bajarishga imkon beradi. Ko'rsatmalar qaysi boshqa ko'rsatmalar bilan juftlashishi mumkinligi ("juftlashtirish" bir vaqtning o'zida ikki yoki undan ortiq ko'rsatmalarni bajarish) va qaysi buyruqni qaysi funktsional birlik bajarishi mumkinligi to'g'risida cheklovlar bo'lishi mumkin. Ularda quvurlar ziddiyatlariga o'xshash muammolar ham mavjud.
Bu erda yana ko'rsatmalar rejalashtirilgan bo'lishi kerak, shunda turli xil funktsional birliklar bajarish bo'yicha ko'rsatmalar bilan to'liq ta'minlanadi.
Mashinaning arxitekturasi
  • Kesh hajmi (256 kiB-12 MiB) va turi (to'g'ridan-to'g'ri xaritalangan, 2- / 4- / 8- / 16-tomonlama assotsiativ, to'liq assotsiativ): kabi usullar ichki kengayish va tsiklni echish yaratilgan kod hajmini oshirishi va kodning joylashishini kamaytirishi mumkin. Agar kodning yuqori darajada ishlatilgan qismi (masalan, turli algoritmlardagi ichki ko'chadanlar) to'satdan keshga sig'sa, dastur sekinlashishi mumkin. Bundan tashqari, to'liq assotsiatsiyalanmagan keshlar, hatto to'ldirilmagan keshda ham kesh to'qnashuvi ehtimoli yuqori.
  • Kesh / xotirani uzatish tezligi: Bular kompilyatorga keshni o'tkazib yubormaganlik uchun jarima belgisini beradi. Bu asosan ixtisoslashgan dasturlarda qo'llaniladi.
Yaratilgan koddan maqsadli foydalanish
Nosozliklarni tuzatish
Ilovani yozish paytida dasturchi tez-tez kompilyatsiya qiladi va sinovdan o'tkazadi, shuning uchun kompilyatsiya tez bo'lishi kerak. Sinov / disk raskadrovka bosqichida optimallashtirishning ataylab oldini olishning bir sababi shu. Bundan tashqari, dastur kodi odatda "qadam bosiladi" (qarang Dastur animatsiyasi ) yordamida ramziy tuzatuvchi va transformatsiyalarni optimallashtirish, ayniqsa kodni qayta tartiblashtiradigan narsa, chiqish kodini asl manba kodidagi satr raqamlari bilan bog'lashni qiyinlashtirishi mumkin. Bu disk raskadrovka vositalarini ham, ulardan foydalanadigan dasturchilarni ham chalkashtirib yuborishi mumkin.
Umumiy maqsadda foydalanish
Oldindan qadoqlangan dasturiy ta'minot ko'pincha bir xil ko'rsatmalar to'plamiga ega bo'lishi mumkin bo'lgan, ammo har xil vaqt, kesh yoki xotira xususiyatlariga ega bo'lgan turli xil mashinalar va protsessorlarda bajarilishi kutilmoqda. Natijada, kod biron bir maxsus protsessorga o'rnatilmasligi yoki eng mashhur protsessorda eng yaxshi ishlashi uchun sozlangan bo'lishi mumkin va shu bilan birga boshqa protsessorlarda ham yaxshi ishlaydi.
Maxsus maqsadlarda foydalanish
Agar dasturiy ta'minot ma'lum xususiyatlarga ega bo'lgan bir yoki bir nechta o'xshash mashinalarda ishlatilishi uchun tuzilgan bo'lsa, unda kompilyator, agar bunday imkoniyatlar mavjud bo'lsa, yaratilgan kodni ushbu mashinalarga qattiq moslashtirishi mumkin. Muhim maxsus holatlar uchun mo'ljallangan kodni o'z ichiga oladi parallel va vektorli protsessorlar, buning uchun maxsus parallellashtiruvchi kompilyatorlar ish bilan ta'minlangan.
O'rnatilgan tizimlar
Bu maxsus maqsadlarda foydalanishning odatiy hodisasidir. O'rnatilgan dastur aniq CPU va xotira hajmiga moslashtirilishi mumkin. Tizim narxi yoki ishonchliligi kod tezligidan ko'ra muhimroq bo'lishi mumkin. Masalan, o'rnatilgan dasturiy ta'minot uchun kompilyatorlar odatda tezlik hisobiga kod hajmini kamaytiradigan variantlarni taklif qilishadi, chunki xotira o'rnatilgan kompyuterning asosiy xarajati hisoblanadi. Kodni vaqtini iloji boricha tezroq emas, balki oldindan aytib berish kerak bo'lishi mumkin, shuning uchun kodni keshlash va uni talab qiladigan kompilyator optimallashtirish o'chirib qo'yilishi mumkin.

Umumiy mavzular

Ko'p jihatdan kompilyatorni optimallashtirish texnikasi quyidagi mavzularga ega, ular ba'zan ziddiyatli bo'ladi.

Umumiy ishni optimallashtirish
Umumiy holat a ga imkon beradigan noyob xususiyatlarga ega bo'lishi mumkin tez yo'l hisobiga a sekin yo'l. Agar tezkor yo'l tez-tez amalga oshirilsa, natijada umumiy ishlash yaxshi bo'ladi.
Ishdan bo'shashdan saqlaning
Hisoblangan natijalarni qayta ishlating va ularni qayta hisoblash o'rniga ularni keyinchalik ishlatish uchun saqlang.
Kamroq kod
Keraksiz hisob-kitoblarni va oraliq qiymatlarni olib tashlang. CPU, kesh va xotira uchun kamroq ishlash odatda tezroq bajarilishiga olib keladi. Shu bilan bir qatorda, ichida o'rnatilgan tizimlar, kamroq kod mahsulot narxini pasayishiga olib keladi.
Foydalanish bilan kamroq sakrash to'g'ri chiziq kodideb nomlangan filialsiz kod
Kamroq murakkab kod. Sakrash (shartli yoki shartsiz filiallar ) ko'rsatmalarni oldindan yuklashga xalaqit beradi, shu bilan kod sekinlashadi. Inline yoki pastadirni ochish yordamida o'sish o'sishi hisobiga dallanish kamayishi mumkin ikkilik fayl takrorlangan kod uzunligi bo'yicha hajmi. Bu bir nechtasini birlashtirishga intiladi asosiy bloklar biriga.
Joylashuv
Vaqt o'tishi bilan bir-biriga yaqin bo'lgan kod va ma'lumotlar fazoviy hajmni oshirish uchun xotirada bir-biriga yaqin joylashtirilishi kerak ma'lumotlarning joylashuvi.
Xotira iyerarxiyasidan foydalaning
Har bir daraja uchun xotiraga kirish tobora qimmatlashmoqda xotira iyerarxiyasi, shuning uchun diskka borishdan oldin eng ko'p ishlatiladigan elementlarni avval registrlarga, so'ngra keshlarni, so'ngra asosiy xotirani joylashtiring.
Paralleliz qilish
Ko'rsatmalarda, xotirada yoki ish zarrachalari darajasida bir nechta hisoblashlarning parallel ravishda amalga oshirilishiga imkon beradigan operatsiyalarni qayta tartiblang.
Aniqroq ma'lumot yaxshiroqdir
Kompilyator qanchalik aniq ma'lumotga ega bo'lsa, u ushbu optimallashtirish usullaridan yoki barchasidan yaxshiroq foydalanishi mumkin.
Ish vaqti ko'rsatkichlari yordam berishi mumkin
Sinov paytida to'plangan ma'lumotlardan foydalanish mumkin profil tomonidan boshqariladigan optimallashtirish. Ma'lumotlar ish vaqtida, ideal holda minimal darajada to'plangan tepada, a tomonidan ishlatilishi mumkin JIT optimallashtirishni dinamik ravishda takomillashtirish uchun kompilyator.
Kuchni kamaytirish
Murakkab yoki qiyin yoki qimmat operatsiyalarni oddiylari bilan almashtiring. Masalan, bo'linishni konstantaga almashtirish bilan o'zaro ko'paytish bilan yoki foydalanib induktsiya o'zgaruvchan tahlili ko'paytirishni qo'shimchalar bilan pastadir indeksiga almashtirish.

Maxsus texnikalar

Davrni optimallashtirish

Avvalo ko'chadan ishlashga mo'ljallangan ba'zi bir optimallashtirish texnikasiga quyidagilar kiradi:

Induksion o'zgaruvchan tahlil
Taxminan, agar tsikldagi o'zgaruvchi indeks o'zgaruvchisining oddiy chiziqli funktsiyasi bo'lsa, masalan j: = 4 * i + 1, tsikl o'zgaruvchisi har o'zgartirilganda uni mos ravishda yangilash mumkin. Bu quvvatni kamaytirish, shuningdek indeks o'zgaruvchisining ta'riflarini berishga imkon berishi mumkin o'lik kod.[7] Ushbu ma'lumot shuningdek foydalidir chegaralarni tekshirish va qaramlik tahlili, boshqa narsalar qatorida.
Loop bo'linishi yoki pastadir taqsimoti
Loop bo'linishi bir xil indeks oralig'ida bir nechta tsikllarga tsiklni buzishga urinadi, lekin ularning har biri loop tanasining faqat bir qismini oladi. Bu yaxshilanishi mumkin ma'lumotlarning joylashuvi, tsikldagi ikkala ma'lumot va loop tanasidagi kod.
Loop termoyadroviy yoki pastadirni birlashtiruvchi yoki pastadirli ramming yoki pastadirli tiqilish
Pastki yukni kamaytirishga urinishning yana bir usuli. Ikkita qo'shni ko'chadan, bu raqam kompilyatsiya vaqtida ma'lum bo'lishidan qat'iy nazar bir xil marta takrorlanadigan bo'lsa, ularning tanalari bir-birlarining ma'lumotlariga ishora qilmaguncha birlashtirilishi mumkin.
Loop inversiyasi
Ushbu texnik standartni o'zgartiradi esa ga aylantiring do / while (shuningdek, nomi bilan tanilgan takrorlang / qadar) halqa bilan o'ralgan agar shartli, sakrash sonini ikkitaga qisqartirish, tsikl bajarilgan holatlar uchun. Buni amalga oshirish shartni tekshirishni takrorlaydi (kod hajmini oshirish), lekin samaraliroq, chunki sakrashlar odatda quvur trubkasi. Bundan tashqari, agar dastlabki shart kompilyatsiya vaqtida ma'lum bo'lsa va ma'lum bo'lsa yon ta'sir - bepul agar qo'riqchi o'tkazib yuborilishi mumkin.
O'zaro almashinuv
Ushbu optimallashtirish ichki halqalarni tashqi halqalar bilan almashtiradi. Agar tsikl o'zgaruvchilari qatorga kiritilsa, bunday o'zgartirish massivning joylashishiga qarab mos yozuvlar manzilini yaxshilashi mumkin.
Kodning o'zgarmas harakati
Agar har bir takrorlash paytida biron bir miqdordagi tsikl ichida hisoblangan bo'lsa va uning qiymati har bir takrorlash uchun bir xil bo'lsa, uni tsikldan tashqariga ko'tarish va uning qiymatini tsikl boshlanishidan bir marta oldin hisoblash uchun samaradorlikni sezilarli darajada oshirishi mumkin.[4] Bu, ayniqsa, massivlar bo'ylab ko'chadan hosil bo'lgan manzilni hisoblash ifodalari bilan juda muhimdir. To'g'ri amalga oshirish uchun ushbu texnikadan foydalanish kerak pastadir inversiyasi, chunki hamma kodlar ko'chadan tashqarida ko'tarilishi xavfsiz emas.
Uyadan uyani optimallashtirish
Matritsani ko'paytirish kabi ba'zi bir keng tarqalgan algoritmlar juda yomon kesh xatti-harakatlariga va ortiqcha xotiraga kirish imkoniyatlariga ega. Loop nest optimallashtirish operatsiyani kichik bloklar orqali bajarish va pastadir almashinuvi yordamida kesh urish sonini ko'paytiradi.
Loopni almashtirish
Loop reversal indeks o'zgaruvchisiga qiymatlarni berish tartibini o'zgartiradi. Bu yo'q qilishga yordam beradigan nozik optimallashtirish bog'liqliklar va shu bilan boshqa optimallashtirishga imkon beradi. Bundan tashqari, ba'zi arxitekturalarda tsiklning teskari o'zgarishi kichikroq kodga yordam beradi, chunki pastadir indeksini kamaytirganda, ishlaydigan dasturning tsikldan chiqishi uchun bajarilishi kerak bo'lgan shart nol bilan taqqoslashdir. Bu raqam bilan taqqoslashdan farqli o'laroq, ko'pincha parametrsiz, maxsus ko'rsatma bo'lib, solishtirish uchun raqam kerak. Shuning uchun, parametrni saqlash uchun zarur bo'lgan bayt miqdori tsiklni almashtirish yordamida saqlanadi. Bundan tashqari, agar taqqoslash raqami platformaning so'zidan kattaroq bo'lsa, standart tsikl tartibida, taqqoslashni baholash uchun bir nechta ko'rsatmalarni bajarish kerak bo'ladi, bu esa tsiklni qaytarish bilan bog'liq emas.
Loopni echish
Ro'yxatdan o'tish tsiklning tanasini bir necha marta takrorlaydi, bu esa pastadir holatini sinash va otish sonini kamaytirish uchun buyruq liniyasini buzgan holda ishlashga zarar etkazadi. "Kamroq sakrash" optimallashtirish. To'liq tsiklni bekor qilish barcha ortiqcha yuklarni yo'q qiladi, ammo takrorlashlar soni kompilyatsiya vaqtida ma'lum bo'lishini talab qiladi.
Loop bo'linishi
Loopni ajratish tsiklni soddalashtirishga yoki bog'liqlikni yo'q qilishga urinib, uni bir xil tanaga ega bo'lgan, lekin indeks oralig'ining har xil qo'shni qismlarida takrorlanadigan bir nechta ko'chadan ajratadi. Foydali maxsus holat pastadirni tozalash, bu muammoni birinchi takrorlash bilan pastadirni soddalashtirishi mumkin, bu loopni kiritmasdan oldin ushbu takrorlashni alohida bajaring.
Loopni o'chirish
O'chirmaslik, shartli qismning if va else bandlarining har birida tsiklning tanasini nusxalash orqali shartli ko'chadan ichkaridan tsikldan tashqariga o'tadi.
Dasturiy ta'minot tarmog'i
Loop shunday tuzilganki, takrorlanishda bajarilgan ish bir necha qismlarga bo'linib, bir necha takrorlashlar orqali bajariladi. Qattiq siklda ushbu usul qiymatlarni yuklash va ulardan foydalanish orasidagi kechikishni yashiradi.
Avtomatik parallellashtirish
Birgalikda bir nechta protsessorlardan, shu jumladan ko'p yadroli mashinalardan foydalangan holda, bir nechta protsessorlardan foydalanish uchun tsikl ko'p tishli yoki vektorlangan (yoki ikkalasi ham) kodga aylantiriladi.

Ma'lumotlar oqimini optimallashtirish

Ma'lumotlar oqimi asosida optimallashtirish ma'lumotlar oqimini tahlil qilish, birinchi navbatda ma'lumotlarning ba'zi xususiyatlarini boshqarish chekkalari bilan qanday tarqalishiga bog'liq boshqaruv oqimi grafigi. Ulardan ba'zilari quyidagilarni o'z ichiga oladi:

Keng tarqalgan subekspressiyani yo'q qilish
Ifoda (a + b) - (a + b) / 4, "umumiy subekspressiya" takrorlanishga ishora qiladi (a + b). Ushbu texnikani amalga oshiradigan kompilyatorlar buni tushunishadi (a + b) o'zgarmaydi va shuning uchun uning qiymatini faqat bir marta hisoblang.[8]
Doimiy katlama va tarqalish[9]
doimiylardan iborat iboralarni almashtirish (masalan, 3 + 5) ularning yakuniy qiymati bilan (8) hisoblash vaqtida ishlashni emas, balki kompilyatsiya vaqtida. Ko'pgina zamonaviy tillarda ishlatiladi.
Induksion o'zgaruvchini tanib olish va yo'q qilish
haqida yuqoridagi muhokamani ko'ring induktsiya o'zgaruvchan tahlili.
Taxalluslarni tasnifi va ko'rsatgichlarni tahlil qilish
huzurida ko'rsatgichlar, umuman optimallashtirishni amalga oshirish qiyin, chunki xotira joylashuvi tayinlanganda har qanday o'zgaruvchini o'zgartirish mumkin. Qaysi ko'rsatgichlar qaysi o'zgaruvchini taxallus qilishi mumkinligini ko'rsatib, o'zaro bog'liq bo'lmagan ko'rsatkichlarni e'tiborsiz qoldirish mumkin.
O'lik do'kon yo'q qilish
o'zgaruvchining ishlash muddati tugashi sababli yoki birinchi qiymatning ustiga yozib qo'yiladigan keyingi topshiriq tufayli keyinchalik o'qib bo'lmaydigan o'zgaruvchilarga topshiriqlarni olib tashlash.

SSA asosida optimallashtirish

Ushbu optimallashtirish dasturni maxsus shaklga aylantirgandan so'ng amalga oshirishga mo'ljallangan Statik bitta topshiriq, unda har bir o'zgaruvchi faqat bitta joyda tayinlanadi. SSA holda ba'zi funktsiyalar mavjud bo'lsa-da, ular SSA bilan eng samarali hisoblanadi. Boshqa bo'limlarda keltirilgan ko'plab optimallashtirishlar, shuningdek, registrlarni taqsimlash kabi maxsus o'zgarishlarsiz foyda ko'radi.

Global qiymatlarni raqamlash
GVN a ni tuzish orqali ortiqcha narsani yo'q qiladi qiymat grafigi dasturning qiymati, so'ngra qaysi qiymatlar teng ifodalar bilan hisoblanganligini aniqlash. GVN ba'zi ortiqcha narsalarni aniqlay oladi umumiy subekspressiyani yo'q qilish qila olmaydi va aksincha.
Kamdan-kam shartli doimiy tarqalish
Doimiy tarqalishni birlashtiradi, doimiy katlama va o'lik kodni yo'q qilish va ularni alohida ishlatish orqali mumkin bo'lgan narsalarni yaxshilaydi.[10][11] Ushbu optimallashtirish ramziy ma'noda dasturni bajaradi, bir vaqtning o'zida doimiy qiymatlarni tarqatadi va qismlarini yo'q qiladi boshqaruv oqimi grafigi bu erishib bo'lmaydigan qiladi.

Kod generatorini optimallashtirish

Ro'yxatdan ajratish
Eng tez-tez ishlatiladigan o'zgaruvchilar eng tez kirish uchun protsessor registrlarida saqlanishi kerak. Qaysi o'zgaruvchilarni registrlarga qo'yish kerakligini aniqlash uchun interferentsiya-grafigi tuziladi. Har bir o'zgaruvchi vertex bo'lib, ikkita o'zgaruvchidan bir vaqtning o'zida foydalanilganda (kesishgan jigarrangga ega) ular orasida chekka bo'ladi. Ushbu grafik, masalan, rang bilan bo'yalgan Chaitin algoritmi registrlar mavjud bo'lgan bir xil ranglardan foydalanish. Agar rang berish muvaffaqiyatsiz tugasa, bitta o'zgaruvchi xotiraga "to'kiladi" va rang qayta bajariladi.
Ko'rsatmani tanlash
Ko'pgina arxitekturalar, xususan CISC me'morchilik va ko'pchiligiga ega bo'lganlar manzillar rejimlari, ko'rsatmalarning mutlaqo boshqa ketma-ketliklari yordamida ma'lum bir operatsiyani bajarishning bir necha xil usullarini taklif eting. Ko'rsatmalar tanlovchisining vazifasi past darajadagi qaysi operatorlarni amalga oshirishni tanlashda umuman yaxshi ishlashdir oraliq vakillik bilan. Masalan, ko'plab protsessorlarda 68000 oila va x86 arxitekturasida murakkab adreslash rejimlari "lea 25 (a1, d5 * 4), a0" kabi iboralarda ishlatilishi mumkin, bu esa bitta buyruqqa juda kam miqdordagi arifmetikani bajarishga imkon beradi.
Ko'rsatmalarni rejalashtirish
Ko'rsatmalar jadvali zamonaviy seminalikni saqlab qolish uchun ehtiyotkorlik bilan, bir-biriga bog'liqliksiz ko'rsatmalarni klasterlash orqali quvur liniyasidagi to'xtash yoki pufakchalardan qochadigan zamonaviy quvurli protsessorlar uchun muhim optimallashtirishdir.
Qayta materiallashtirish
Qayta moddiylashtirish, xotiradan yuklash o'rniga qiymatni qayta hisoblab chiqadi va xotiraga kirishni taqiqlaydi. Bu to'kilmaslik uchun registrni taqsimlash bilan birgalikda amalga oshiriladi.
Kod faktoring
Agar bir nechta kodlar ketma-ketligi bir xil bo'lsa yoki parametrlanishi yoki bir xil bo'lishi uchun qayta tartiblanishi mumkin bo'lsa, ular umumiy dasturga qo'ng'iroqlar bilan almashtirilishi mumkin. Bu ko'pincha subroutine-ni o'rnatish va ba'zan quyruq-rekursiya uchun kodni baham ko'rishi mumkin.[12]
Tramplinlar (Tramplin (hisoblash) )
Ko'pchilik[iqtibos kerak ] Protsessorlarda past xotiraga kirish uchun kichikroq dastur chaqiruv ko'rsatmalari mavjud. Ushbu kichik qo'ng'iroqlarni kodning asosiy qismida ishlatib, kompilyator joyni tejashga qodir. Kam xotirada sakrash ko'rsatmalari istalgan manzilda tartib-qoidalarga kirishlari mumkin. Bu kod faktoringidan bo'shliqni tejashni ko'paytiradi.[12]
Hisob-kitoblarni qayta tartiblash
Asoslangan butun sonli chiziqli dasturlash, tarkibiy tuzilmalarni qayta tuzish ma'lumotlar joylashishini yaxshilaydi va hisoblashlarni qayta tartiblash orqali ko'proq parallellikni keltirib chiqaradi. Kosmosni optimallashtiruvchi kompilyatorlar subroutines-ga kiritilishi mumkin bo'lgan ketma-ketlikni uzaytirish uchun kodni qayta tartiblashi mumkin.

Tilni funktsional optimallashtirish

Garchi ularning aksariyati funktsional bo'lmagan tillarga tegishli bo'lsa ham, ular kelib chiqishi yoki juda muhim funktsional tillar kabi Lisp va ML.

Quyruq qo'ng'irog'ini optimallashtirish
Funktsiya chaqirig'i stak maydonini sarf qiladi va parametrlarni uzatish va ko'rsatmalar keshini yuvish bilan bog'liq ba'zi qo'shimcha xarajatlarni o'z ichiga oladi. Quyruq rekursiv algoritmlari aylantirilishi mumkin takrorlash quyruq rekursionini yo'q qilish yoki quyruq chaqiruvini optimallashtirish deb nomlangan jarayon orqali.
O'rmonlarni yo'q qilish (ma'lumotlar tuzilishi termoyadroviy)
O'zgarishlar ketma-ketligi ro'yxatiga tatbiq etilishi odatiy bo'lgan tillarda o'rmonlarni yo'q qilish oraliq ma'lumotlar tuzilmalari qurilishini olib tashlashga harakat qiladi.
Qisman baholash

Boshqa optimallashtirish

Chegaralarni tekshirish
Kabi ko'plab tillar Java, majburlash chegaralarni tekshirish barcha qatorlarga kirish. Bu jiddiy ko'rsatkich torlik ilmiy kod kabi ba'zi ilovalarda. Chegaralarni tekshirishni yo'q qilish kompilyatorga indeksning amaldagi chegaralarga to'g'ri kelishi kerakligini aniqlaydigan ko'p holatlarda chegaralarni tekshirishni xavfsiz olib tashlashga imkon beradi; masalan, agar bu oddiy tsikl o'zgaruvchisi bo'lsa.
Filialni ofset optimallashtirish (mashinaga bog'liq)
Maqsadga etgan eng qisqa filial siljishini tanlang
Kod bloklarini qayta tartiblash
Kod bloklarini qayta tartiblash asosiy tartibini o'zgartiradi bloklar dasturda shartli filiallarni qisqartirish va ma'lumot olish joyini yaxshilash uchun.
O'lik kodni yo'q qilish
Dastur xatti-harakatiga ta'sir qilmaydigan ko'rsatmalarni olib tashlaydi, masalan, hech qanday foydasi yo'q chaqirilgan ta'riflar o'lik kod. Bu kod hajmini pasaytiradi va keraksiz hisoblashni yo'q qiladi.
O'zgarmaslardan faktoring (loop invariantlari )
Agar ifoda shart bajarilganda ham bajarilmasa ham bajarilmasa, uni shartli gapdan tashqarida bir marta yozish mumkin. Xuddi shunday, agar tsikl ichida ba'zi bir iboralar turlari (masalan, o'zgaruvchiga o'zgaruvchiga tayinlash) paydo bo'lsa, ularni undan ko'chirish mumkin, chunki ular bir necha marta yoki bir marta bajarilgan bo'lishidan qat'iy nazar ularning ta'siri bir xil bo'ladi. . To'liq qisqartirishni yo'q qilish deb ham ataladi. Keyinchalik kuchli optimallashtirish qisman qisqartirishni yo'q qilish (PRE).
Ichki kengayish yoki so'l kengayish
Ba'zi kodlar a ni chaqirganda protsedura, protsedura tanasini qo'ng'iroq kodi ichiga to'g'ridan-to'g'ri kiritish mumkin, unga boshqaruvni uzatishni emas. Bu protsedura qo'ng'iroqlari bilan bog'liq qo'shimcha xarajatlarni tejash bilan bir qatorda juda ko'p parametrlarga xos optimallashtirish uchun katta imkoniyat yaratadi, lekin bo'sh joy narxiga to'g'ri keladi; protsedura har safar inline deb nomlanganida protsedura tanasi takrorlanadi. Odatda, inline ishlash uchun muhim kodda foydalidir, bu kichik protseduralarga ko'plab qo'ng'iroqlarni amalga oshiradi. "Kamroq sakrash" optimallashtirish. The bayonotlar ning majburiy dasturlash tillar ham bunday optimallashtirishning namunasidir. Garchi bayonotlar bilan amalga oshirilishi mumkin bo'lsa-da funktsiya qo'ng'iroqlari ular deyarli har doim kod bilan chizilgan holda amalga oshiriladi.
Iplarni sakrash
Ushbu pasda xuddi shu shartga to'liq yoki qisman mo'ljallangan ketma-ket shartli sakrashlar birlashtiriladi.
Masalan, agar (v) { foo; } agar (v) { bar; } ga agar (v) { foo; bar; },
va agar (v) { foo; } agar (!v) { bar; } ga agar (v) { foo; } boshqa { bar; }.
Ibratli siqishni
Kodning umumiy ketma-ketliklarini taniy oladigan, umumiy kodni o'z ichiga olgan kichik dasturlarni ("kod makroslari") yaratadigan va umumiy kodlar ketma-ketliklarining paydo bo'lishini tegishli pastki dasturlarga qo'ng'iroqlar bilan almashtiradigan kosmik optimallashtirish.[6] Barcha kodlar mavjud bo'lganda, bu mashina kodini optimallashtirish sifatida eng samarali tarzda amalga oshiriladi. Texnika birinchi navbatda amalga oshirishda foydalanilgan izohlovchi bayt oqimida joyni tejash uchun ishlatilgan Ibratli Spitbol mikrokompyuterlarda.[13] Berilgan kod segmenti uchun zarur bo'lgan maydonni minimallashtiradigan maqbul makroslar to'plamini aniqlash muammosi ma'lum To'liq emas,[6] ammo samarali evristika deyarli optimal natijalarga erishadi.[14]
Kesh to'qnashuvini kamaytirish
(masalan, sahifadagi hizalanishni buzgan holda)
Stak balandligini kamaytirish
Ifodalarni baholash uchun zarur bo'lgan resurslarni minimallashtirish uchun ifoda daraxtini qayta o'rnating.
Sinovni qayta tartiblash
Agar bizda biron bir narsaning sharti bo'lgan ikkita test mavjud bo'lsa, biz avval oddiyroq testlar bilan shug'ullanishimiz mumkin (masalan, o'zgaruvchini biror narsa bilan taqqoslash) va shundan keyingina murakkab testlar bilan (masalan, funktsiyani chaqirishni talab qiladigan). Ushbu texnikani to'ldiradi dangasa baholash, lekin faqat testlar bir-biriga bog'liq bo'lmagan hollarda foydalanish mumkin. Qisqa tutashuv semantikasi buni qiyinlashtirishi mumkin.

Protseduralararo optimallashtirish

Jarayonlararo optimallashtirish butun dasturda, protsedura va fayl chegaralarida ishlaydi. Mahalliy va global qism bilan hamkorlikda olib boriladigan intraprotsessurli hamkasblar bilan qattiq ishlaydi. Odatda protseduralararo optimallashtirish quyidagilar: protsedura ichkariga kiritish, protseduralararo o'lik kodni yo'q qilish, protseduralararo doimiy tarqalish va protsedurani qayta tartiblash. Odatdagidek, kompilyator haqiqiy optimallashtirishdan oldin protseduralararo tahlilni o'tkazishi kerak. Jarayonlararo tahlillar taxalluslar tahlilini, qatorga kirish tahlili va qurilish a chaqiruv grafigi.

Jarayonlararo optimallashtirish zamonaviy tijorat kompilyatorlarida keng tarqalgan SGI, Intel, Microsoft va Quyosh mikrosistemalari. Uzoq vaqt davomida ochiq manba GCC tanqid qilindi[iqtibos kerak ] kuchli protseduralararo tahlil va optimallashtirishning etishmasligi uchun, hozirda bu yaxshilanmoqda.[iqtibos kerak ] To'liq tahlil va optimallashtirish infratuzilmasiga ega bo'lgan yana bir ochiq manbali kompilyator Open64.

Protseduraviy tahlil talab qiladigan qo'shimcha vaqt va bo'sh joy tufayli ko'pchilik kompilyatorlar buni sukut bo'yicha bajarmaydilar. Foydalanuvchilar kompilyatorga protseduralararo tahlilni va boshqa qimmat optimallashtirishni yoqish uchun aytish uchun aniq qilib kompilyator variantlaridan foydalanishi kerak.

Amaliy fikrlar

Kompilyator amalga oshirishi mumkin bo'lgan juda ko'p optimallashtirishlar bo'lishi mumkin, bu kompilyatsiya uchun oz vaqtni talab qiladigan sodda va sodda bo'lganlardan tortib, kompilyatsiya vaqtining katta miqdorini o'z ichiga olgan aniq va murakkabgacha.[15] Shunga ko'ra, kompilyatorlar tez-tez o'zlarining boshqaruv buyrug'i yoki protseduralari uchun kompilyator foydalanuvchisiga qancha optimallashtirishni so'rashni tanlashiga imkon beradigan variantlarni taqdim etishadi; Masalan, IBM FORTRAN H kompilyatori foydalanuvchiga optimallashtirishni, faqat registrlar darajasida optimallashtirishni yoki to'liq optimallashtirishni belgilashga imkon berdi.[16] 2000-yillarga kelib, kompilyatorlar uchun odatiy bo'lgan Jiringlash, tanish bo'lganidan boshlab turli xil optimallashtirish tanlovlariga ta'sir qilishi mumkin bo'lgan bir qator kompilyator buyrug'i variantlariga ega bo'lish -O2 almashtirish.[17]

Optimallashtirishni izolyatsiyalashga yondashuv deb atalmish usuldan foydalanish hisoblanadi pass-post optimizatorlari (1970-yillarning oxiridagi asosiy dasturiy ta'minotga tegishli bo'lgan ba'zi tijorat versiyalari).[18] Ushbu vositalar optimallashtiruvchi kompilyator tomonidan bajariladigan natijani oladi va uni yanada optimallashtiradi. Post-pass optimizatorlari odatda assambleya tili yoki mashina kodi daraja (dasturlarning oraliq ko'rinishini optimallashtiradigan kompilyatorlardan farqli o'laroq). Bunday misollardan biri Portativ C kompilyatori (pcc) 1980-yilgi, ishlab chiqarilgan montaj kodida post-optimallashtirishni amalga oshiradigan ixtiyoriy o'tish.[19]

Yana bir e'tiborga loyiq narsa shundaki, optimallashtirish algoritmlari murakkab va ayniqsa, katta, murakkab dasturlash tillarini kompilyatsiya qilishda foydalanilganda, tuzilgan kodda xatolarni keltirib chiqaradigan yoki kompilyatsiya paytida ichki xatolarni keltirib chiqaradigan xatolarni o'z ichiga olishi mumkin. Har qanday turdagi kompilyator xatolari foydalanuvchini bezovta qilishi mumkin, lekin ayniqsa, bu holda, chunki optimallashtirish mantig'ining xatosi aniq bo'lmasligi mumkin.[20] Ichki xatolar yuz berganda, muammoni kompilyatorda optimallashtirish mantig'i kodlanganligi, ogohlantirish xabari berilganligi va qolgan qismi kompilyatsiya qilingan "xavfsiz" dasturlash texnikasi bilan qisman yaxshilanishi mumkin. muvaffaqiyatli yakunlashga qadar davom etadi.[21]

Tarix

1960-yillarning dastlabki kompilyatorlari ko'pincha kodni to'g'ri yoki samarali ravishda kompilyatsiya qilish bilan shug'ullanar edilar, chunki kompilyatsiya vaqtlari katta tashvish tug'dirdi. Erta optimallashtiruvchi kompilyatorlardan biri 1960 yillarning oxiridagi IBM FORTRAN H kompilyatori edi.[16] Bir nechta ilg'or texnikaga asos solgan eng qadimgi va muhim optimallashtiruvchi kompilyatorlardan yana biri shu uchun edi BLISS (1970) da tasvirlangan Optimallashtiruvchi kompilyatorning dizayni (1975).[22] 1980-yillarning oxiriga kelib kompilyatorlarni optimallashtirish etarli darajada samarali bo'lib, assambleya tilida dasturlash pasayib ketdi. Bu RISC chiplari va yo'riqnomalarni rejalashtirish va spekulyativ ijro etish kabi rivojlangan protsessor xususiyatlarini ishlab chiqish bilan birgalikda rivojlandi, ular inson tomonidan yozilgan yig'ilish kodi bilan emas, balki kompilyatorlarni optimallashtirish orqali ishlab chiqilgan.[iqtibos kerak ]

Statik kod tahlillari ro'yxati

Shuningdek qarang

Adabiyotlar

  1. ^ Aho, Alfred V.; Seti, Ravi; Ullman, Jeffri D. (1986). Tuzuvchilar: printsiplar, usullar va vositalar. Reading, Massachusets: Addison-Uesli. p. 585. ISBN  0-201-10088-6.
  2. ^ Aho, Seti va Ullman, Tuzuvchilar, p. 554.
  3. ^ a b Kuper, Keyt D.; Torczon, Linda (2003) [2002-01-01]. Tuzuvchi muhandisligi. Morgan Kaufmann. 404, 407 betlar. ISBN  978-1-55860-698-2.
  4. ^ a b Aho, Seti va Ullman, Tuzuvchilar, p. 596.
  5. ^ "MSDN - Presentient Store Actions". Microsoft. Olingan 2014-03-15.
  6. ^ a b v Klinton F. Goss (2013 yil avgust) [Birinchi marta 1986 yil iyun oyida nashr etilgan]. "Mashina kodini optimallashtirish - bajariladigan ob'ekt kodini takomillashtirish" (PDF) (Nomzodlik dissertatsiyasi). Computer Science Department Technical Report #246. Courant Institute, New York University. arXiv:1308.4815. Bibcode:2013arXiv1308.4815G. Olingan 22 avgust 2013. Xulosa. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering)
  7. ^ Aho, Sethi, and Ullman, Tuzuvchilar, pp. 596–598.
  8. ^ Aho, Sethi, and Ullman, Tuzuvchilar, pp. 592–594.
  9. ^ Stiven Muchnik; Muchnik va Associates (1997 yil 15-avgust). Murakkab kompilyatorni loyihalashtirishni amalga oshirish. Morgan Kaufmann. pp.329 –. ISBN  978-1-55860-320-2. constant folding.
  10. ^ Wegman, Mark N. and Zadeck, F. Kenneth. "Constant Propagation with Conditional Branches." Dasturlash tillari va tizimlari bo'yicha ACM operatsiyalari, 13(2), April 1991, pages 181-210.
  11. ^ Click, Clifford and Cooper, Keith. "Combining Analyses, Combining Optimizations ", Dasturlash tillari va tizimlari bo'yicha ACM operatsiyalari, 17(2), March 1995, pages 181-196
  12. ^ a b Cx51 Compiler Manual, version 09.2001, p155, Keil Software Inc.
  13. ^ Robert B. K. Dewar; Martin Charlz Golumbich; Clinton F. Goss (August 2013) [First published October 1979]. MICRO SPITBOL. Computer Science Department Technical Report. No. 11. Courant Institute of Mathematical Sciences. arXiv:1308.6096. Bibcode:2013arXiv1308.6096D.
  14. ^ Martin Charlz Golumbich; Robert B. K. Dewar; Clinton F. Goss (1980). "Macro Substitutions in MICRO SPITBOL - a Combinatorial Analysis". Proc. 11th Southeastern Conference on Combinatorics, Graph Theory and Computing, Congressus Numerantium, Utilitas Math., Winnipeg, Canada. 29: 485–495.
  15. ^ Aho, Sethi, and Ullman, Tuzuvchilar, p. 15.
  16. ^ a b Aho, Sethi, and Ullman, Tuzuvchilar, p. 737.
  17. ^ Guelton, Serge (August 5, 2019). "Customize the compilation process with Clang: Optimization options". Qizil shapka.
  18. ^ Software engineering for the Cobol environment. Portal.acm.org. 2013-08-10 da olingan.
  19. ^ Aho, Sethi, and Ullman, Tuzuvchilar, p. 736.
  20. ^ Sun, Chengnian; va boshq. (July 18–20, 2016). "Toward understanding compiler bugs in GCC and LLVM". ISSTA 2016: Proceedings of the 25th International Symposium on Software Testing and Analysis. Issta 2016: 294–305. doi:10.1145/2931037.2931074. ISBN  9781450343909. S2CID  8339241.
  21. ^ Schilling, Jonathan L. (August 1993). "Fail-safe programming in compiler optimization". ACM SIGPLAN xabarnomalari. 28 (8): 39–42. doi:10.1145/163114.163118. S2CID  2224606.
  22. ^ Aho, Sethi, and Ullman, Tuzuvchilar, pp. 740, 779.

Tashqi havolalar