Нет ли проблемы с куриным яйцом, поскольку GCC написан на самом C ++?

10

Начиная с версии 4.8, компилятор C ++ GCC (часть G ++) написан уже не на C, а на самом C ++. У меня есть гипотетический вопрос по этому вопросу.

Интересно, как скомпилировать код C ++ GCC на новой платформе, у которой еще нет компилятора C ++. Конечно, вы можете использовать готовые двоичные файлы, скомпилированные на других машинах. Или вы можете использовать более старую версию GCC, написанную на C, и скомпилировать с ней текущую версию.

Однако, без готовых двоичных файлов и только самой новой версии, вы застряли, верно? Если нет, есть ли другие последствия для этой ситуации, вызванные переходом с C на C ++ проекта GCC?

Данияр
источник
3
Я не уверен, что вы спрашиваете здесь, хотя вы можете прочитать о кросс-компиляции .
5
Совершенно новая платформа не будет иметь ни компилятора C ++, ни компилятора C. Кросс-компиляция - это ответ.
Док
1
Вы , вероятно , следует прочитать ход GCC, чтобы C ++ , Переход на C ++ и , возможно , обсуждение GCC теперь нужно C ++ , чтобы построить на Reddit. Я не уверен, что gccдо 4.8 можно было построить компилятор C, упакованный с произвольной операционной системой (и это ограничило бы вас C89 на многих).
2
Я не понимаю, что особенного в C ++ для этого вопроса, проблема существует с C или любым другим языком, не так ли?
RemcoGerlich

Ответы:

16

На самом деле это хорошо известная концепция, называемая начальной загрузкой . По сути, где-то существует минимальная кодовая база C для создания версии GCC, способной создавать текущую кодовую базу GCC. Самостоятельные языки делали подобные вещи десятилетиями.

Мейсон Уилер
источник
Вообще-то, нет. Это больше не так (и проблема с вопросом). gccне может быть собрана компилятором только переменного тока. Единственная гарантия компиляции gcc, которую они делают, заключается в том, что gcc-версия N может быть собрана с gcc-версией N-1.
9
@MichaelT: Но более раннюю версию GCC можно построить с помощью компилятора C, который затем может скомпилировать более поздние версии, написанные на C ++, что я и сказал.
Мейсон Уилер
Я также указал бы на вопросы в вопросе: However, without prebuilt binaries and just the newest version, you were stuck, right? If not, are there other implications on this situation raised by the switch from C to C++ of the GCC project?- это предполагает, что у вас нет доступа к предыдущим версиям, и не учитывает другие последствия перехода с C на C ++ для кодовой базы.
9

Создание компилятора, написанного на том же языке, что и компилируемый, называется начальной загрузкой . Статья в Википедии описывает несколько способов загрузки компилятора.

Учитывая ваше ограничение, что у вас есть только исходный код G ++ после 4.8 и нет готовых двоичных файлов для вашей целевой платформы (без существующего компилятора C ++), тогда начальная загрузка компилятора G ++ может быть выполнена с помощью кросс-компиляции .

При начальной загрузке компилятора с использованием кросс-компиляции вы создаете несколько версий своего компилятора.

  1. На вашем компьютере вы устанавливаете компилятор C ++ (может быть любым компилятором C ++, необязательно G ++)
  2. Используя этот компилятор, вы создаете кросс-компилятор G ++, который может выполняться на ПК и генерировать код для целевой платформы.
  3. Используя только что созданный кросс-компилятор G ++, вы создаете собственный компилятор G ++, который может работать на целевой платформе, и создаете для него код.
  4. Вы сделали. Вы создали компилятор C ++ для новой платформы.

Если у вас также нет компьютера (или аналогичного устройства) для выполнения начальных шагов, то вы действительно застряли, но вероятность оказаться в такой ситуации и попытаться запустить компилятор незначительна.

Барт ван Инген Шенау
источник