Czy kompilator gcc C jest napisany w samym C?

87

Czy kompilator gcc C jest napisany w samym C? Czy jest napisane w Zgromadzeniu? Jeśli kompilator jest napisany w C, to jaki jest kompilator używany do kompilowania kodu kompilatora?

euforia83
źródło
12
Tak, jest (w większości). Oczywiście do skompilowania C potrzebny jest kompilator C, więc podobnie jak w przypadku większości kompilatorów występuje szereg faz „boot-strap”. Ogólny pomysł omówiono w Installing GCC: Building and Installation of GCC - LFS .
2
Stacje robocze różnych marek w latach 80-tych i wczesnych 90-tych miały swoje własne środowiska uniksopodobne z kompilatorem c, narzędziami itp., Które różniły się nieco od siebie. Ze źródłami GCC możesz dokonać wstępnej kompilacji gcc na jednej z tych platform, a następnie skompilować gcc ze sobą kilka razy, aby mniej więcej sprawdzić ustalony punkt.
Paul,

Odpowiedzi:

98

Specyficzna historia gcc jest podana na GCC Wiki . Bardziej ogólnym punktem jest to, że kompilatory są generalnie pierwotnie kompilowane z innym kompilatorem, dopóki nie będą wystarczająco mocne, aby się skompilować. Alternatywnie, możliwe jest napisanie podstawowego kompilatora, który może obsłużyć podzbiór twoich funkcji w asemblerze i zbudować go z tego miejsca. Ale znowu, prawie nigdy nie jest to już potrzebne. Dostępnych jest wiele kompilatorów w różnych językach. Nawet kiedy Stephen Johnson pisał pcc (jeden z pierwszych kompilatorów C), były dostępne kompilatory dla B, wraz z wieloma innymi językami. gcc miał kilka kompilatorów do wyboru, aby go pierwotnie zbudować, a RMS twierdzi, że korzystał z kompilatora Pastel przynajmniej podczas początkowego rozwoju.

Pamiętaj, nie ma wymogu, aby kompilator C był napisany w C. Mógłbyś napisać go w Perlu, gdybyś chciał. Nie ma wymogu, aby kompilator dla danej platformy był oryginalnie napisany na tej platformie (systemy wbudowane prawie zawsze są kompilowane na innym systemie). Jest więc wiele sposobów, aby dać się złapać.

To pytanie ma kilka interesujących subtelności związanych z pierwszym uruchomieniem kompilatora. Gdybyś był bardzo sprytny, mógłbyś wykorzystać ten bootstrap do zrobienia czegoś niesamowitego, genialnego i przerażającego .

Rob Napier
źródło
Woah, ten drugi artykuł, do którego utworzyłeś link, jest niesamowicie sprytny.
Ponkadoodle
1
Dzięki za świetny link do bootstrapu. Przypuszczałem, że kompilatory były zawsze napisane w prostszych języków całą drogę z powrotem do kodu maszynowego do rodzaju tego powodu. (Na przykład, co się stanie, jeśli zdasz sobie sprawę, że plik binarny dla twojego kompilatora zawiera błąd? Zapewnia to oczywiście znacznie mocniejszy przykład). Jakie są zatem zalety pisania kompilatora w jego własnym języku? Czy bardzo paranoiczni ludzie martwią się tym i budują swoje kompilatory bez "samoczynnego" ładowania się?
RoG
4
Niektóre grupy językowe uważają, że umiejętność samodzielnej kompilacji jest wyróżnieniem. Go ostatnio zrobił duży krok w tym kierunku. Z drugiej strony Swift w szczególności nie ma obecnie planów przepisywania swojego kompilatora w Swift. Zauważ jednak, że GCC zawsze było pisane w C. Zostało po prostu skompilowane z innymi kompilatorami. Ale gdyby wszystkie kompilatory C zostały napisane w BCPL, nie naprawiłoby to niczego związanego z paranoją. Po prostu cofa sprawę o jeden krok. (Te same korzyści związane z paranoją uzyskasz, kompilując GCC w / clang.)
Rob Napier,
Zauważ, że gcc ma zasadę, że główna wersja X gcc zawsze może być skompilowana z wersją główną gcc X-1, więc wszelkie nowe funkcje dodane do kompilatora w X mogą być użyte tylko w samym źródle gcc z X + 1. np. powinieneś być w stanie skompilować dowolną wersję 9 gcc, bez względu na numer wersji podrzędnej, z dowolnym gcc 8, znowu bez względu na wersję podrzędną.
Baruch
51

Pierwotnie był napisany w jakimś języku asemblerowym, potem sam zaczął produkować karmę dla psów.

Daniel A. White
źródło
2
Nie widziałem żadnych odniesień do RMS używającego assemblera dla oryginalnego bootstrapa. Jakie jest twoje źródło tego? Miał kilka innych kompilatorów do załadowania, więc wydaje się, że to dużo pracy.
Rob Napier,
17
Myślałem, że to określenie to bootstrap.
Martin York,
7
hahaha Czytałem to kilka tygodni temu i myślałem, że zwariowałeś z tym wyrażeniem, nie zdawałem sobie sprawy, że to standard. Dobry wieczór panie! pl.wikipedia.org/wiki/Eating_your_own_dog_food
3

Chociaż jest to oczywiście tylko bardzo przybliżony wskaźnik, uznałem tę szybką listę w gcc-5.1.0-src/gcc/katalogu za interesującą. Ten katalog zawiera główne źródła samego GCC (z wyjątkiem bibliotek wykonawczych).

Oto najważniejsze liczby plików (ponad 100) pogrupowane według rozszerzenia zdominowanego przez pliki C i C ++.

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

Zwróć uwagę, że obecnie GCCodnosi się do kolekcji kompilatorów GNU, a nie tylko do kompilatora GNU C.

6.3 Podkatalog gcc

Katalog gcc zawiera wiele plików, które są częścią źródeł C GCC, inne pliki używane jako część procesu konfiguracji i budowania oraz podkatalogi, w tym dokumentację i pakiet testowy.

Źródła: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

oo_miguel
źródło