Pregunta

He oído hablar de la idea de configurar un lenguaje, es decir, escribir un compilador/intérprete para el lenguaje en sí mismo.Me preguntaba cómo podía ser logrado, y miró a su alrededor un poco, y vi a alguien decir que sólo puede ser realizado por cualquiera de las

  • la escritura de un primer compilador para un lenguaje diferente.
  • de la mano de codificación de un primer compilador en la Asamblea, que parece como un caso especial de la primera

Para mí, ninguno de estos parece ser en realidad bootstrapping un lenguaje en el sentido de que ambos requieren de apoyo externo.Hay una manera de escribir un compilador en su propio idioma?

¿Fue útil?

Solución

Hay una manera de escribir un compilador en su propio idioma?

Usted han para tener algunos de los actuales lenguaje para escribir su nuevo compilador.Si estuviera escribiendo una nueva, digamos, el compilador de C++, sólo se puede escribir en C++ y compilar con el compilador de primera.Por otro lado, si se crea un compilador para un lenguaje nuevo, vamos a llamar a Yazzleof, usted tendrá que escribir el nuevo compilador en otro idioma primero.En general, esto sería otro lenguaje de programación, pero no tiene que ser.Puede ser de la asamblea, o si es necesario, el código máquina.

Si fueron va a arrancar un compilador para Yazzleof, usted generalmente no escribir un compilador para el lenguaje pleno inicialmente.En su lugar sería escribir un compilador para Yazzle-lite, el más pequeño posible subconjunto de la Yazzleof (bueno, un bastante pequeño subconjunto al menos).A continuación, en Yazzle-lite, habría que escribir un compilador para el lenguaje pleno.(Obviamente, esto puede ocurrir de forma iterativa, en lugar de en un salto.) Porque Yazzle-lite es un subconjunto de Yazzleof, ahora tiene un compilador que se puede compilar en sí.

Hay un realmente buena valoración crítica acerca de arranque de un compilador desde el nivel más bajo posible (que en una moderna máquina es básicamente un editor hexadecimal), titulado Arranque de un simple compilador de la nada.Se puede encontrar en https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html.

Otros consejos

La explicación que he leído es correcto.Hay una discusión de esto en Compiladores:Principios, Técnicas y Herramientas (el Dragón Libro):

  • Escribir un compilador C1 de idiomas X en el lenguaje Y
  • Utilizar el compilador de C1 a escribir el compilador de C2 en el idioma X en X idioma
  • Ahora C2 es un auto totalmente el entorno de hosting.

Una super interesante la discusión de este es en Unix co-creador Ken Thompson's Premio Turing la charla.

Empieza con:

Lo que voy a describir es uno de los muchos "huevo y la gallina" los problemas que surgen cuando los compiladores están escritos en su propio idioma.En esta facilidad, voy a utilizar un ejemplo concreto de que el compilador de C.

y procede a mostrar cómo escribió una versión de Unix compilador de C que siempre le permiten iniciar sesión sin contraseña, ya que el compilador de C se reconoce el programa de inicio de sesión y agregar en el código especial.

El segundo modelo está orientado a que el compilador de C.El código de sustitución es la Etapa I de la auto-reproducción de programa que inserta tanto en caballos de Troya en el compilador.Esto requiere de una fase de aprendizaje como en la Etapa II ejemplo.Primero debemos compilar el fuente modificado con el normal compilador de C para producir un intervenidas binario.Podemos instalar esta binario como el oficial de la C.Ahora podemos eliminar los errores de la fuente del compilador y el nuevo binario se vuelva a insertar los errores cada vez que se compila.Por supuesto, el comando de inicio de sesión seguirá siendo intervenida con ningún rastro en la fuente en cualquier lugar.

La manera en la que he oído hablar de es escribir un extremadamente limitada compilador en otro idioma, a continuación, utilizarlo para compilar una más complicado que la versión, escrita en el nuevo idioma.Esta segunda versión puede entonces ser utilizado para compilar sí mismo, y en la próxima versión.Cada vez que se compila la última versión que se utiliza.

