2010-06-08 19 views
17

duplicados posibles:
implementing a compiler in “itself”
Bootstrapping a language¿Cómo se puede escribir el compilador de un idioma en ese idioma?

¿Cómo se puede escribir un compilador en el mismo idioma que el idioma que está escrito que para el compilador? ¿No es ese tipo de recursivo?

Editar: Esto puede ser borrado, pero por lo demás ...:

Cómo realizar el arranque:

¿Por a Bootstrap:

+2

Varias versiones anteriores y enlaces relacionados: http://stackoverflow.com/questions/13537/bootstrapping-a-language http://stackoverflow.com/questions/1493747/bootstrapping-a-compiler-why http: // stackoverflow.com/questions/193560/implementing-a-compiler-in-itself http://stackoverflow.com/questions/1173780/programming-language-and-compiler http://stackoverflow.com/questions/2035838/what- language-do-they-build-other-languages-with http://stackoverflow.com/questions/2740994/what-is-the-language-of-compilersare-they-written-with-different-languages ​​La palabra que quería fue "arranque". – dmckee

+0

Me pregunto con qué frecuencia las personas implementan compiladores para los principales lenguajes usando los esotéricos. – JAB

+0

@Phil Ross - wow, gracias, ¿cómo lo has encontrado? no estaba seguro de cómo buscar :) – froadie

Respuesta

24

En general, la primera versión del compilador está escrito en un idioma diferente, y luego cada versión posterior está escrito en ese idioma y compilado con la versión anterior. Una vez que haya compilado la versión x con la versión x-1, puede usar la versión recién compilada x para volver a compilarse, aprovechando cualquier nueva optimización que introduzca la versión; GCC hace sus lanzamientos de esa manera

+0

+1 He creado un intérprete de Lisp simple en JAVA. – Achilles

+1

entonces ... ¿por qué no puedes simplemente usar la primera versión del compilador? ¿Por qué querrías un compilador de doble nivel? – froadie

+3

@froadie ¿Quiere decir por qué no compilar todas las versiones con la versión 1? Por lo general, las nuevas versiones de un compilador generan un mejor código de máquina que las versiones anteriores, por lo que construir con la versión más nueva hará que el compilador sea lo más rápido/eficiente posible. Además, si el idioma en sí está cambiando y desea utilizar esas características más nuevas en el código fuente del compilador, necesitará compilar con una versión más reciente –

11

Lo es. Por lo general, necesita una versión de arranque del idioma compilada o interpretada desde otro idioma.

Y para hacerte pensar un poco más, hace años leí la historia de un compilador de Pascal escrito como un proyecto de estudiante de posgrado. Escrito en Pascal y compilado con el compilador de Pascal incorporado en el sistema. Eventualmente, fue lo suficientemente bueno para reemplazar el compilador de Pascal incorporado en el sistema. Lamentablemente, encontraron un error en la generación de código, pero la solución para el generador de código desencadenó el error en el compilador, generando un compilador incorrecto. Para solucionarlo, se necesita parchear manualmente los archivos binarios del compilador instalado para luego aplicar el parche a la fuente para que se reemplace a sí mismo.

+0

Encontré esta pregunta preguntándome exactamente qué haría en este tipo de situación de error. El parche de mano no se me había ocurrido. Historia divertida. jaja – GabrielF

1

El primer paso del compilador normalmente se escribe en otra cosa hasta que el lenguaje esté lo suficientemente formado como para poder compilar su propio compilador, luego puede ingresar a la x que está escrita en x.

4

Es solo un problema para la primera versión. Una vez que tengo V1.0 del compilador funcionando, puedo escribir V2.0 en mi idioma y usar el compilador V1.0 para compilarlo. Entonces puedo escribir V3.0 y usar V2.0 para compilar eso, usar V3.0 para compilar V4.0 y más.

1

Al principio, el primer compilador real de ese idioma, no se escribió en ese lenguaje, por supuesto. Muy segundo podría escribirse en ese idioma. Además, dada una especificación de un lenguaje, puede implementar un núcleo básico en un compilador de arranque y luego escribir el compilador completo en ese idioma utilizando el subconjunto entendido por el compilador "bootstrap". Los compiladores de segunda generación también pueden olvidar el compilador "bootstrap".

1

En algún momento, necesita un compilador (o intérprete) escrito en un idioma diferente. Pero no necesita ser eficiente y se puede hacer en un lenguaje que simplifica el análisis sintáctico y la creación de prototipos (LISP es popular). Una vez que haya utilizado esto para compilar el "autocompilador", puede descartarlo y usar el resultado.

+1

No necesariamente. El primer "compilador" también puede ser un ser humano, en cuyo caso no necesita un compilador de arranque en un idioma diferente * en absoluto *. Así es como se escribieron los primeros compiladores de la mayoría de los idiomas de Niklaus Wirth: básicamente los asignó a sus alumnos :-) –

Cuestiones relacionadas