Como o primeiro compilador C ++ pode ser escrito em C ++?

46

O Stroustrup afirma que o Cfront, o primeiro compilador C ++, foi escrito em C ++ ( FAQ do Stroustrup ).

No entanto, como é possível que o primeiro compilador C ++ seja escrito em C ++?

O código que compõe o compilador precisa ser compilado também, e assim o primeiro compilador C ++ não poderia ter sido escrito em C ++, poderia?

    
por Pacerier 01.09.2011 / 17:44
fonte

4 respostas

56

A chave está bem aqui:

The first C++ compiler (Cfront) was written in C++. To build that, I first used C to write a "C with Classes"-to-C preprocessor. "C with Classes" was a C dialect that became the immediate ancestor to C++. That preprocessor translated "C with Classes" constructs (such as classes and constructors) into C. It was a traditional preprocessor that didn't understand all of the language, left most of the type checking for the C compiler to do, and translated individual constructs without complete knowledge. I then wrote the first version of Cfront in "C with Classes".

Portanto, a primeira versão do Cfront não foi escrita em C ++, e sim no idioma intermediário. A capacidade de criar compiladores C e pré-processadores diretamente em C levou a muitas das inovações (e brechas de segurança maciças ) em C. Então você escreve seu novo pré-processador que transforma seu código" C com Classes "em C simples (porque C direto pode fazer qualquer coisa) e então você usa" C com Classes "para escrever um compilador de C ++ (não que você não pudesse fazer isto em C, só levaria algum tempo) e então você usa aquele compilador de C ++ para escrever um compilador mais effecient / complete em C ++. Entendeu?

    
por 01.09.2011 / 18:07
fonte
17

Foi bootstrapped. Assim que um recurso C ++ foi adicionado ao cfront, o cfront também poderia usar esse recurso a partir desse ponto (mas não implementar esse mesmo recurso). Isso funcionou porque o cfront tinha a capacidade de converter código C ++ em código C. Então, se alguma nova plataforma for lançada, você pode usar o cfront em outra plataforma para converter cfront de C ++ para C e, em seguida, usar o compilador C da nova plataforma para concluir a compilação de C para o código-objeto.

    
por 01.09.2011 / 18:07
fonte
9

Eu acho que B.S. responde a essa pergunta:

The first C++ compiler (Cfront) was written in C++. To build that, I first used C to write a "C with Classes"-to-C preprocessor. "C with Classes" was a C dialect that became the immediate ancestor to C++. That preprocessor translated "C with Classes" constructs (such as classes and constructors) into C. It was a traditional preprocessor that didn't understand all of the language, left most of the type checking for the C compiler to do, and translated individual constructs without complete knowledge.

I then wrote the first version of Cfront in "C with Classes". Cfront was a traditional compiler that did complete syntax and semantic checking of the C++ source. For that, it had a complete parser, built symbol tables, and built a complete internal tree representation of each class, function, etc. It also did some source level optimization on its internal tree representation of C++ constructs before outputting C. The version that generated C, did not rely on C for any type checking. It simply used C as an assembler. The resulting code was uncompromisingly fast.

Primeiro ele criou algo que ele chamou de "C with Classes" implementado por um simples pré-processador em C. Basicamente era C ++, mas o pré-processador fez pouca ou nenhuma verificação. Ele então usou isso para escrever Cfront, a versão mais poderosa do tradutor de C ++ para C, completa com verificação de tipos, tabelas de símbolos, etc.

    
por 01.09.2011 / 18:08
fonte
2

Adicionaremos essa resposta, pois nenhuma resposta abordou esse aspecto.

Você tecnicamente não precisa de software para compilar código. Contanto que você tenha as especificações necessárias do compilador, você pode fazer a compilação real manualmente. Não é assim que o primeiro compilador C ++ foi compilado. Eu só estou dizendo que é possível.

Compare com a linguagem de montagem. Quando eram usados nos primeiros dias, não havia software assembler para converter o código de montagem em código de máquina. Foi feito à mão, mas a linguagem assembly deu aos programadores uma visão geral melhor.

    
por 20.09.2017 / 00:51
fonte