Schemat T kompilatora krzyżowego

9

Studiuję Bootstrapping z Red Dragon Book Compilers i znalazłem schemat T dla kompilatora krzyżowego dość mylący. Nie rozumiem, co należy rozumieć przez „Uruchamianie kompilatora 1 do kompilatora 2”. Czy ktoś może podać jakieś lepsze wyjaśnienie, analogię lub przykład odnoszący się do jakiegoś kompilatora w świecie rzeczywistym?

Najpierw notacja. Przez Znaczy kompilator dla języka w języku , która produkuje kodu język wyjściowy / ekspres . To jest nagrobek lub T-diagramy .LSN= wprowadź opis zdjęcia tutajLSN

Kompilowanie kompilatora

  1. Załóżmy, że mamy kompilator krzyżowy dla nowego języka L w języku implementacyjnym S generującym kod dla maszyny N.

    LSN=
    Schemat T dla LSN

  2. Załóżmy, że mamy również istniejący kompilator S działający na kodzie implementującym maszynę M dla maszyny M:

    SMM=
    Schemat T dla SMM

  3. Uruchom LSN przez SMM, aby utworzyć LMN

Budowa kompilatora

LMN=LSN+SMM
Schemat T dla LMN = LSN + SMM

Raphael
źródło
Dodałem kilka T-diagramów, które powinny ułatwić zrozumienie, co się dzieje. Mam nadzieję, że ktoś może wymyślić lepszy sposób ich renderowania.
Dave Clarke

Odpowiedzi:

11

Diagramy T (które pominąłeś w oryginalnej wersji swojego pytania) są kluczowe dla zrozumienia tego rodzaju pytania. Spójrzmy na ostatni T-diagram.

wprowadź opis zdjęcia tutaj

Pierwszy T opisuje kompilator od L do N napisany w S.

Drugi T opisuje kompilator od S do M napisany w M (lub działający na M). To będzie twój kompilator kompilatora .

Zastosowanie drugiej litery T do pierwszej litery T powoduje skompilowanie pierwszej litery T, dzięki czemu działa ona na maszynie M. W rezultacie powstaje kompilator od L do N działający na maszynie M.

Fakt, że drugi T działa również na komputerze M, pokazuje, że uruchamiasz kompilator kompilatora na komputerze, na którym uruchomisz kompilator, zamiast konieczności korzystania z kompilatora krzyżowego (co miałoby miejsce, gdyby dolny M był inny ).

Dave Clarke
źródło
5

Oznacza to, że kompilujemy LSN z SMM, czyli uruchamiamy kod źródłowy LSN przez SMM.

Kiedy SMM kompiluje jakiś kod źródłowy, tworzy plik wykonywalny dla maszyny M, więc kiedy kompilujemy LSN z SMM, otrzymujemy LMN - plik wykonywalny, który kompiluje pliki źródłowe L na maszynie M w celu wygenerowania plików wykonywalnych dla maszyny N.

Być może łatwiej byłoby to zrozumieć za pomocą analogii. Załóżmy, że mamy kompilator C ccnapisany w Fortranie, który generuje kod ARM. Załóżmy, że mamy także kompilator Fortran fcna naszym komputerze x64. Jeśli skompilujemy cckod źródłowy fc, otrzymamy program działający na x64, kompiluje programy w C, ale produkuje pliki wykonywalne dla ARM.

Daniil
źródło
0

Upraszczając ...

Uwaga: Pamiętaj, że kompilator może działać tylko w języku niskiego poziomu.

Na 1. schemacie kompilator jest napisany w języku HLL (High Level Langg), więc aby uruchomić go na komputerze, język kompilacji implementacji powinien znajdować się w języku LLL.

Na drugim diagramie język implementacji kompilatora jest uruchamiany na kompilatorze samowystarczalnym, dzięki czemu kod docelowy może działać na własnej maszynie.

Na koniec, łącząc oba z nich, kompilator działa na komputerze z langg - M

langg wejściowy - L

wyjście Langg - N

Zabaw mnie
źródło