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 .
Compilar un compilador
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.
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:
Ejecute LSN a través de SMM para producir LMN
Construcción del compilador
fuente
Respuestas:
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.
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 )
fuente
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
cc
que está escrito en Fortran, que genera código ARM. Supongamos que también tenemos un compilador Fortranfc
en nuestra computadora x64. Si compilamos elcc
código fuentefc
, obtenemos un programa que se ejecuta en x64, compila programas en C, pero produce ejecutables para ARM.fuente
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
fuente