Як завантажуються завантажувальні програми GCC та g ++?


186

Це мене клопоче вже деякий час. Як складаються GCC та g ++?

Я здогадуюсь, що кожна редакція збирається з попередньо побудованою версією. Це правда? І якщо це так, чи означає це, що найдавніші версії g ++ та GCC були написані на зборах?


13
Кожна редакція, нарешті, може бути складена сама собою. :)
Мартін Геннінгс

4
Це цікаво прочитати, якщо ви хочете побачити, як виникли перші компілятори.
parkovski

1
@parkovski Посилання померло?
Nubcake

Посилання востаннє бачилось
akraf

Відповіді:


175

Найдавніша версія GCC була складена за допомогою іншого компілятора C, оскільки були й інші, коли вони писалися. Найперший компілятор С коли-небудь (ок. 1973, IIRC) був реалізований або в монтажі PDP-11 , або в мові програмування B, яка передувала йому, але в будь-якому випадку компілятор B був написаний у зборі.Аналогічно, перший у світі компілятор C ++ (CPre / Cfront , 1979-1983), ймовірно, спочатку був реалізований у C, потім переписаний у C ++.

Коли ви компілюєте GCC або будь-який інший компілятор, що самостійно хостинг, повний порядок створення:

  1. Створіть нову версію GCC з існуючим компілятором C
  2. відновити нову версію GCC з тією, яку ви тільки що створили
  3. (необов’язково) повторіть крок 2 для перевірки.

Цей процес називається завантажувальним . Він перевіряє можливість компілятора самостійно компілювати і гарантує, що отриманий компілятор побудований з усіма оптимізаціями, які він сам реалізує.

EDIT : Дрю Дорман у коментарях вказує на рахунок Б'ярна Струструпа якнайшвидшого впровадження C ++ . Він був реалізований на C ++, але перекладений тим, що Stroustrup називає "препроцесором" з C ++ до C; не повний компілятор за його визначенням, але все-таки C ++ був завантажений у C.


19
3-х ступінчаста версія процесу збирання завантажувального пристрою справді є для перевірки: сам компілятор використовується як власний тестовий випадок. GCC зібрані з [іншими] повинен виробляти ті ж результати (ідентичні бінарні файли, дисконтування макроси , як __DATE__і __TIME__які змінюються навіть між викликами же компілятором) , як GCC , зібраних з допомогою [GCC скомпільованої з [іншими]] - якщо немає, то це помилка, і 3-ступінчаста збірка завантажувача призначена для цього.
pmdj

19
@pmjordan: "якщо ні, то це помилка" або, що менш вірогідно, підступний задній простір у процесі впровадження ("Роздуми про довіру довіри").
Стів Джессоп

12
@sleske: це неправда. Бінарний вихід кроку 2 повинен бути ідентичним двійковому виходу кроку 3, інакше десь є помилка. Причина, як говорить pmjordan: NewCompiler1 і NewCompiler2 - це програми з однаковим джерелом (у NewCompiler). Їм надається однаковий вхід (джерело для NewCompiler). Тому вони даватимуть однаковий вихід незалежно від того, з яким компілятором вони самі були складені (у цьому випадку NewCompiler1 був зібраний із OldCompiler, а NewCompiler2 - з NewCompiler1). Тобто NewCompiler2 та NewCompiler3 є бінарними однаковими.
Стів Джессоп

12
Я коли-небудь замислювався: Що робити, якщо ми втратили всі бінарні файли компілятора C? І довелося завантажуватися з нуля? Ось як би я пішов з цього приводу: Є компілятор Tiny C (який насправді може компілювати ядро ​​Linux, тож він є повнофункціональним). Усі вихідні файли C складають лише 30 тис. Рядків коду, включаючи коментарі. Хоча навіть це було певними зусиллями, хтось, хто розуміє C, може дізнатися з джерел, як генерувати бінарний вихід і "компілювати" джерела TCC з рук (я тут справді думаю про перфокарти). Потім перекомпілюйте TCC з цим і використовуйте його для завантаження GCC або подібного.
datenwolf

11
@datenwolf: щось подібне, так. Якщо ми можемо припустити, що ми втратили всі бінарні файли компілятора C, але у нас все ще є асемблер, то ми можемо написати програму асемблера TinyTinyC. Це був би менш повний функціональний компілятор C, ніж TinyC: нам це не потрібно, щоб ми могли компілювати GCC або Linux ядро, нам потрібен лише він, щоб можна було компілювати TinyC. Потім запустіть його на джерелі TinyC, що дає нам компілятор C, здатний компілювати Linux (і, сподіваємось, glibc та GCC), і ми працюємо. Якщо у нас навіть немає асемблера, ми спочатку завантажимо один із них, це простіше, ніж компілятор C.
Стів Джессоп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.