Diagramma a T del Cross Compiler


9

Sto studiando Bootstrapping da Red Dragon Book Compilers e ho trovato abbastanza confuso il diagramma a T per il compilatore incrociato. Non riesco a capire cosa si intende per "Esegui il compilatore1 attraverso il compilatore2". Qualcuno può fornire qualche spiegazione, analogia o un esempio migliore da mettere in relazione con un compilatore del mondo reale?

Prima una notazione. Con intendo un compilatore per il linguaggio scritto in linguaggio che produce codice della lingua di uscita / macchina . Questa è una lapide o T-diagrammi .LSN= inserisci qui la descrizione dell'immagineLSN

Compilare un compilatore

  1. Supponiamo di avere un compilatore incrociato per una nuova lingua L nella lingua di implementazione S che genera codice per la macchina N.

    LSN=
    Diagramma a T per LSN

  2. Supponiamo di avere anche un compilatore S esistente in esecuzione sul codice di implementazione della macchina M per la macchina M:

    SMM=
    Diagramma a T per SMM

  3. Esegui LSN tramite SMM per produrre LMN

Costruzione del compilatore

LMN=LSN+SMM
Diagramma a T per LMN = LSN + SMM


Ho aggiunto alcuni diagrammi a T, che dovrebbero effettivamente rendere più facile capire cosa sta succedendo. Spero che qualcuno possa trovare un modo migliore per renderli.
Dave Clarke,

Risposte:


11

I diagrammi a T (che avevi omesso dalla versione originale della tua domanda) sono cruciali per comprendere questo tipo di domanda. Diamo un'occhiata all'ultimo diagramma a T.

inserisci qui la descrizione dell'immagine

La prima T descrive un compilatore da L a N scritto in S.

La seconda T descrive un compilatore da S a M scritto in M ​​(o in esecuzione su M). Questo sarà il tuo compilatore del compilatore .

Applicando la seconda T alla prima T compila la prima T in modo che funzioni sulla macchina M. Il risultato è quindi un compilatore da L a N in esecuzione sulla macchina M.

Il fatto che la seconda T sia eseguita anche sulla macchina M è la cattura che stai eseguendo il compilatore del compilatore sulla macchina su cui eseguirai il compilatore, piuttosto che dover usare un compilatore incrociato (che sarebbe il caso se la M inferiore fosse diversa ).


5

Significa che compiliamo LSN con SMM, ovvero eseguiamo il codice sorgente di LSN tramite SMM.

Quando SMM compila un codice sorgente, produce un eseguibile per la macchina M, quindi quando compiliamo LSN con SMM otteniamo LMN - un eseguibile, che compila i file sorgente L sulla macchina M per produrre eseguibili per la macchina N.

Forse sarebbe più facile capirlo con un'analogia. Supponiamo di avere un compilatore C ccscritto in Fortran, che genera codice ARM. Supponiamo di avere anche un compilatore Fortran fcsul nostro computer x64. Se compiliamo ccil codice sorgente con fcotteniamo un programma che gira su x64, compila programmi C, ma produce eseguibili per ARM.


0

Per semplificare ....

Nota: Ricorda che il compilatore può essere eseguito solo in una lingua di basso livello.

Nel 1 ° diagramma, il compilatore è scritto in HLL (High Level Langg), quindi in ordine per eseguirlo su una macchina, il langg di implementazione del compilatore dovrebbe essere in LLL.

Quindi, nel 2 ° diagramma, il langg di implementazione del compilatore viene eseguito su un compilatore residente in modo tale che il codice di destinazione possa essere eseguito sulla propria macchina.

Infine, combinando entrambi il compilatore gira su una macchina con langg - M

input langg - L

uscita Langg - N

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.