Діаграма крос-компілятора


9

Я вивчаю завантажувальну програму у Red Dragon Book Compilers і виявив T-схему для крос-компілятора досить заплутана. Я не можу зрозуміти, що означає "Запустити компілятор1 через компілятор2". Чи може хтось надати краще пояснення, аналогію чи приклад, що стосується якогось компілятора реального світу?

Перше позначення. За LSN= введіть тут опис зображення Я маю на увазі компілятор для мови L написані мовою S що виробляє мову виводу / машинний код N. Це надгробна плита або Т-діаграми .

Складання компілятора

  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


Я додав кілька T-діаграм, які насправді повинні полегшити розуміння того, що відбувається. Сподіваємось, хтось зможе визначити кращий спосіб надання їх.
Дейв Кларк

Відповіді:


11

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

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

Перший T описує компілятор від L до N, написаний С.

Другий Т описує компілятор від 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.

Можливо, було б простіше зрозуміти це за аналогією. Supppse У нас є компілятор C cc, написаний у Fortran, який генерує код ARM. Припустимо, у нас також є компілятор Fortran fcна нашому комп'ютері x64. Якщо ми компілюємо ccвихідний код, fcми отримуємо програму, яка працює на x64, компілює програми C, але створює виконувані файли для ARM.


0

Щоб зробити це просто….

Примітка. Пам'ятайте, що компілятор може працювати лише на мові низького рівня.

У першій діаграмі компілятор записується на HLL (Langg High Level), так що впорядковано запускати, що на машині langg реалізації компілятора повинен бути в LLL.

Отже, у 2-й діаграмі мол реалізації компілятора запускається на самостійний компілятор Resident таким чином, що цільовий код може працювати на власній машині.

Нарешті, комбінуючи їх обох, компілятор працює на машині з langg - M

вхідний langg - L

вихід Langg - N

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.