O compilador gcc C é escrito no próprio C?

87

O compilador gcc C é escrito no próprio C? Ou é escrito em Assembleia? Se o compilador é escrito em C, então o que o compilador é usado para compilar o código do compilador?

euforia83
fonte
12
Sim, é (principalmente). Obviamente, é necessário um compilador C para compilar o C; assim, como ocorre com a maioria dos compiladores, há uma série de fases de "inicialização". A idéia geral é abordada em Instalando o GCC: Construindo e Instalando o GCC - LFS .
2
Estações de trabalho de diferentes marcas na década de 1980 e no início dos anos 90 tinham seus próprios ambientes do tipo Unix com compilador C, ferramentas, etc ... que eram um pouco diferentes uns dos outros. Com o código-fonte do GCC, você pode fazer uma compilação inicial do gcc em uma dessas plataformas e, em seguida, compilar o gcc com ele mesmo algumas vezes para verificar mais ou menos um ponto fixo.
Paulo

Respostas:

98

A história específica do gcc é fornecida no Wiki do GCC . O ponto mais geral é que os compiladores geralmente são compilados originalmente com algum outro compilador até que sejam poderosos o suficiente para se compilarem. Como alternativa, é possível escrever um compilador básico que pode lidar com um subconjunto de seus recursos no assembler e construir a partir daí. Mas, novamente, isso quase nunca é mais necessário. Existem muitos compiladores disponíveis, em uma variedade de idiomas. Mesmo quando Stephen Johnson estava escrevendo pcc (um dos primeiros compiladores C), havia compiladores para B disponíveis, junto com muitas outras linguagens. O gcc tinha vários compiladores para escolher para compilá-lo originalmente, e RMS diz que estava usando o compilador Pastel pelo menos durante seu desenvolvimento inicial.

Lembre-se de que não há requisitos para que um compilador C seja escrito em C. Você poderia escrevê-lo em Perl se quisesse. Não há nenhum requisito de que um compilador para uma determinada plataforma seja originalmente escrito nessa plataforma (sistemas embarcados quase sempre são compilados em algum outro sistema). Portanto, há muitas maneiras de obter um bootstrap.

Esta questão tem algumas sutilezas interessantes relacionadas à primeira instância de bootstrap do compilador. Se você fosse muito inteligente, poderia usar esse bootstrap para fazer algo incrível, brilhante e assustador .

Rob Napier
fonte
Uau, aquele segundo artigo que você vinculou é incrivelmente inteligente.
Ponkadoodle
1
Obrigado pelo ótimo link de bootstrapping. Eu tinha assumido que compiladores sempre foram escritos em linguagens mais simples todo o caminho de volta para código de máquina para tipo de este motivo. (Por exemplo, e se você perceber que o binário do seu compilador contém um erro? Isso fornece um exemplo muito mais forte, é claro.) Então, quais são as vantagens de escrever o compilador em sua própria linguagem? Pessoas extremamente paranóicas se preocupam com isso e constroem seus compiladores sem "auto" inicialização?
RoG de
4
Alguns grupos linguísticos consideram uma marca de honra serem capazes de se compilar. Go recentemente deu um grande impulso nessa direção. Swift, por outro lado, notavelmente não tem planos atuais de reescrever seu compilador em Swift. Observe, entretanto, que o GCC sempre foi escrito em C. Ele apenas foi compilado com outros compiladores. Mas se todos os compiladores C fossem escritos em BCPL, isso não resolveria nada em relação à paranóia. Isso apenas leva a questão um passo atrás. (Você obteria os mesmos benefícios de paranóia apenas compilando o GCC com clang.)
Rob Napier,
Observe que o gcc tem uma política de que a versão principal X do gcc sempre pode ser compilada com a versão principal do gcc X-1, portanto, quaisquer novos recursos adicionados ao compilador no X só podem ser usados ​​no próprio código-fonte do gcc do X + 1. por exemplo, você deve ser capaz de compilar qualquer gcc versão 9, não importa qual seja o número da versão secundária, com qualquer gcc 8, novamente não importa qual seja a versão secundária.
Baruch
51

Originalmente, foi escrito em alguma linguagem de montagem, em seguida, começou a se alimentar de cachorro.

Daniel A. White
fonte
2
Eu não vi nenhuma referência ao RMS usando assembler para o bootstrap original. Qual é a sua fonte para isso? Ele tinha vários outros compiladores para inicializar, então isso parece muito trabalhoso.
Rob Napier,
17
Achei que o termo fosse bootstrap.
Martin York
7
hahaha Eu li isso há algumas semanas e pensei que você estava louco com aquela expressão, não sabia que era o padrão. Bom show senhor! en.wikipedia.org/wiki/Eating_your_own_dog_food
3

Embora este seja obviamente apenas um indicador muito aproximado, achei esta lista rápida no gcc-5.1.0-src/gcc/diretório interessante. Este diretório contém as principais fontes do próprio GCC (exceto para bibliotecas em tempo de execução).

Aqui estão as principais contagens de arquivos (mais de 100) agrupadas por extensão dominada por arquivos C e 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 

Observe que hoje em dia GCCse refere à GNU Compiler Collection, não apenas ao GNU C Compiler.

6.3 O subdiretório gcc

O diretório gcc contém muitos arquivos que fazem parte das fontes C do GCC, outros arquivos usados ​​como parte do processo de configuração e construção e subdiretórios incluindo documentação e um conjunto de testes.

Referência: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

oo_miguel
fonte