¿Cómo podría escribirse el primer compilador de C ++ en C ++?

46

Stroustrup afirma que Cfront, el primer compilador de C ++, fue escrito en C ++ ( Preguntas frecuentes de Stroustrup ).

Sin embargo, ¿cómo es posible que el primer compilador de C ++ se escriba en C ++?

El código que compone el compilador también debe compilarse, y por lo tanto el primer compilador de C ++ no se pudo haber escrito en C ++, ¿verdad?

    
pregunta Pacerier 01.09.2011 - 17:44

4 respuestas

56

La clave está aquí:

  

El primer compilador de C ++ (Cfront) fue escrito en C ++. Para construir eso, yo   Primero usé C para escribir un preprocesador "C con clases" a C. "C con   Clases "fue un dialecto C que se convirtió en el antecesor inmediato de C ++.   Ese preprocesador tradujo construcciones "C con clases" (como por ejemplo   clases y constructores) en C. Era un preprocesador tradicional   Eso no entendió todo el lenguaje, dejó la mayoría del tipo   Comprobando el compilador de C para hacer, y traducido individual   Construye sin conocimiento completo. Luego escribí la primera versión.   de Cfront en "C con Clases".

Así que la primera versión de Cfront no fue escrita en C ++, sino en el lenguaje intermedio. La capacidad de crear compiladores y preprocesadores de C directamente en C llevó a muchas de las innovaciones (y agujeros de seguridad masivos ) en C. Así que escribe su nuevo preprocesador que convierte su código de" C con clases "en C directa (porque C simple puede hacer cualquier cosa) y luego usa" C con Clases "para escribir un compilador de C ++ (no es que no pueda hacerlo en C, solo tomaría un tiempo) y luego usa ese compilador de C ++ para escribir un compilador más eficiente / completo en C ++. ¿Entendido?

    
respondido por el Christopher Bibbs 01.09.2011 - 18:07
17

Fue bootstrapped. Tan pronto como se agregó una característica de C ++ a cfront, entonces cfront también podría usar esa característica a partir de ese momento (pero no para implementar esa característica). Esto funcionó porque cfront tenía la capacidad de convertir código C ++ a código C Entonces, si surgiera una nueva plataforma, podría usar cfront en otra plataforma para convertir cfront de C ++ a C, y luego usar el compilador de C de la nueva plataforma para finalizar la compilación de C a código de objeto.

    
respondido por el David Schwartz 01.09.2011 - 18:07
9

Creo que B.S. responde esa pregunta:

  

El primer compilador de C ++ (Cfront) fue escrito en C ++. Para construir eso, yo   Primero usé C para escribir un preprocesador "C con clases" a C. "C con   Clases "fue un dialecto C que se convirtió en el antecesor inmediato de C ++.   Ese preprocesador tradujo construcciones "C con clases" (como por ejemplo   clases y constructores) en C. Era un preprocesador tradicional   Eso no entendió todo el lenguaje, dejó la mayoría del tipo   Comprobando el compilador de C para hacer, y traducido individual   Construye sin conocimiento completo.

     

Luego escribí la primera versión   de Cfront en "C con Clases". Cfront era un compilador tradicional que   completó la sintaxis y la comprobación semántica de la fuente de C ++. Para eso,   tenía un analizador completo, construyó tablas de símbolos y construyó un completo   Representación interna de árbol de cada clase, función, etc. También hizo   alguna optimización de nivel de fuente en su representación interna de árbol de   C ++ construye antes de generar C. La versión que generó C hizo   No confíe en C para cualquier tipo de comprobación. Simplemente usaba C como ensamblador.   El código resultante fue inflexiblemente rápido.

Primero creó algo que llamó "C con clases" implementado por un simple preprocesador en C. Era básicamente C ++, pero el preprocesador hizo poco o ningún control. Luego lo usó para escribir Cfront, la versión más poderosa del traductor de C ++ en C, completa con verificación de tipos, tablas de símbolos, etc.

    
respondido por el Mike Dunlavey 01.09.2011 - 18:08
2

Agregaré esta respuesta ya que ninguna respuesta cubrió este aspecto.

Técnicamente no necesitas software para compilar el código. Mientras tenga las especificaciones de compilador necesarias, puede hacer la compilación real manualmente. No es así como se compiló el primer compilador de C ++. Solo digo que es posible.

Comparar con lenguaje ensamblador. Cuando se usaron en los primeros días, no había ningún software de ensamblador para convertir el código de ensamblaje en código de máquina. Se hizo a mano, pero el lenguaje ensamblador le dio a los programadores una mejor visión general.

    
respondido por el Broman 20.09.2017 - 00:51

Lea otras preguntas en las etiquetas

Comentarios Recientes

Lo hizo, haciendo un argumento sobre el argumento constructor de dos implementaciones. Con una semántica tan general, escribir una implementación para cualquiera de las dos máquinas probablemente sería más rápido que escribir una a mano; sin embargo, escribir una prueba con una semántica tan generalizada resultó inesperadamente difícil (en la Parte 2 de este artículo, mostraremos cómo manejamos este y otros obstáculos comunes). Este es solo un aspecto de C ++: es mejor tener un 90% de funciones de lenguaje... Lee mas