Я изучаю Bootstrapping из Red Dragon Book Compilers и нашел T-диаграмму для кросс-компилятора довольно запутанной. Я не могу понять, что подразумевается под «Запустить compiler1 через compiler2». Может ли кто-нибудь дать лучшее объяснение, аналогию или пример, связанный с каким-то реальным компилятором?
Сначала некоторые обозначения. По То есть компилятор для языка L , написанный на языке S , который производит выходной язык / машинный код N . Это надгробие или Т-диаграммы .
Компиляция компилятора
Предположим, у нас есть кросс-компилятор для нового языка L в языке реализации S, генерирующий код для машины N.
Предположим, у нас также есть существующий S-компилятор, работающий на машине M, реализующий код для машины M:
Запустите LSN через SMM для создания LMN
Конструкция компилятора
источник
Ответы:
Т-диаграммы (которые вы пропустили в исходной версии вашего вопроса) имеют решающее значение для понимания такого рода вопроса. Давайте посмотрим на последнюю Т-диаграмму.
Первый T описывает компилятор из L в N, написанный на S.
Второй T описывает компилятор из S в M, написанный на M (или работающий на M). Это будет ваш компилятор компилятора .
Применение второго T к первому T компилирует первый T так, что он запускается на машине M. Таким образом, в результате получается компилятор из L в N, работающий на машине M.
Тот факт, что второй T также работает на компьютере M, отражает то, что вы запускаете компилятор на компьютере, на котором вы будете запускать компилятор, вместо того, чтобы использовать кросс-компилятор (что было бы в случае, если нижний M был другим ).
источник
Это означает, что мы компилируем LSN с SMM, то есть запускаем исходный код LSN через SMM.
Когда SMM компилирует некоторый исходный код, он создает исполняемый файл для машины M, поэтому, когда мы компилируем LSN с помощью SMM, мы получаем LMN - исполняемый файл, который компилирует L исходных файлов на машине M для создания исполняемых файлов для машины N.
Возможно, было бы легче понять это по аналогии. Предположим, у нас есть компилятор C
cc
, написанный на фортране, который генерирует код ARM. Предположим, у нас также есть компилятор Fortranfc
на нашем компьютере x64. Если мы скомпилируемcc
исходный код,fc
мы получим программу, которая работает на x64, компилирует программы на C, но создает исполняемые файлы для ARM.источник
Чтобы сделать это просто ....
Примечание. Помните, что компилятор может работать только на языке низкого уровня.
На 1-й диаграмме компилятор написан на HLL (High Level Langg), поэтому для того, чтобы запустить его на машине, язык компилятора должен быть в LLL.
Таким образом, во 2-й диаграмме язык реализации компилятора запускается на саморезидентном компиляторе, так что целевой код может выполняться на его собственной машине.
Наконец, объединяя их обоих, компилятор работает на машине с langg - M
входной язык - L
выход Langg - N
источник