Розкрутка компілятора (англ. bootstrapping — від boot і strap) — метод створення транслятора для деякої мови програмування, при якому транслятор пишеться на тій же мові програмування, для трансляції якої створюється; створення транслятором виконуваних файлів з початкового коду самого транслятора. Використовується для перенесення трансляторів на нові платформи. З'явився в середині 1950-х років. Дозволяє створити транслятор, який генерує сам себе. Застосовувався для створення трансляторів багатьох мов програмування, включаючи мови Basic, ALGOL, C, Pascal, Haskell, Оберон, OCaml, Common Lisp, Scheme, Java, Python, Scala, Nemerle та інші.
Проблема курки та яйця
Нехай створена нова мова програмування L. Нехай на мові L написано початковий код транслятора для мови L. Як отримати транслятор, здатний з цього коду створити виконуваний файл?
Методи вирішення (проблеми) перераховані нижче.
- Автор мови L може вручну виконати трансляцію початкового коду з мови L на машинну мову або на мову асемблера. Потім можна виконати отриманий код для створення виконуваного файлу компілятора. Так діяли Ніклаус Вірт з учнями при створенні першого компілятора для мови Pascal, а також Дональд Кнут при створенні своєї системи WEB.
- Автор мови L може написати початковий код транслятора на мові, для якої вже існує транслятор. Спробу такого роду (втім, невдалу) здійснив Ніклаус Вірт при створенні першого компілятора для мови Pascal на мові «Фортран».
- Те ж, але автор мови L сам не пише початковий код, а доручає цю операцію іншій особі. Такий спосіб часто застосовується при створенні трансляторів для мови Scheme.
- Перша версія компілятора може бути написана на підмножині мови L, для якої вже існує якийсь інший компілятор. Таким способом були отримані компілятори для підмножини мов Java, Haskell і Free Pascal.
- Створити транслятор для нової платформи можна шляхом крос-компіляції — створення виконуваного файлу транслятора для нової платформи на платформі, для якої транслятор вже існує. Таким способом зазвичай портують компілятори, написані на мовах C і Free Pascal .
Розкрутка компілятора з використанням компілятора існуючої мови
Створення транслятора мови L методом розкрутки передбачає виконання деяких кроків.
- На першому кроці з мови L виділяється підмножина L0, яка не вимагає великих зусиль для реалізації, але є достатньою для написання транслятора самої себе. Потім, використовуючи будь-яку існуючу для цієї платформи мову (наприклад, C), складається початковий код транслятора для L0.
- Потім на мові L0 складається транслятор для самої мови L0. Виконуваний файл транслятора створюється за допомогою транслятора, отриманого на першому кроці. Після цього у програміста є транслятор L0, здатний обробити свій початковий код.
- Далі починається поступове розширення L0 до L: додається якась раніше не реалізована можливість мови L, після чого попередньою версією транслятора створюється нова, а знову додану можливість можна використовувати в трансляторі для подальшого розширення мови.
Саме цей процес і називають розкручуванням.
Число кроків можна зменшити, якщо після складання транслятора L0 на мові С відразу починати складати транслятор L на підмножині L0.
Переваги
Переваги методу розкрутки:
- перевірка можливостей мови L;
- відсутність необхідності вивчення інших мов (часом розробнику досить знати тільки мову L);
- можливість подальшого поліпшення транслятора на мові високого рівня L;
- постійне поліпшення якості коду (поліпшення коду транслятора призводить до поліпшення якості коду всіх програм, що створюються транслятором, включаючи сам транслятор);
- всебічна перевірка транслятора на несуперечливість (транслятор повинен бути здатний відтворити свій власний код).
Недоліки
При створенні нових мов програмування використання вже існуючих мов може бути цілком виправданим з наступних причин :
- компілятори вже існуючих мов, як правило, надійні (налагоджені, вивчені, стабільні);
- для вже існуючих мов є налагоджувачі, статичні аналізатори та інші інструменти;
- неможливість використання генераторів синтаксичних аналізаторів;
- використання інтерпретатора для самоінтерпретації нової мови може негативно позначитися на швидкості: старий інтерпретатор інтерпретує код нового інтерпретатора, який інтерпретує код сценарію користувача (подвійна інтерпретація).
Історія
Асемблери були першими компіляторами, здатними компілювати самі себе методом розкрутки.
[en] — діалект мови «Алгол 58» і однойменний компілятор, розроблені в 1958 році; перша мова високого рівня, для якої був використаний метод розкрутки.
Першими широко використовуваними мовами, які були розкручені тим же способом, стали:
- Burroughs B5000 («Алгол 60») в 1961 році;
- Lisp в 1962 році.
У 1962 році Тім Гарт (англ. Tim Hart) і Марк Левін (англ. Mark Levin) в Массачусетському технологічному інституті написали перший компілятор Lisp на мові Lisp і перевірили його на вже існуючому інтерпретаторі мови Lisp. Вони перейшли на нього, як тільки розроблений ними компілятор зміг відкомпілювати свій власний початковий код.
Список мов, що мають компілятори, які самокомпілюються
Примітки
- Транслятор — компілятор або інтерпретатор.
Джерела
- Patrick D. Terry. Compilers and Compiler Generators: An Introduction With C++. — International Thomson Computer Press, 1997. — .
- . Архів оригіналу за 9 серпня 2020. Процитовано 13 червня 2019.
- У деяких випадках при подвійний інтерпретації продуктивність виконуваного файлу може збільшитися. Див. PyPy.
- Tim Hart and Mike Levin. AI Memo 39-The new compiler (PDF). Процитовано 13 жовтня 2006.[недоступне посилання з липня 2019]
Література
- Альфред Ахо, Рави Сети, Джеффри Ульман. Раскрутка // = Compilers: Principles, Techniques, and Tools. — М. : Вильямс, 2003. — С. 681—684. — .
- Свердлов С. З. Самокомпилятор. Раскрутка // Языки программирования и методы трансляции. — СПб. : , 2007. — С. 427—431. — .
- Вирт Н. Построение компиляторов, Москва, ДМК Пресс, 2010, ,
Посилання
- http://www.compiler.su/raskrutka-kompilyatora.php [ 9 серпня 2020 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Rozkrutka kompilyatora angl bootstrapping vid boot i strap metod stvorennya translyatora dlya deyakoyi movi programuvannya pri yakomu translyator pishetsya na tij zhe movi programuvannya dlya translyaciyi yakoyi stvoryuyetsya stvorennya translyatorom vikonuvanih fajliv z pochatkovogo kodu samogo translyatora Vikoristovuyetsya dlya perenesennya translyatoriv na novi platformi Z yavivsya v seredini 1950 h rokiv Dozvolyaye stvoriti translyator yakij generuye sam sebe Zastosovuvavsya dlya stvorennya translyatoriv bagatoh mov programuvannya vklyuchayuchi movi Basic ALGOL C Pascal Haskell Oberon OCaml Common Lisp Scheme Java Python Scala Nemerle ta inshi Problema kurki ta yajcyaNehaj stvorena nova mova programuvannya L Nehaj na movi L napisano pochatkovij kod translyatora dlya movi L Yak otrimati translyator zdatnij z cogo kodu stvoriti vikonuvanij fajl Metodi virishennya problemi pererahovani nizhche Avtor movi L mozhe vruchnu vikonati translyaciyu pochatkovogo kodu z movi L na mashinnu movu abo na movu asemblera Potim mozhna vikonati otrimanij kod dlya stvorennya vikonuvanogo fajlu kompilyatora Tak diyali Niklaus Virt z uchnyami pri stvorenni pershogo kompilyatora dlya movi Pascal a takozh Donald Knut pri stvorenni svoyeyi sistemi WEB Avtor movi L mozhe napisati pochatkovij kod translyatora na movi dlya yakoyi vzhe isnuye translyator Sprobu takogo rodu vtim nevdalu zdijsniv Niklaus Virt pri stvorenni pershogo kompilyatora dlya movi Pascal na movi Fortran Te zh ale avtor movi L sam ne pishe pochatkovij kod a doruchaye cyu operaciyu inshij osobi Takij sposib chasto zastosovuyetsya pri stvorenni translyatoriv dlya movi Scheme Persha versiya kompilyatora mozhe buti napisana na pidmnozhini movi L dlya yakoyi vzhe isnuye yakijs inshij kompilyator Takim sposobom buli otrimani kompilyatori dlya pidmnozhini mov Java Haskell i Free Pascal Stvoriti translyator dlya novoyi platformi mozhna shlyahom kros kompilyaciyi stvorennya vikonuvanogo fajlu translyatora dlya novoyi platformi na platformi dlya yakoyi translyator vzhe isnuye Takim sposobom zazvichaj portuyut kompilyatori napisani na movah C i Free Pascal Rozkrutka kompilyatora z vikoristannyam kompilyatora isnuyuchoyi moviStvorennya translyatora movi L metodom rozkrutki peredbachaye vikonannya deyakih krokiv Na pershomu kroci z movi L vidilyayetsya pidmnozhina L0 yaka ne vimagaye velikih zusil dlya realizaciyi ale ye dostatnoyu dlya napisannya translyatora samoyi sebe Potim vikoristovuyuchi bud yaku isnuyuchu dlya ciyeyi platformi movu napriklad C skladayetsya pochatkovij kod translyatora dlya L0 Potim na movi L0 skladayetsya translyator dlya samoyi movi L0 Vikonuvanij fajl translyatora stvoryuyetsya za dopomogoyu translyatora otrimanogo na pershomu kroci Pislya cogo u programista ye translyator L0 zdatnij obrobiti svij pochatkovij kod Dali pochinayetsya postupove rozshirennya L0 do L dodayetsya yakas ranishe ne realizovana mozhlivist movi L pislya chogo poperednoyu versiyeyu translyatora stvoryuyetsya nova a znovu dodanu mozhlivist mozhna vikoristovuvati v translyatori dlya podalshogo rozshirennya movi Same cej proces i nazivayut rozkruchuvannyam Chislo krokiv mozhna zmenshiti yaksho pislya skladannya translyatora L0 na movi S vidrazu pochinati skladati translyator L na pidmnozhini L0 PerevagiPerevagi metodu rozkrutki perevirka mozhlivostej movi L vidsutnist neobhidnosti vivchennya inshih mov chasom rozrobniku dosit znati tilki movu L mozhlivist podalshogo polipshennya translyatora na movi visokogo rivnya L postijne polipshennya yakosti kodu polipshennya kodu translyatora prizvodit do polipshennya yakosti kodu vsih program sho stvoryuyutsya translyatorom vklyuchayuchi sam translyator vsebichna perevirka translyatora na nesuperechlivist translyator povinen buti zdatnij vidtvoriti svij vlasnij kod NedolikiPri stvorenni novih mov programuvannya vikoristannya vzhe isnuyuchih mov mozhe buti cilkom vipravdanim z nastupnih prichin kompilyatori vzhe isnuyuchih mov yak pravilo nadijni nalagodzheni vivcheni stabilni dlya vzhe isnuyuchih mov ye nalagodzhuvachi statichni analizatori ta inshi instrumenti nemozhlivist vikoristannya generatoriv sintaksichnih analizatoriv vikoristannya interpretatora dlya samointerpretaciyi novoyi movi mozhe negativno poznachitisya na shvidkosti starij interpretator interpretuye kod novogo interpretatora yakij interpretuye kod scenariyu koristuvacha podvijna interpretaciya IstoriyaAsembleri buli pershimi kompilyatorami zdatnimi kompilyuvati sami sebe metodom rozkrutki en dialekt movi Algol 58 i odnojmennij kompilyator rozrobleni v 1958 roci persha mova visokogo rivnya dlya yakoyi buv vikoristanij metod rozkrutki Pershimi shiroko vikoristovuvanimi movami yaki buli rozkrucheni tim zhe sposobom stali Burroughs B5000 Algol 60 v 1961 roci Lisp v 1962 roci U 1962 roci Tim Gart angl Tim Hart i Mark Levin angl Mark Levin v Massachusetskomu tehnologichnomu instituti napisali pershij kompilyator Lisp na movi Lisp i perevirili jogo na vzhe isnuyuchomu interpretatori movi Lisp Voni perejshli na nogo yak tilki rozroblenij nimi kompilyator zmig vidkompilyuvati svij vlasnij pochatkovij kod Spisok mov sho mayut kompilyatori yaki samokompilyuyutsyaBASIC ALGOL C C Common Lisp Eiffel F Sharp Haskell Go Java Nemerle Oberon OCaml Pascal Perl 6 PL I Python Rust Scheme Scala Standard ML TypeScript REFALPrimitkiTranslyator kompilyator abo interpretator DzherelaPatrick D Terry Compilers and Compiler Generators An Introduction With C International Thomson Computer Press 1997 ISBN 1850322988 Arhiv originalu za 9 serpnya 2020 Procitovano 13 chervnya 2019 U deyakih vipadkah pri podvijnij interpretaciyi produktivnist vikonuvanogo fajlu mozhe zbilshitisya Div PyPy Tim Hart and Mike Levin AI Memo 39 The new compiler PDF Procitovano 13 zhovtnya 2006 nedostupne posilannya z lipnya 2019 LiteraturaAlfred Aho Ravi Seti Dzheffri Ulman Raskrutka Compilers Principles Techniques and Tools M Vilyams 2003 S 681 684 ISBN 5 8459 0189 8 Sverdlov S Z Samokompilyator Raskrutka Yazyki programmirovaniya i metody translyacii SPb 2007 S 427 431 ISBN 5 469 00378 7 Virt N Postroenie kompilyatorov Moskva DMK Press 2010 ISBN 978 5 94074 585 3 ISBN 0 201 40353 6Posilannyahttp www compiler su raskrutka kompilyatora php 9 serpnya 2020 u Wayback Machine