logo
Материал / 03

Метод раскрутки

Компилятор – это весьма большая и сложная программа; на написание и отладку компилятора на языке ассемблера можно истратить слишком много времени. Для того, чтобы как-то справиться с этой проблемой, был придуман метод раскрутки, суть которого заключается в следующем.

Пусть есть компилятор KA: P→A, гдеP– некоторый язык более высокого уровня, чем язык ассемблера. Тогда напишемKP: LA, а затем применим компиляторKAк компиляторуKP, т.е. получимKA=KA(KP): LA. Такая схема проиллюстрирована с помощью Т-диаграмм на слайде и называетсяраскруткой(bootstrapping2); компиляторKP как бы "раскручивается" с помощью компилятораKA.

Описанная схема может быть использована при написании компилятора некоторого языка на нем самом. Пусть у нас есть компилятор некоторого подмножества S языкаLв языкA, написанный на языкеA,KA: SA. Тогда мы можем написатьKL: LAи получим новый компиляторKA = KA(KL). Мы используем это подмножествоSдля того, чтобы написать компилятор языкаLв языкA,KS: LA. Если теперь мы применим компиляторKAк программеKS, то получимKA=KA(KS): LA.

Впервые такая схема была применена в 1960 году при реализации языка Neliac. В 1971 году Вирт написал с использованием раскрутки транслятор языкаPascal, причем самый первый компилятор был оттранслирован вручную. Количество шагов раскрутки было больше 1, т.е. была построена последовательность языков и построена последовательность компиляторов:KA: S1A, KA1=KA(KS1: S2A), ...

Раскрутку можно использовать и в следующей ситуации. Пусть у нас есть недостаточно эффективный компилятор K­A: LA. Можно написать более эффективный компиляторKL: LA, а затем применить раскрутку.