Я думаю, що BS відповідає на це питання:
Перший компілятор C ++ (Cfront) був написаний на C ++. Щоб побудувати це, я вперше застосував C, щоб записати "C з класами" -процесором C. "C з класами" - це діалект С, який став безпосереднім предком С ++. Цей препроцесор переклав на C. конструкти "C з класами" (наприклад, класи та конструктори). Це був традиційний препроцесор, який не розумів усі мови, залишив більшість перевірок типу для компілятора C і переклав окремі конструкції без повних знань.
Тоді я написав першу версію Cfront у "C з класами". Cfront був традиційним компілятором, який робив повний синтаксис та семантичну перевірку джерела C ++. Для цього він провів повний аналізатор, побудував таблиці символів та побудував повне внутрішнє подання дерев кожного класу, функції тощо. Він також здійснив деяку оптимізацію рівня джерела на своєму внутрішньому представленні дерева конструкцій C ++ перед виведенням C. Версія, що згенерований C, не покладався на C для будь-якої перевірки типу. Він просто використовував С як асемблер. Отриманий код був безкомпромісно швидким.
Спочатку він створив щось, що він назвав "C з класами", реалізований простим препроцесором у C. Це був C ++, але препроцесор мало перевіряв або не перевіряв. Потім він використав це для написання Cfront, більш потужної версії перекладача C ++ на C, у комплекті з перевіркою типів, таблицями символів тощо.