Генерація коду або кодогенерація — частина процесу компіляції, коли спеціальна частина компілятора, кодогенератор, конвертує синтаксично коректну програму в послідовність інструкцій, які можуть виконуватися на машині. При цьому можуть застосовуватися різні, в першу чергу машинно-залежні оптимізації. Часто кодогенератор є спільною частиною для багатьох компіляторів. Кожен з них генерує проміжний код, який подається на вхід кодогенератору.
Зазвичай, на вхід генератора коду подається дерево розбору або абстрактне синтаксичне дерево. Дерево перетвориться в лінійну послідовність інструкцій проміжної мови.
Складні компілятори, як правило, роблять кілька проходів через різні проміжні форми коду. Цей багатокроковий процес використовується тому, що багато алгоритмів оптимізації коду простіше реалізувати окремо, або ж тому, що якийсь крок оптимізації залежить від результату обробки другого кроку. Окрім того, при такій організації легко створити один компілятор, який буде створювати код для кількох платформ, так як достатньо замінити останній крок генерації коду (англ. backend ).
Подальші етапи компіляції можуть і не належати до «генерації коду», в залежності від того, наскільки значними будуть зміни, що вносяться ними. Так, локальна оптимізація навряд чи може називатися «генерацією коду», проте сам генератор коду може включати в себе етап локальної оптимізації.
Завдання генератора коду
В додачу до основного завдання — перетворення коду з проміжного представлення в машинні інструкції — генератор коду зазвичай намагається оптимізувати код, створений тими чи іншими способами. Наприклад, він може використовувати більш швидкі інструкції, використовувати менше інструкцій, використовувати наявні регістри і запобігати надлишковим обчисленням.
Деякі завдання, які, зазвичай, вирішують складні генератори коду:
- Вибір інструкцій: які саме інструкції використати;
- Планування інструкцій: у якому порядку розміщувати ці інструкції. Планування — це оптимізація, котра може значно впливати на швидкість виконання програми на конвеєрних процесорах;
- Розміщення у регістрах: розміщення змінних програми у регістрах процесора;
- Дані про налагодження покоління, якщо потрібно, так що код може бути налагоджений.
Вибір інструкцій зазвичай виконується рекурсивним обходом абстрактного синтаксичного дерева. В цьому випадку порівнюються частини конфігурацій дерева з шаблонами. Наприклад, дерево
W:=ADD(X,MUL(Y,Z))
може бути перетворене в лінійну послідовність інструкцій рекурсивну генерації послідовностей
t1:=X
і t2:=MUL(Y,Z)
, а потім в інструкцію
ADD W,t1,t2
. В компіляторах, які використовують проміжну мову, може бути дві стадії вибору інструкцій — одна для перетворення дерева розбору в проміжний код, а друга (виконується значно пізніше) — для перетворення проміжного коду в інструкції цільової системи команд. Друга стадія не вимагає обходу дерева : вона може виконуватися послідовно і зазвичай складається з простої заміни операцій проміжної мови відповідними їм кодами операцій. Насправді, якщо компілятор фактично є транслятором (наприклад, один переводить Eiffel в C), то друга стадія генерації коду може включати побудову дерева з лінійного проміжного коду.
Генерація коду під час виконання
Коли генерація коду відбувається під час виконання програми, як в JIT, важливо, щоб весь процес генерації коду був ефективний як в часі, так і у використаній пам'яті. Наприклад, при інтерпретації регулярних виразів, частіше створюються недетерміновані кінцеві автомати, ніж детерміновані , тому, що вони створюються швидше і займають менше пам'яті. Незважаючи на те, що створюється, загалом, менш ефективний код, генерація коду в JIT може надати можливість профілювання інформації, доступної тільки під час виконання програми.
Підсумки
Загалом синтаксичний та семантичний аналізатор намагаються отримати структуру програми з вихідного коду, а генератор коду використовує цю структурну інформацію (наприклад, типи даних) для створення коду. Іншими словами, перший додає інформацію, тоді як останній втрачає певну інформацію. Одним із наслідків такої втрати інформації є те, що відображення стає важким або навіть неможливим. Щоб протистояти цій проблемі, генератори коду часто вставляють синтаксичну та семантичну інформацію на додаток до коду, необхідного для виконання.
Див. також
Примітки
- (PDF). Архів оригіналу (PDF) за 18 листопада 2018. Процитовано 18 листопада 2018.
- . Архів оригіналу за 24 листопада 2018. Процитовано 24 листопада 2018.
- . Архів оригіналу за 24 листопада 2018. Процитовано 24 листопада 2018.
Література
- Дональд Кнут. Мистецтво програмування.
- Альфред Ст. Агв, Моніка С. Лам, Рави Мережі, Джеффрі Д. Ульман. Компілятори: принципи, технології та інструментарій = Компілятори: Principles, Techniques, and Tools. — 2-е вид. — М.: Вільямс, 2008. — .
- Робін Хантер. Основні концепції компіляторів = The Essence of Компілятори. — М.: «Вільямс», 2002. — С. 256. — .
Посилання
- Семантичний аналізатор [ 24 листопада 2018 у Wayback Machine.](укр.)
- Семантичний аналіз тексту [ 20 грудня 2018 у Wayback Machine.](укр.)
- Синтаксичний аналіз [ 20 грудня 2018 у Wayback Machine.](укр.)
- Корнійко Ілля. Створення компілятора [ 24 листопада 2018 у Wayback Machine.] (рос.)
- Архитектура набора команд (ISA) [ 28 листопада 2018 у Wayback Machine.] (рос.)
- Code Generation: The Real Lesson of Rails [недоступне посилання з липня 2019](англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Generaciya kodu abo kodogeneraciya chastina procesu kompilyaciyi koli specialna chastina kompilyatora kodogenerator konvertuye sintaksichno korektnu programu v poslidovnist instrukcij yaki mozhut vikonuvatisya na mashini Pri comu mozhut zastosovuvatisya rizni v pershu chergu mashinno zalezhni optimizaciyi Chasto kodogenerator ye spilnoyu chastinoyu dlya bagatoh kompilyatoriv Kozhen z nih generuye promizhnij kod yakij podayetsya na vhid kodogeneratoru Zazvichaj na vhid generatora kodu podayetsya derevo rozboru abo abstraktne sintaksichne derevo Derevo peretvoritsya v linijnu poslidovnist instrukcij promizhnoyi movi Skladni kompilyatori yak pravilo roblyat kilka prohodiv cherez rizni promizhni formi kodu Cej bagatokrokovij proces vikoristovuyetsya tomu sho bagato algoritmiv optimizaciyi kodu prostishe realizuvati okremo abo zh tomu sho yakijs krok optimizaciyi zalezhit vid rezultatu obrobki drugogo kroku Okrim togo pri takij organizaciyi legko stvoriti odin kompilyator yakij bude stvoryuvati kod dlya kilkoh platform tak yak dostatno zaminiti ostannij krok generaciyi kodu angl backend Podalshi etapi kompilyaciyi mozhut i ne nalezhati do generaciyi kodu v zalezhnosti vid togo naskilki znachnimi budut zmini sho vnosyatsya nimi Tak lokalna optimizaciya navryad chi mozhe nazivatisya generaciyeyu kodu prote sam generator kodu mozhe vklyuchati v sebe etap lokalnoyi optimizaciyi Zavdannya generatora kodu V dodachu do osnovnogo zavdannya peretvorennya kodu z promizhnogo predstavlennya v mashinni instrukciyi generator kodu zazvichaj namagayetsya optimizuvati kod stvorenij timi chi inshimi sposobami Napriklad vin mozhe vikoristovuvati bilsh shvidki instrukciyi vikoristovuvati menshe instrukcij vikoristovuvati nayavni registri i zapobigati nadlishkovim obchislennyam Deyaki zavdannya yaki zazvichaj virishuyut skladni generatori kodu Vibir instrukcij yaki same instrukciyi vikoristati Planuvannya instrukcij u yakomu poryadku rozmishuvati ci instrukciyi Planuvannya ce optimizaciya kotra mozhe znachno vplivati na shvidkist vikonannya programi na konveyernih procesorah Rozmishennya u registrah rozmishennya zminnih programi u registrah procesora Dani pro nalagodzhennya pokolinnya yaksho potribno tak sho kod mozhe buti nalagodzhenij Vibir instrukcij zazvichaj vikonuyetsya rekursivnim obhodom abstraktnogo sintaksichnogo dereva V comu vipadku porivnyuyutsya chastini konfiguracij dereva z shablonami Napriklad derevoW ADD X MUL Y Z mozhe buti peretvorene v linijnu poslidovnist instrukcij rekursivnu generaciyi poslidovnostejt1 X i t2 MUL Y Z a potim v instrukciyuADD W t1 t2 V kompilyatorah yaki vikoristovuyut promizhnu movu mozhe buti dvi stadiyi viboru instrukcij odna dlya peretvorennya dereva rozboru v promizhnij kod a druga vikonuyetsya znachno piznishe dlya peretvorennya promizhnogo kodu v instrukciyi cilovoyi sistemi komand Druga stadiya ne vimagaye obhodu dereva vona mozhe vikonuvatisya poslidovno i zazvichaj skladayetsya z prostoyi zamini operacij promizhnoyi movi vidpovidnimi yim kodami operacij Naspravdi yaksho kompilyator faktichno ye translyatorom napriklad odin perevodit Eiffel v C to druga stadiya generaciyi kodu mozhe vklyuchati pobudovu dereva z linijnogo promizhnogo kodu Generaciya kodu pid chas vikonannya Koli generaciya kodu vidbuvayetsya pid chas vikonannya programi yak v JIT vazhlivo shob ves proces generaciyi kodu buv efektivnij yak v chasi tak i u vikoristanij pam yati Napriklad pri interpretaciyi regulyarnih viraziv chastishe stvoryuyutsya nedeterminovani kincevi avtomati nizh determinovani tomu sho voni stvoryuyutsya shvidshe i zajmayut menshe pam yati Nezvazhayuchi na te sho stvoryuyetsya zagalom mensh efektivnij kod generaciya kodu v JIT mozhe nadati mozhlivist profilyuvannya informaciyi dostupnoyi tilki pid chas vikonannya programi Pidsumki Zagalom sintaksichnij ta semantichnij analizator namagayutsya otrimati strukturu programi z vihidnogo kodu a generator kodu vikoristovuye cyu strukturnu informaciyu napriklad tipi danih dlya stvorennya kodu Inshimi slovami pershij dodaye informaciyu todi yak ostannij vtrachaye pevnu informaciyu Odnim iz naslidkiv takoyi vtrati informaciyi ye te sho vidobrazhennya staye vazhkim abo navit nemozhlivim Shob protistoyati cij problemi generatori kodu chasto vstavlyayut sintaksichnu ta semantichnu informaciyu na dodatok do kodu neobhidnogo dlya vikonannya Div takozhKompilyaciyaPrimitki PDF Arhiv originalu PDF za 18 listopada 2018 Procitovano 18 listopada 2018 Arhiv originalu za 24 listopada 2018 Procitovano 24 listopada 2018 Arhiv originalu za 24 listopada 2018 Procitovano 24 listopada 2018 LiteraturaDonald Knut Mistectvo programuvannya Alfred St Agv Monika S Lam Ravi Merezhi Dzheffri D Ulman Kompilyatori principi tehnologiyi ta instrumentarij Kompilyatori Principles Techniques and Tools 2 e vid M Vilyams 2008 ISBN 978 5 8459 1349 4 Robin Hanter Osnovni koncepciyi kompilyatoriv The Essence of Kompilyatori M Vilyams 2002 S 256 ISBN 5 8459 0360 2 PosilannyaSemantichnij analizator 24 listopada 2018 u Wayback Machine ukr Semantichnij analiz tekstu 20 grudnya 2018 u Wayback Machine ukr Sintaksichnij analiz 20 grudnya 2018 u Wayback Machine ukr Kornijko Illya Stvorennya kompilyatora 24 listopada 2018 u Wayback Machine ros Arhitektura nabora komand ISA 28 listopada 2018 u Wayback Machine ros Code Generation The Real Lesson of Rails nedostupne posilannya z lipnya 2019 angl