Esta es la definición de bootstrapping:

el proceso de un sistema simple activación de un sistema más complicado que sirve para el mismo propósito.

EDITAR:El Artículo de Wikipedia sobre el compilador de arranque cubre el concepto mejor que yo.

Echa un vistazo podcast Ingeniería de Software de la Radio episodio 61 (2007-07-06) que describe el compilador GCC interna, así como el GCC proceso de arranque.

Donald E.Knuth en realidad construida WEB por escrito el compilador en ella, y entonces la mano-compilado a la asamblea o código máquina.

Como yo lo entiendo, la primera Lisp intérprete fue bootstrap con la mano-compilación de las funciones de constructor y el token de lector.El resto de la intérprete, a continuación, lea en de la fuente.

Tú mismo puedes comprobar por la lectura de los originales McCarthy papel, Funciones recursivas de Expresiones Simbólicas y Computación por la Máquina, Parte I.

Otra alternativa es crear un código de bytes de la máquina para su idioma (o utilizar uno existente si sus características no son muy inusual) y escribir un compilador a código de bytes, ya sea en el código de bytes, o en el idioma que desee utilizar otro intermedio, como un analizador de la herramienta con la que las salidas de la AST como XML, a continuación, compile el código XML en el código de bytes usando XSLT (o de otro patrón de idioma correspondiente y basada en el árbol de la representación).No elimina la dependencia de otro idioma, pero podría significar que más de la bootstrapping trabajo termina en el sistema final.

Es la ciencia de la computación de la versión de la del huevo y la gallina paradoja.No puedo pensar en una manera de no escribir la inicial compilador de ensamblador o algún otro idioma.Si se podría haber hecho, yo debería de Lisp podría haber hecho.

En realidad, creo que Lisp casi califica.Echa un vistazo su entrada en la Wikipedia.Según el artículo, el Lisp función eval podría ser implementado en un IBM 704 en código de máquina, con un completo compilador (escrito en Lisp sí mismo), que surge en 1962, en MIT.

Cada ejemplo de arranque de un lenguaje que puedo pensar (C, PyPy) fue hecho después de que hubo un trabajo de compilador.Usted tiene que comenzar en alguna parte, y reimplementing un lenguaje en sí mismo, requiere escribir un compilador en otro idioma primero.

¿De qué otra manera podría funcionar?Yo no creo que sea incluso conceptualmente posible hacerlo de otra manera.

Algunos bootstrap compiladores o sistemas de conservar tanto el origen de la forma y la forma de los objetos en su repositorio:

  • ocaml es un lenguaje que tiene un intérprete de bytecode (es decir,un compilador para Ocaml bytecode) y un compilador nativo (x86-64 o el BRAZO, etc...ensamblador).Su repositorio svn contiene tanto el código fuente (archivos de */*.{ml,mli}) y el código de bytes (archivo boot/ocamlc forma del compilador.Así que cuando usted construye es el primer uso de su código de bytes (de una versión anterior del compilador) para compilar sí mismo.Más tarde, el recién compilado a código de bytes es capaz de compilar el compilador nativo.Así Ocaml repositorio svn contiene *.ml[i] los archivos de origen y la boot/ocamlc archivo de código de bytes.

  • El el óxido compilador de descargas (el uso de wget, por lo que necesita una conexión a Internet) una versión anterior de su binario para compilar sí mismo.

  • DERRETIR es un Lisp como lenguaje para personalizar y ampliar GCC.Es traducido a código C++ por un bootstrap traductor.Generar el código C++ de que el traductor se distribuye, por lo que el repositorio svn contiene *.melt los archivos de origen y melt/generated/*.cc "objeto" archivos del traductor.

  • J. Pitrat del CAIA sistema de inteligencia artificial es totalmente auto-generación.Está disponible como una colección de miles de [A-Z]*.c los archivos generados (también con una generados dx.h archivo de encabezado) con una colección de miles de _[0-9]* archivos de datos.

  • Varias Esquema de compiladores son también bootstrap.Scheme48, Pollo Esquema, ...

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