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 .
Kompilowanie kompilatora
Załóżmy, że mamy kompilator krzyżowy dla nowego języka L w języku implementacyjnym S generującym kod dla maszyny N.
Załóżmy, że mamy również istniejący kompilator S działający na kodzie implementującym maszynę M dla maszyny M:
Uruchom LSN przez SMM, aby utworzyć LMN
Budowa kompilatora
źródło
Odpowiedzi:
Diagramy T (które pominąłeś w oryginalnej wersji swojego pytania) są kluczowe dla zrozumienia tego rodzaju pytania. Spójrzmy na ostatni T-diagram.
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 ).
źródło
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
cc
napisany w Fortranie, który generuje kod ARM. Załóżmy, że mamy także kompilator Fortranfc
na naszym komputerze x64. Jeśli skompilujemycc
kod źródłowyfc
, otrzymamy program działający na x64, kompiluje programy w C, ale produkuje pliki wykonywalne dla ARM.źródło
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
źródło