Автор мови 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;
постійне поліпшення якості коду (поліпшення коду транслятора призводить до поліпшення якості коду всіх програм, що створюються транслятором, включаючи сам транслятор);
всебічна перевірка транслятора на несуперечливість (транслятор повинен бути здатний відтворити свій власний код).
Недоліки
При створенні нових мов програмування використання вже існуючих мов може бути цілком виправданим з наступних причин[2] :
компілятори вже існуючих мов, як правило, надійні (налагоджені, вивчені, стабільні);
використання інтерпретатора для самоінтерпретації нової мови може негативно позначитися на швидкості: старий інтерпретатор інтерпретує код нового інтерпретатора, який інтерпретує код сценарію користувача (подвійна інтерпретація)[3].
Історія
Асемблери були першими компіляторами, здатними компілювати самі себе методом розкрутки.
Neliac[en] — діалект мови «Алгол58» і однойменний компілятор, розроблені в 1958 році; перша мова високого рівня, для якої був використаний метод розкрутки.
Першими широко використовуваними мовами, які були розкручені тим же способом, стали:
У 1962 році Тім Гарт (англ.Tim Hart) і Марк Левін (англ.Mark Levin) в Массачусетському технологічному інституті написали перший компіляторLisp на мові Lisp[4] і перевірили його на вже існуючому інтерпретаторі мови Lisp. Вони перейшли на нього, як тільки розроблений ними компілятор зміг відкомпілювати свій власний початковий код.
Список мов, що мають компілятори, які самокомпілюються