Т-диаграмма кросс-компилятора


9

Я изучаю Bootstrapping из Red Dragon Book Compilers и нашел T-диаграмму для кросс-компилятора довольно запутанной. Я не могу понять, что подразумевается под «Запустить compiler1 через compiler2». Может ли кто-нибудь дать лучшее объяснение, аналогию или пример, связанный с каким-то реальным компилятором?

Сначала некоторые обозначения. По То есть компилятор для языка L , написанный на языке S , который производит выходной язык / машинный код N . Это надгробие или Т-диаграммы .LSNзнак равно введите описание изображения здесьLSN

Компиляция компилятора

  1. Предположим, у нас есть кросс-компилятор для нового языка L в языке реализации S, генерирующий код для машины N.

    LSNзнак равно
    T-диаграмма для LSN

  2. Предположим, у нас также есть существующий S-компилятор, работающий на машине M, реализующий код для машины M:

    SMMзнак равно
    T-диаграмма для SMM

  3. Запустите LSN через SMM для создания LMN

Конструкция компилятора

LMNзнак равноLSN+SMM
T-диаграмма для LMN = LSN + SMM


Я добавил несколько Т-диаграмм, которые на самом деле должны облегчить понимание того, что происходит. Надеюсь, кто-то может найти лучший способ их визуализации.
Дейв Кларк

Ответы:


11

Т-диаграммы (которые вы пропустили в исходной версии вашего вопроса) имеют решающее значение для понимания такого рода вопроса. Давайте посмотрим на последнюю Т-диаграмму.

введите описание изображения здесь

Первый T описывает компилятор из L в N, написанный на S.

Второй T описывает компилятор из S в M, написанный на M (или работающий на M). Это будет ваш компилятор компилятора .

Применение второго T к первому T компилирует первый T так, что он запускается на машине M. Таким образом, в результате получается компилятор из L в N, работающий на машине M.

Тот факт, что второй T также работает на компьютере M, отражает то, что вы запускаете компилятор на компьютере, на котором вы будете запускать компилятор, вместо того, чтобы использовать кросс-компилятор (что было бы в случае, если нижний M был другим ).


5

Это означает, что мы компилируем LSN с SMM, то есть запускаем исходный код LSN через SMM.

Когда SMM компилирует некоторый исходный код, он создает исполняемый файл для машины M, поэтому, когда мы компилируем LSN с помощью SMM, мы получаем LMN - исполняемый файл, который компилирует L исходных файлов на машине M для создания исполняемых файлов для машины N.

Возможно, было бы легче понять это по аналогии. Предположим, у нас есть компилятор C cc, написанный на фортране, который генерирует код ARM. Предположим, у нас также есть компилятор Fortran fcна нашем компьютере x64. Если мы скомпилируем ccисходный код, fcмы получим программу, которая работает на x64, компилирует программы на C, но создает исполняемые файлы для ARM.


0

Чтобы сделать это просто ....

Примечание. Помните, что компилятор может работать только на языке низкого уровня.

На 1-й диаграмме компилятор написан на HLL (High Level Langg), поэтому для того, чтобы запустить его на машине, язык компилятора должен быть в LLL.

Таким образом, во 2-й диаграмме язык реализации компилятора запускается на саморезидентном компиляторе, так что целевой код может выполняться на его собственной машине.

Наконец, объединяя их обоих, компилятор работает на машине с langg - M

входной язык - L

выход Langg - N

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.