Компилятор - это весьма большая и сложная программа; на написание и отладку компилятора на языке ассемблера можно истратить слишком много времени. Для того, чтобы как-то справиться с этой проблемой, был придуман метод раскрутки, суть которого заключается в следующем.
Пусть есть компилятор , где P - некоторый язык более высокого уровня, чем язык ассемблера. Тогда напишем , а затем применим компилятор к компилятору , т.е. получим . Такая схема проиллюстрирована с помощью Т-диаграмм на слайде и называется раскруткой (bootstrapping1)); компилятор как бы "раскручивается" с помощью компилятора .
Описанная схема может быть использована при написании компилятора некоторого языка на нем самом. Пусть у нас есть компилятор некоторого подмножества S языка L в язык A, написанный на языке A, . Тогда мы можем написать и получим новый компилятор . Мы используем это подмножество S для того, чтобы написать компилятор языка L в язык A, . Если теперь мы применим компилятор к программе , то получим
Впервые такая схема была применена в 1960 году при реализации языка Neliac. В 1971 году Вирт написал с использованием раскрутки транслятор языка Pascal, причем самый первый компилятор был оттранслирован вручную. Количество шагов раскрутки было больше 1, т.е. была построена последовательность языков и построена последовательность компиляторов:
Раскрутку можно использовать и в следующей ситуации. Пусть у нас есть недостаточно эффективный компилятор . Можно написать более эффективный компилятор , а затем применить раскрутку.