Pregunta

  

Duplicados posibles:
   ¿Cómo puede el compilador de un lenguaje puede escribir en ese idioma?
   implementar un compilador en “sí”

Yo estaba mirando Rubinius , una implementación de Ruby que compila a bytecode usando un compilador escrito en Ruby. No puedo conseguir mi cabeza alrededor de esto. ¿Cómo se escribe un compilador para un lenguaje en el lenguaje en sí mismo? Parece que sería sólo texto sin nada para compilarlo en un archivo ejecutable, que luego podrían compilar el futuro código escrito en Ruby. Me confundo sólo escribir esa frase. Puede ayudar a nadie explicar esto?

¿Fue útil?

Solución

Para simplificar: primero escribe un compilador para el compilador, en un idioma diferente. A continuación, se compila el compilador, y listo!

Por lo tanto, se necesita algún tipo de lenguaje que ya tiene un compilador - pero ya que hay muchos tal, se puede escribir el compilador compilador de Rubí, por ejemplo, (!) en C, que luego compilar el compilador Ruby, que luego pueden compilar programas Ruby, incluso versiones adicionales de sí mismo.

Por supuesto, los compiladores originales fueron escritos en código de máquina, los compiladores compilados para el montaje, que a su vez compilados los compiladores para, por ejemplo, C o Fortran, que compila los compiladores de ... casi todo. en acción.

El proceso se llama bootstrapping - posiblemente el nombre de la historia del Barón de Münchhausen en el que sacó a sí mismo de un pantano por sus propios medios:)

Otros consejos

En cuanto al arranque de un compilador que vale la pena leer acerca de este truco diabólicamente inteligente.

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

Me confundo sólo leer esa frase.

Puede ser útil pensar en el compilador como traductor, que los compiladores son a menudo llamados. Su objetivo es tomar el código fuente que los humanos pueden leer y traducir en código binario que las computadoras pueden leer. En el caso de Rubinius, el código que se lee pasa a ser el código Ruby, y el código que se convierte en es código de máquina (en realidad, el código máquina LLVM, que es en sí mismo compilado más en código máquina Intel, pero eso es sólo un detalle de fondo) . Rubinius en sí podría haber sido escrito en casi cualquier lenguaje de programación. Simplemente sucedió que se han escrito en el mismo lenguaje que compila.

Por supuesto, se necesita algo para ejecutar Rubinius, en primer lugar, y esto muy probablemente un intérprete regular de Ruby. Nótese, sin embargo, que una vez que son capaces de ejecutar Rubinius de un intérprete, puede pasar que su propio código fuente, y va a crear y ejecutar una versión compilada de sí mismo. Esto se llama arranque, desde la vieja frase, "tirando a sí mismo sin ayuda de nadie".

Una nota final: programas Ruby puede no invoca el código máquina arbitraria. Esa parte de Rubinius es en realidad escrito en C ++.

Bueno, es posible hacerlo en el siguiente orden:

  1. Escribir un compilador en cualquier idioma, por ejemplo C para su código Ruby.
  2. Ahora que se puede compilar el código Ruby, puede escribir un compilador que compila código de rubí y compilar este compilador con el compilador C que anotó en el paso 1. wahh esta frase es extraño!
  3. A partir de ahora se puede compilar todo el código de su rubí con el compilador escrito en 2.:)

Que se diviertan! :)

Un compilador es sólo algo que transforma el código fuente en un archivo ejecutable. Por lo que Doe no importa lo que está escrito en -. Que puede ser el mismo idioma que está compilando o cualquier otro lenguaje de potencia suficiente

La diversión viene cuando usted está escribiendo un compilador para un lenguaje para una plataforma, escrito en el mismo idioma, que todavía no tiene un compilador para el lenguaje de implementación. Sus opciones aquí son para compilar en otra plataforma para el que tiene un compilador, o escribir un compilador en otro idioma, y ??el uso que para compilar el compilador "real".

Es un proceso de 2 pasos:

  1. escribir un compilador de Ruby en alguna otra lanaguage como C, suponiendo un compilador de Ruby aún no existe
  2. ya que ahora tiene un compilador de Rubí, se puede escribir un programa de Ruby que es un (nuevo) Rubí compilador

Desde que alguien ya escribió un compilador Ruby (Matz), que "sólo" tiene que ver la segunda parte. Es más fácil decirlo que hacerlo.

Todas las respuestas hasta el momento han explicado cómo realizar el arranque del compilador mediante el uso de un compilador diferente. Sin embargo, hay una alternativa: la compilación el compilador con la mano. No hay razón para que el compilador ha de ser ejecutado por una máquina, del mismo modo que puede ser ejecutado por un ser humano.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top