2013-08-15 11 views
40

To pytanie może wynikać z niezrozumienia kompilatorów z mojej strony, ale tu idzie ...W jaki sposób można napisać kompilator C w C?

można znaleźć następujące stwierdzenie w przedmowie do pierwszego wydania K & R (strona xi):

System operacyjny kompilator C i zasadniczo wszystkie aplikacje programy UNIX (w tym całe oprogramowanie użyte do przygotowania tej książki) są napisane w C.

(podkreślenie moje)

Oto, czego nie rozumiem: czy kompilator C nie musi być skompilowany, zanim będzie mógł skompilować dowolny kod C? A jeśli ten kompilator C jest napisany w C, czy jego kompilacja nie wymagałaby już istniejącego kompilatora C ?!

Jedynym wyjściem z tej zagadki nieskończonej regresji (lub problemu z kurczakiem i jajkiem) jest to, że kompilator C napisany w C, który K & R został faktycznie skompilowany z już istniejącym kompilatorem C, który został napisany w języku innym niż C. Kompilator C napisany w C zastąpił to drugie.

Czy jestem całkowicie wyłączony?

+1

Cóż, zaczynasz od jednego w złożeniu lub cokolwiek innego, a gdy już to zrobisz, możesz użyć go do zrobienia jednego w C i tak dalej. – chris

Odpowiedz

28

Nazywa Bootstrapping, cytując z Wikipedii:

Jeśli ktoś potrzebuje kompilator dla języka X do uzyskania kompilator dla języka X (który jest napisany w języku X), skąd pierwszy kompilator uzyskać pisemną? Możliwe metody do rozwiązania tego problemu kurczaka lub jajko obejmują:

  1. Wdrożenie interpreter lub kompilator dla języka X w języku Y. Niklaus Wirth poinformował, że napisał pierwszy kompilator Pascala w Fortran.
  2. Inny interpreter lub kompilator dla X został już napisany w innym języku Y; tak jest często uruchamiany przez Scheme.
  3. Wcześniejsze wersje kompilatora zostały napisane w podzbiorze X dla , w którym istniał inny kompilator; w ten sposób niektóre z nadzorów Java, Haskell i początkowego kompilatora Free Pascal są bootstrapped .
  4. Kompilator dla X został skompilowany z innej architektury, gdzie istnieje kompilator dla X; tak kompilatory dla C są zwykle zwykle przenoszone na inne platformy. Jest to również metoda używana dla darmowego Pascala po początkowym ładowaniu początkowym.
  5. Pisanie kompilatora w X; następnie ręcznie skompilowano go ze źródła (większość w niezoptymalizowany sposób) i uruchomiono to na kodzie, aby uzyskać zoptymalizowany kompilator . Donald Knuth używał tego w swoim systemie programowania WEB piśmienniczej .

A jeśli jesteś zainteresowany, here jest pierwszym źródłem kompilatora C Dennisa Richie.

8

Zobacz sekcję jajka i kury na Wikipedia page:

Jeśli ktoś potrzebuje kompilator dla języka X, aby uzyskać kompilator dla języka X (który jest napisany w języku X), skąd pierwszy kompilator uzyskać pisemną? Możliwe metody do rozwiązania tego problemu kurczaka lub jajko obejmują:

  • Wdrożenie interpreter lub kompilator dla języka X językiem Y. Niklaus Wirth poinformował, że on napisał pierwszy kompilator Pascala w Fortran.
  • Inny interpreter lub kompilator dla X został już napisany w innym języku Y; tak jest często uruchamiany przez Scheme.
  • Wcześniejsze wersje kompilatora zostały napisane w podzbiorze X, dla którego istniał inny kompilator; Oto, w jaki sposób niektóre z nadzorów Java, Haskell i początkowy kompilator Free Pascal są bootstrapped.
  • Kompilator dla X został skompilowany z innej architektury, w której istnieje kompilator dla X; tak kompilatory C są zwykle przenoszone na inne platformy. Jest to również metoda używana dla Free Pascala po początkowym bootstrapie.
  • Pisanie kompilatora w X; następnie ręcznie kompiluje go ze źródła (najprawdopodobniej w sposób niezoptymalizowany) i uruchamia na kodzie, aby uzyskać zoptymalizowany kompilator. Donald Knuth użył tego do swojego systemu programowania literackiego WEB.
+0

Pascal cuoq ... \t W pierwszym punkcie, język Y powinien mieć najpierw kompilator, prawda? Myślę, że języki takie jak Clojure zostały napisane w ten sposób. Czy mógłbyś wyjaśnić "ręczne kompilowanie"? – AV94

5

Zwykle pierwszy kompilator jest napisany w innym języku (bezpośrednio w asemblatorze PDP11 w tym przypadku lub w C dla większości "nowoczesnych" języków). Następnie ten pierwszy kompilator jest używany do programowania kompilatora napisanego w samym języku.

Możesz przeczytać tę page o historii języka C. Przekonasz się, że jest również silnie powiązany z systemem UNIX.

+0

Zachowaj ostrożność przy transporcie prawd z 1970 roku do dnia dzisiejszego. GCC przełączyło się na C++ :-) –

+0

Hmmm, GCC w C++ ... Jestem trochę niepewny (i przerażony! :-)). – perror

+0

http://gcc.gnu.org/gcc-4.8/changes.html pierwsza linia. –

5

To zupełnie zwyczajne, że kompilator jest napisany w języku, który kompiluje. Jednym ze sposobów osiągnięcia tego byłoby napisanie kompletnego kompilatora dla języka L w innym języku, a następnie napisanie nowego kompilatora dla L w L. Bardziej interesującym podejściem byłoby napisanie minimalnego kompilatora dla podzbioru L w niektórych językach. inny język, a następnie użyj tego minimalnego podzestawu, aby ulepszyć kompilator, czyniąc go mniej minimalnym zwiększeniem dostępnego podzbioru L. W ten sposób można zbudować kompletny kompilator.

Powiązane problemy