mundo - programas para compilar
¿Cómo se puede escribir un compilador de C en C? (4)
Esta pregunta ya tiene una respuesta aquí:
- Escribiendo un compilador en su propio idioma 12 respuestas
Esta pregunta puede provenir de un malentendido de los compiladores de mi parte, pero aquí va ...
Se puede encontrar la siguiente declaración en el prefacio de la primera edición de K&R (página xi):
El sistema operativo, el compilador de C , y esencialmente todos los programas de aplicaciones UNIX (incluido todo el software utilizado para preparar este libro) están escritos en C.
(mi énfasis)
Esto es lo que no entiendo: ¿no es necesario compilar el compilador de C antes de que pueda compilar cualquier código de C? Y si ese compilador de C está escrito en C, ¿la compilación no requeriría un compilador de C ya existente?
La única forma de salir de este enigma de regresión infinita (o problema de la gallina y el huevo) es que el compilador de C escrito en C al que se refiere K&R fue compilado con un compilador de C ya existente que estaba escrito en un idioma diferente al C El compilador de C escrito en C luego reemplazó a este último.
¿O estoy completamente fuera?
Es perfectamente normal que un compilador se escriba en el lenguaje que compila. Una forma de lograr esto sería escribir un compilador completo para el lenguaje L en algún otro idioma, y luego escribir un compilador nuevo para L en L. Un enfoque más interesante sería escribir un compilador mínimo para un subconjunto de L en algunos otro idioma, y luego use este subconjunto mínimo para mejorar el compilador, haciéndolo menos mínimo aumentando el subconjunto disponible de L. De esta manera, se puede construir un compilador completo.
Por lo general, un primer compilador se escribe en otro idioma (directamente en el ensamblador PDP11 en este caso, o en C para la mayoría de los idiomas "modernos"). Luego, este primer compilador se usa para programar un compilador escrito en el lenguaje mismo.
Puedes leer esta page sobre la historia del lenguaje C. Verás que también está fuertemente vinculado al sistema UNIX.
Se llama Bootstrapping , citando de Wikipedia:
Si uno necesita un compilador para el lenguaje X para obtener un compilador para el lenguaje X (que está escrito en el lenguaje X), ¿cómo se escribió el primer compilador? Los posibles métodos para resolver este problema con la gallina o el huevo incluyen:
- La implementación de un intérprete o compilador para el lenguaje X en el lenguaje Y. Niklaus Wirth informó que escribió el primer compilador de Pascal en Fortran.
- Otro intérprete o compilador para X ya se ha escrito en otro idioma Y; Así es como Scheme suele ser bootstrapped.
- Las versiones anteriores del compilador se escribieron en un subconjunto de X para el que existía algún otro compilador; así es como se reinician algunos superconjuntos de Java, Haskell y el compilador inicial de Free Pascal.
- El compilador para X se compila de forma cruzada desde otra arquitectura donde existe un compilador para X; Así es como los compiladores para C se suelen portar a otras plataformas. También este es el método utilizado para Free Pascal después del arranque inicial.
- Escribiendo el compilador en X; luego, compírelo manualmente desde la fuente (lo más probable es que no esté optimizado) y ejecútelo en el código para obtener un compilador optimizado. Donald Knuth usó esto para su sistema de programación WEB.
Y si estás interesado, here está la primera fuente del compilador de C de Dennis Richie.
Vea la sección de Pollo y Huevo de la Bootstrapping :
Si uno necesita un compilador para el lenguaje X para obtener un compilador para el lenguaje X (que está escrito en el lenguaje X), ¿cómo se escribió el primer compilador? Los posibles métodos para resolver este problema con la gallina o el huevo incluyen:
- La implementación de un intérprete o compilador para el lenguaje X en el lenguaje Y. Niklaus Wirth informó que escribió el primer compilador de Pascal en Fortran.
- Otro intérprete o compilador para X ya se ha escrito en otro idioma Y; Así es como Scheme suele ser bootstrapped.
- Las versiones anteriores del compilador se escribieron en un subconjunto de X para el que existía algún otro compilador; así es como se reinician algunos superconjuntos de Java, Haskell y el compilador inicial de Free Pascal.
- El compilador para X se compila de forma cruzada desde otra arquitectura donde existe un compilador para X; Así es como los compiladores para C se suelen portar a otras plataformas. También este es el método utilizado para Free Pascal después del arranque inicial.
- Escribiendo el compilador en X; luego, compírelo manualmente desde la fuente (lo más probable es que no esté optimizado) y ejecútelo en el código para obtener un compilador optimizado. Donald Knuth usó esto para su sistema de programación WEB.