Creo que BS responde esa pregunta:
El primer compilador de C ++ (Cfront) se escribió en C ++. Para construir eso, primero usé C para escribir un preprocesador "C con clases" a C. "C con clases" fue un dialecto C que se convirtió en el antepasado inmediato de C ++. Ese preprocesador tradujo construcciones de "C con clases" (como clases y constructores) a C. Era un preprocesador tradicional que no entendía todo el lenguaje, dejaba que la mayoría del tipo verificara que el compilador de C hiciera y traducía individualmente. construcciones sin conocimiento completo.
Luego escribí la primera versión de Cfront en "C con clases". Cfront era un compilador tradicional que completaba la sintaxis y la comprobación semántica de la fuente de C ++. Para eso, tenía un analizador completo, construía tablas de símbolos y construía una representación de árbol interna completa de cada clase, función, etc. También optimizaba el nivel de fuente en su representación de árbol interna de construcciones C ++ antes de generar C. La versión que C generado, no se basó en C para ninguna verificación de tipo. Simplemente usó 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 poca o ninguna verificación. Luego usó eso para escribir Cfront, la versión más poderosa del traductor de C ++ a C, completa con verificación de tipos, tablas de símbolos, etc.