Diagrama T do Compilador Cruzado

9

Estou estudando Bootstrapping dos Red Dragon Book Compilers e achei o diagrama T do cross compiler bastante confuso. Não consigo entender o que significa "Executar o compilador1 através do compilador2". Alguém pode fornecer uma explicação melhor, analogia ou um exemplo para se relacionar com algum compilador do mundo real?

Alguma notação primeiro. Por I significa um compilador de linguagem escrito em linguagem que produz linguagem de saída / código de máquina . Esta é uma pedra tumular ou t-diagramas .euSN= insira a descrição da imagem aquieuSN

Compilando um compilador

  1. Suponha que tenhamos compilador cruzado para uma nova linguagem L na linguagem de implementação S, gerando código para a máquina N.

    euSN=
    Diagrama T para LSN

  2. Suponha que também tenhamos um compilador S em execução no código de implementação da máquina M para a máquina M:

    SMM=
    Diagrama T para SMM

  3. Execute LSN através do SMM para produzir LMN

Construção do compilador

euMN=euSN+SMM
Diagrama T para LMN = LSN + SMM

Rafael
fonte
Adicionei alguns diagramas em T, o que deve facilitar a compreensão do que está acontecendo. Espero que alguém possa encontrar uma maneira melhor de renderizá-los.
18712 Dave

Respostas:

11

Os diagramas em T (que você omitiu da versão original da sua pergunta) são cruciais para entender esse tipo de pergunta. Vejamos o último diagrama em T.

insira a descrição da imagem aqui

O primeiro T descreve um compilador de L a N escrito em S.

O segundo T descreve um compilador de S para M escrito em M (ou executando em M). Este será o seu compilador .

A aplicação do segundo T ao primeiro T compila o primeiro T para que seja executado na máquina M. O resultado é, portanto, um compilador de L a N em execução na máquina M.

O fato de o segundo T também ser executado na máquina M captura que você está executando o compilador na máquina na qual executará o compilador, em vez de precisar usar um compilador cruzado (o que seria o caso se o M inferior fosse diferente )

Dave Clarke
fonte
5

Isso significa que compilamos o LSN com o SMM, ou seja, executamos o código-fonte do LSN através do SMM.

Quando o SMM compila algum código-fonte, ele produz um executável para a máquina M; portanto, quando compilamos LSN com SMM, obtemos o LMN - um executável, que compila arquivos de origem L na máquina M para produzir executáveis ​​para a máquina N.

Talvez fosse mais fácil entender isso com uma analogia. Supppse, temos um compilador C ccque está escrito em Fortran, que gera código ARM. Suponha que também tenhamos um compilador Fortran fcem nosso computador x64. Se compilarmos o cccódigo-fonte fc, obtemos um programa que roda em x64, compila programas em C, mas produz executáveis ​​para o ARM.

Daniil
fonte
0

Para simplificar ....

Nota: Lembre-se de que o Compiler pode ser executado apenas em um idioma de baixo nível.

No 1º Diagrama, o compilador é escrito em HLL (High Level Langg), de modo a executar que em uma máquina o idioma de implementação do compilador deve estar em LLL.

Portanto, no segundo diagrama, o idioma de implementação do compilador é executado em um compilador auto-residente, de modo que o código de destino possa ser executado em sua própria máquina.

Finalmente, combinando os dois, o compilador é executado em uma máquina com langg - M

idioma de entrada - L

saída Langg - N

Balance-me
fonte