Компилятор gcc C написан на самом C?


87

Компилятор gcc C написан на самом C? Или это написано на ассемблере? Если компилятор написан на C, то какой компилятор используется для компиляции кода компилятора?


12
Да, это так (в основном). Конечно, для компиляции C необходим компилятор C, поэтому, как и в случае с большинством компиляторов, существует серия этапов «начальной загрузки». Общая идея описана в разделе Установка GCC: Сборка и установка GCC - LFS .

2
Рабочие станции разных брендов в 1980-х и начале 90-х имели свои собственные unix-подобные среды с компилятором C, инструментами и т. Д., Которые все немного отличались друг от друга. Используя исходный код GCC, вы можете выполнить первоначальную компиляцию gcc на одной из этих платформ, а затем несколько раз скомпилировать gcc с самим собой, чтобы более или менее проверить фиксированную точку.
Пол

Ответы:


98

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

Помните, что компилятор C не обязательно должен быть написан на C. Вы можете написать его на Perl, если хотите. Не требуется, чтобы компилятор для данной платформы был изначально написан на этой платформе (встроенные системы почти всегда компилируются на какой-либо другой системе). Так что есть много способов начать работу.

В этом вопросе есть несколько интересных тонкостей, связанных с первым экземпляром начальной загрузки компилятора. Если бы вы были очень умны, вы могли бы использовать этот бутстрап, чтобы сделать что-то невероятное, блестящее и устрашающее .


Ого, вторая статья, на которую вы ссылаетесь, безумно умна.
Ponkadoodle

1
Спасибо за отличную ссылку для начальной загрузки. Я предполагал, что компиляторы всегда писались на более простых языках, вплоть до машинного кода, по какой- то причине. (Например, что, если вы поймете, что двоичный код вашего компилятора содержит ошибку? Это, конечно, гораздо более убедительный пример.) Итак, каковы преимущества написания компилятора на его собственном языке? Беспокоятся ли об этом крайне параноидальные люди и создают ли свои компиляторы без самонастройки?
RoG 09

4
Некоторые языковые группы считают за честь самосовершенствоваться. Недавно Go сделал большой рывок в этом направлении. С другой стороны, Swift в настоящее время не планирует переписывать свой компилятор на Swift. Однако обратите внимание, что GCC всегда был написан на C. Он просто компилировался с другими компиляторами. Но если бы все компиляторы C были написаны на BCPL, это ничего не исправило бы в отношении паранойи. Это просто отодвигает проблему на один шаг назад. (Вы получите те же преимущества паранойи, просто скомпилировав GCC w / clang.)
Роб Нэпьер,

Обратите внимание, что в gcc есть политика, согласно которой основная версия gcc X всегда может быть скомпилирована с основной версией gcc X-1, поэтому любые новые функции, добавленные в компилятор в X, могут использоваться только в самом исходном коде gcc из X + 1. например, у вас должна быть возможность скомпилировать любой gcc версии 9, независимо от младшего номера версии, с любым gcc 8, опять же, независимо от того, какая младшая версия.
Барух

51

Первоначально он был написан на каком-то ассемблере, а затем стал самим собачьим кормом.


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

17
Я думал, что термин был бутстрапом.
Мартин Йорк

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 содержит множество файлов, которые являются частью исходных текстов GCC на C, другие файлы, используемые как часть процесса настройки и сборки, а также подкаталоги, включая документацию и набор тестов.

Ссылка: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.