C está escrito em C, como isso é possível? [duplicado]

40

Eu sei que minha pergunta vai para a caverna da galáxia subterrânea, onde as línguas nascem e envolve alguma matemática lambda e anos-luz de estudos no Google. Mas que tipo de conhecimento é necessário para criar uma linguagem?

    
por H_7 26.03.2012 / 16:45
fonte

4 respostas

76

Procure por "bootstrapping".

Basicamente, você começa com um processo / conjunto de funções mínimo que pode ser usado para compilar o código que define um compilador um pouco mais funcional. Isto cria o seu próximo compilador que então pode ser usado para construir código que pode fazer ainda mais. Você repete esse processo até ter um compilador completo que possa compilar todos os recursos do idioma.

A outra alternativa é escrever a primeira versão do compilador em um idioma diferente e depois escrever a próxima versão em seu idioma de destino.

    
por 26.03.2012 / 16:50
fonte
22

A resposta do ChrisF é excelente, mas eu queria adicionar este exemplo que sempre ficava por mim depois do meu curso de informática sobre bootstrapping.

Suponha que você tenha um compilador C básico que não suporta códigos de escape para seqüências de caracteres ainda, e você queria adicionar isso. Você pode adicionar um snippet de código semelhante a este:

if( str[i] == 0x5c ) {       // ASCII code for backslash
   switch( str[i+1] ) {
      case 'n': return 0x0a; // ASCII code for new line
      case 't': return 0x09; // ASCII code for tab
      // ...                 // more ASCII code for other escapes
      default: return str[i+1];
   }
}

Depois de adicionar isso ao compilador e gerar um novo binário do compilador, você pode reescrever isso em:

if( str[i] == '\' ) { 
   switch( str[i+1] ) {
      case 'n': return '\n';
      case 't': return '\t';
      // ...
      default: return str[i+1];
   }
}

Isso removeria qualquer conhecimento sobre códigos ASCII do código-fonte do compilador, mas o compilador ainda geraria magicamente os códigos corretos.

    
por 26.03.2012 / 18:34
fonte
18

Bootstrapping é definitivamente a maneira padrão de construir um compilador hoje. Mas lembre-se de que você não precisa de um compilador ou interpretador para escrever um programa em um idioma. Por exemplo, Christopher Strachey escreveu um famoso programa de IA que era capaz de jogar Damas em CPL antes de haver um compilador para CPL . Ele teve que traduzir o programa para código de máquina "manualmente", o que é tedioso e propenso a erros, mas não é realmente difícil (é por isso que os computadores podem fazer isso tão bem).

    
por 26.03.2012 / 17:14
fonte
10

Espero que isso não esteja fora do tópico, mas eu queria salientar que, uma vez que você tenha um compilador C para uma plataforma X, o bootstrapping para outras plataformas pode ser feito usando compilação cruzada:

  • Você tem um compilador C c1 para a arquitetura X que é executado na arquitetura X.
  • Você escreve um compilador C c2 para arquitetura Y, escrito em C.
  • Você compila o compilador c2 no X usando c1 e obtém o binário para o compilador c2 que é executado no X.
  • Você usa o binário para c2 que é executado no X para se compilar e obter um binário de c2 que será executado em Y.

Em outras palavras, quando você tem o primeiro ovo, é fácil fazer mais ovos.

    
por 26.03.2012 / 17:48
fonte