Diagrama T del compilador cruzado

9

Estoy estudiando Bootstrapping de Red Dragon Book Compilers y encontré que el diagrama T para el compilador cruzado es bastante confuso. No puedo entender lo que significa "Ejecutar compilador1 a través de compilador2". ¿Alguien puede proporcionar una mejor explicación, analogía o un ejemplo para relacionarse con algún compilador del mundo real?

Alguna notación primero. Por Me refiero a un compilador para el lenguaje L escrito en lenguaje S que produce idioma de salida / código de máquina N . Se trata de una lápida o T-diagramas .LSnorte= ingrese la descripción de la imagen aquíLSnorte

Compilar un compilador

  1. Supongamos que tenemos un compilador cruzado para un nuevo lenguaje L en el lenguaje de implementación S que genera código para la máquina N.

    LSnorte=
    Diagrama T para LSN

  2. Supongamos que también tenemos un compilador S existente que se ejecuta en la máquina M que implementa el código para la máquina M:

    SMETROMETRO=
    Diagrama T para SMM

  3. Ejecute LSN a través de SMM para producir LMN

Construcción del compilador

LMETROnorte=LSnorte+SMETROMETRO
Diagrama T para LMN = LSN + SMM

Rafael
fuente
Agregué algunos diagramas en T, que deberían facilitar la comprensión de lo que está sucediendo. Esperemos que alguien pueda encontrar una mejor manera de representarlos.
Dave Clarke

Respuestas:

11

Los diagramas T (que había omitido de la versión original de su pregunta) son cruciales para comprender este tipo de preguntas. Veamos el último diagrama T.

ingrese la descripción de la imagen aquí

La primera T describe un compilador de L a N escrito en S.

La segunda T describe un compilador de S a M escrito en M (o ejecutándose en M). Este será tu compilador compilador .

La aplicación de la segunda T a la primera T compila la primera T para que se ejecute en la máquina M. El resultado es un compilador de L a N que se ejecuta en la máquina M.

El hecho de que la segunda T también se ejecute en la máquina M es una captura de que está ejecutando el compilador del compilador en la máquina en la que ejecutará el compilador, en lugar de tener que usar un compilador cruzado (que sería el caso si la M inferior fuera diferente )

Dave Clarke
fuente
5

Significa que compilamos LSN con SMM, es decir, ejecutamos el código fuente de LSN a través de SMM.

Cuando SMM compila algún código fuente, produce un ejecutable para la máquina M, por lo que cuando compilamos LSN con SMM obtenemos LMN, un ejecutable, que compila los archivos fuente L en la máquina M para producir ejecutables para la máquina N.

Quizás sería más fácil entender esto con una analogía. Supongamos que tenemos un compilador de C ccque está escrito en Fortran, que genera código ARM. Supongamos que también tenemos un compilador Fortran fcen nuestra computadora x64. Si compilamos el cccódigo fuente fc, obtenemos un programa que se ejecuta en x64, compila programas en C, pero produce ejecutables para ARM.

Daniil
fuente
0

Para hacerlo simple ...

Nota: Recuerde que el compilador solo puede ejecutarse en un lenguaje de bajo nivel.

En el primer diagrama, el compilador está escrito en HLL (High Level Langg) para poder ejecutar que en una máquina la implementación del compilador debe estar en LLL.

Por lo tanto, en el segundo diagrama, el lenguaje de implementación del compilador se ejecuta en un compilador independiente para que el código de destino pueda ejecutarse en su propia máquina.

Finalmente, combinando ambos, el compilador se ejecuta en una máquina con langg - M

langg de entrada - L

salida Langg - N

Meceme
fuente