Розкрутка компілятора

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Розкрутка компілятора (англ. bootstrapping — від boot і strap) — метод створення транслятора[a] для деякої мови програмування, при якому транслятор пишеться на тій же мові програмування, для трансляції якої створюється; створення транслятором виконуваних файлів з початкового коду самого транслятора. Використовується для перенесення трансляторів на нові платформи. З'явився в середині 1950-х років. Дозволяє створити транслятор, який генерує сам себе. Застосовувався для створення трансляторів багатьох мов програмування, включаючи мови Basic, ALGOL, C, Pascal, Haskell, Оберон, OCaml, Common Lisp, Scheme, Java, Python, Scala, Nemerle та інші.

Проблема курки та яйця

[ред. | ред. код]

Нехай створена нова мова програмування L. Нехай на мові L написано початковий код транслятора для мови L. Як отримати транслятор, здатний з цього коду створити виконуваний файл?

Методи вирішення проблеми перераховані нижче.

  • Те ж, але автор мови L сам не пише початковий код, а доручає цю операцію іншій особі. Такий спосіб часто застосовується при створенні трансляторів для мови Scheme.
  • Перша версія компілятора може бути написана на підмножині мови L, для якої вже існує якийсь інший компілятор. Таким способом були отримані компілятори для підмножини мов Java, Haskell і Free Pascal.
  • Створити транслятор для нової платформи можна шляхом крос-компіляції — створення виконуваного файлу транслятора для нової платформи на платформі, для якої транслятор вже існує. Таким способом зазвичай портують компілятори, написані на мовах C і Free Pascal .

Розкрутка компілятора з використанням компілятора існуючої мови

[ред. | ред. код]

Створення транслятора мови L методом розкрутки передбачає виконання деяких кроків.

  1. На першому кроці з мови L виділяється підмножина L0, яка не вимагає великих зусиль для реалізації, але є достатньою для написання транслятора самої себе. Потім, використовуючи будь-яку існуючу для цієї платформи мову (наприклад, C), складається початковий код транслятора для L0.
  2. Потім на мові L0 складається транслятор для самої мови L0. Виконуваний файл транслятора створюється за допомогою транслятора, отриманого на першому кроці. Після цього у програміста є транслятор L0, здатний обробити свій початковий код.
  3. Далі починається поступове розширення L0 до L: додається якась раніше не реалізована можливість мови L, після чого попередньою версією транслятора створюється нова, а знову додану можливість можна використовувати в трансляторі для подальшого розширення мови.

Саме цей процес і називають розкручуванням.

Число кроків можна зменшити, якщо після складання транслятора L0 на мові С відразу починати складати транслятор L на підмножині L0.

Переваги

[ред. | ред. код]

Переваги методу розкрутки[1]:

  • перевірка можливостей мови L;
  • відсутність необхідності вивчення інших мов (часом розробнику досить знати тільки мову L);
  • можливість подальшого поліпшення транслятора на мові високого рівня L;
  • постійне поліпшення якості коду (поліпшення коду транслятора призводить до поліпшення якості коду всіх програм, що створюються транслятором, включаючи сам транслятор);
  • всебічна перевірка транслятора на несуперечливість (транслятор повинен бути здатний відтворити свій власний код).

Недоліки

[ред. | ред. код]

При створенні нових мов програмування використання вже існуючих мов може бути цілком виправданим з наступних причин[2] :

  • компілятори вже існуючих мов, як правило, надійні (налагоджені, вивчені, стабільні);
  • для вже існуючих мов є налагоджувачі, статичні аналізатори та інші інструменти;
  • неможливість використання генераторів синтаксичних аналізаторів;
  • використання інтерпретатора для самоінтерпретації нової мови може негативно позначитися на швидкості: старий інтерпретатор інтерпретує код нового інтерпретатора, який інтерпретує код сценарію користувача (подвійна інтерпретація)[3].

Історія

[ред. | ред. код]

Асемблери були першими компіляторами, здатними компілювати самі себе методом розкрутки.

Neliac[en] — діалект мови «Алгол 58» і однойменний компілятор, розроблені в 1958 році; перша мова високого рівня, для якої був використаний метод розкрутки.

Першими широко використовуваними мовами, які були розкручені тим же способом, стали:

У 1962 році Тім Гарт (англ. Tim Hart) і Марк Левін (англ. Mark Levin) в Массачусетському технологічному інституті написали перший компілятор Lisp на мові Lisp[4] і перевірили його на вже існуючому інтерпретаторі мови Lisp. Вони перейшли на нього, як тільки розроблений ними компілятор зміг відкомпілювати свій власний початковий код.

Список мов, що мають компілятори, які самокомпілюються

[ред. | ред. код]

Примітки

[ред. | ред. код]

Джерела

[ред. | ред. код]
  1. Patrick D. Terry. Compilers and Compiler Generators: An Introduction With C++. — International Thomson Computer Press, 1997. — ISBN 1850322988.
  2. Раскрутка компилятора. Архів оригіналу за 9 серпня 2020. Процитовано 13 червня 2019.
  3. У деяких випадках при подвійний інтерпретації продуктивність виконуваного файлу може збільшитися. Див. PyPy.
  4. Tim Hart and Mike Levin. AI Memo 39-The new compiler (PDF). Процитовано 13 жовтня 2006.[недоступне посилання з липня 2019]

Література

[ред. | ред. код]

Посилання

[ред. | ред. код]