Pergunta

Possíveis duplicatas:
Como o compilador de um idioma pode ser escrito nesse idioma?
implementando um compilador em "em si"

Eu estava olhando para Rubinius, uma implementação do Ruby que compila com bytecode usando um compilador escrito no Ruby. Não consigo entender isso. Como você escreve um compilador para um idioma no próprio idioma? Parece que seria apenas um texto sem nada para compilá -lo em um executável que poderia compilar o código futuro escrito em Ruby. Fico confuso apenas digitando essa frase. Alguém pode ajudar a explicar isso?

Foi útil?

Solução

Para simplificar: você primeiro escreve um compilador para o compilador, em um idioma diferente. Em seguida, você compila o compilador e pronto!

Então, você precisa de algum tipo de linguagem que já tenha um compilador - mas como existem muitos, você pode escrever o compilador Ruby Compiler (!) Por exemplo, em C, que então compilará o compilador Ruby, que pode então compilar programas de rubi, ainda mais versões de si.

Obviamente, os compiladores originais foram escritos em código de máquina, compiladores compilados para montagem, que por sua vez compilam compiladores para o EG C ou Fortran, que compilam compiladores para ... praticamente tudo. Desenvolvimento iterativo em ação.

O processo é chamado Bootstrapping - Possivelmente nomeado após a história do Barão Munchhausen, na qual ele se afastou de um pântano por seus próprios bootstraps :)

Outras dicas

Em relação ao bootstrapping de um compilador, vale a pena ler sobre esse hack diabolicamente inteligente.

http://catb.org/jargon/html/b/back-door.html

Fico confuso apenas lendo essa frase.

Pode ajudar a pensar no compilador como um tradutor, que os compiladores são frequentemente chamados. Seu objetivo é levar o código -fonte que os humanos podem ler e traduzi -lo em código binário que os computadores podem ler. No caso de Rubinius, o código que ele lê é o código Ruby e o código em que ele o converte é o código da máquina (na verdade, o código da máquina LLVM, que é compilado ainda mais no código da máquina Intel, mas esse é apenas um detalhe de fundo) . O próprio Rubinius poderia ter sido escrito em praticamente qualquer linguagem de programação. Por acaso, foi escrito no mesmo idioma que ele compila.

Obviamente, você precisa de algo para executar Rubinius em primeiro lugar, e isso provavelmente um intérprete regular de rubi. Observe, no entanto, que, uma vez que você puder executar o Rubinius em um intérprete, poderá passar seu próprio código -fonte e ele criará e executará uma versão compilada de si mesma. Isso é chamado de bootstrapping, da antiga frase, "puxando -se pelas bootstraps".

Uma nota final: os programas Ruby não podem invocar o código da máquina arbitrária. Essa parte de Rubinius é realmente escrita em C ++.

Bem, é possível fazer isso na seguinte ordem:

  1. Escreva um compilador em qualquer idioma, digamos C para o seu código Ruby.
  2. Agora que você pode compilar o código Ruby, você pode escrever um compilador que compila o código do Ruby e compile este compilador com o compilador C que você escreveu na Etapa 1. wahh esta frase é estranha!
  3. A partir de agora, você pode compilar todo o seu código Ruby com o compilador escrito em 2. :)

Divirta-se! :)

Um compilador é apenas algo que transforma o código -fonte em um executável. Portanto, não importa em que esteja escrito - pode ser o mesmo idioma que está compilando ou qualquer outro idioma de poder suficiente.

A diversão vem quando você está escrevendo um compilador para um idioma para uma plataforma, escrita no mesmo idioma, que ainda não possui um compilador para o seu idioma de implementação. Suas opções aqui devem compilar em outra plataforma para a qual você possui um compilador ou escreva um compilador em outro idioma e use -o para compilar o compilador "real".

É um processo de 2 etapas:

  1. Escreva um compilador de rubi em algum outro lanaguage como C, assumindo que um compilador de rubi ainda não existe
  2. Como agora você tem um compilador de rubi, você pode escrever um programa de rubi que é um (novo) compilador de rubi

Como alguém já escreveu um Ruby Compiler (MATZ), você "apenas" precisa fazer a segunda parte. Mais fácil falar do que fazer.

Todas as respostas até agora explicaram como inicializar o compilador usando um compilador diferente. No entanto, há uma alternativa: compilando o compilador manualmente. Não há razão para que o compilador deve ser executado por uma máquina, ele também pode ser executado por um humano.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top