Чи написаний компілятор gcc C самою мовою C?


87

Чи написаний компілятор gcc C самою мовою C? Або це написано в Асамблеї? Якщо компілятор написаний на мові C, то для чого компілятор використовується для компіляції коду компілятора?


12
Так (переважно). Звичайно, для компіляції C потрібен компілятор C, тому, як і у більшості компіляторів, існує ряд фаз "завантажувального ремінця". Загальна ідея висвітлена в розділі Встановлення GCC: Побудова та встановлення GCC - LFS .

2
Робочі станції різних брендів у 1980-х та на початку 90-х мали власні Unix-подібні середовища з компілятором c, інструментами тощо ..., які все трохи відрізнялися один від одного. За допомогою джерела GCC ви можете зробити початкову компіляцію gcc на одній із цих платформ, а потім кілька разів скомпілювати gcc із собою, щоб більш-менш перевірити наявність фіксованої точки.
Пол

Відповіді:


98

Конкретна історія gcc подана на Wiki GCC . Більш загальний момент полягає в тому, що компілятори, як правило, спочатку компілюються з яким-небудь іншим компілятором, поки вони не є достатньо потужними для компіляції. Крім того, можна написати базовий компілятор, який може обробляти підмножину ваших функцій в асемблері та створювати звідти. Але знову ж таки, це майже ніколи не потрібно. Доступно безліч компіляторів різними мовами. Навіть коли Стівен Джонсон писав ПКК (один із перших компіляторів С), існували компілятори для мови В, поряд з багатьма іншими мовами. gcc мав кілька компіляторів для вибору, щоб спочатку створити його, і RMS каже, що він використовував компілятор Pastel принаймні під час його початкової розробки.

Пам'ятайте, немає вимоги, щоб компілятор C писався на мові C. Ви можете написати його на Perl, якщо хочете. Немає вимоги, щоб компілятор для даної платформи був написаний на цій платформі (вбудовані системи майже завжди компілюються в якійсь іншій системі). Отже, існує безліч способів витягнути себе з місця.

У цьому питанні є кілька цікавих тонкощів, пов’язаних із першим випадком завантаження компілятора. Якби ви були дуже розумними, ви могли б використати цей бутстрап, щоб зробити щось неймовірне, блискуче та страшне .


Ого, та друга стаття, на яку ви посилалися, шалено розумна.
Ponkadoodle

1
Дякуємо за чудове посилання для завантаження. Я припустив , що компілятори завжди були написані на простих мовах весь шлях назад в машинний код для виду цієї причини. (Наприклад, що, якщо ви зрозумієте, що двійковий файл для вашого компілятора містить помилку? Це, звичайно, набагато сильніший приклад.) То які переваги написання компілятора на його мові? Хіба надзвичайно параноїчні люди переживають з цього приводу і створюють свої компілятори без "самозавантаження"?
RoG

4
Деякі мовні групи вважають знаком честі мати можливість самостійно складатись. Нещодавно Go зробив великий поштовх у цьому напрямку. Swift, з іншого боку, особливо не планує переписувати свій компілятор у Swift. Однак зауважте, що GCC завжди писався на мові C. Він просто складався з іншими компіляторами. Але якби всі компілятори C були написані на BCPL, це нічого не виправило б щодо параної. Це просто зміщує проблему на один крок назад. (Ви отримаєте ті самі переваги параної, просто склавши GCC з ударом.)
Роб Нейпір,

Зверніть увагу, що gcc має політику, згідно з якою основна версія gcc X завжди може бути скомпільована з gcc major version X-1, тому будь-які нові функції, додані до компілятора в X, можуть використовуватися лише у самому джерелі gcc з X + 1. наприклад, ви повинні мати можливість скомпілювати будь-яку версію gcc 9, незалежно від номера другої версії, з будь-якою gcc 8, знову ж таки незалежно від того, яка менша версія.
Барух

51

Спочатку він був написаний якоюсь мовою асамблеї, а потім сам почав їсти собаку.


2
Я не бачив жодних посилань на RMS, що використовує асемблер для початкового завантажувального файлу. Яке ваше джерело для цього? У нього було кілька інших компіляторів для завантаження, тому це здається великою роботою.
Роб Нейпір,

17
Я хоч цей термін був bootstrap.
Мартін Йорк,

7
ха-ха-ха, я прочитав це кілька тижнів тому і подумав, що ти з глузду з'їхав із цим виразом, не усвідомлював, що це стандарт. Гарне шоу, сер! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

Хоча це, очевидно, лише дуже приблизний показник, мені здавсяgcc-5.1.0-src/gcc/ цікавим цей короткий перелік у каталозі. Цей каталог містить основні джерела самого GCC (за винятком бібліотек виконання).

Ось основні кількості файлів (понад 100), згруповані за розширенням, де домінують файли C та 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 

Зверніть увагу, що в даний час GCCйдеться про колекцію компіляторів GNU, а не лише про компілятор GNU C.

6.3 Підкаталог gcc

Каталог gcc містить багато файлів, які є частиною джерел C GCC, інші файли, що використовуються як частина процесу конфігурації та побудови, а також підкаталоги, включаючи документацію та тестовий набір.

Довідково: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.