Я думаю, что BS отвечает на этот вопрос:
Первый компилятор C ++ (Cfront) был написан на C ++. Чтобы построить это, я сначала использовал C для написания препроцессора "C with Classes" -to-C. «C with Classes» был диалектом C, который стал непосредственным предком C ++. Этот препроцессор переводил конструкции «C with Classes» (такие как классы и конструкторы) в C. Это был традиционный препроцессор, который не понимал весь язык, оставил большую часть проверки типов для выполнения компилятором C, и перевел индивидуальный строит без полного знания.
Затем я написал первую версию Cfront в «C с классами». Cfront был традиционным компилятором, который выполнял полную синтаксическую и семантическую проверку исходного кода C ++. Для этого у него был полный синтаксический анализатор, построены таблицы символов и построено полное представление внутреннего дерева каждого класса, функции и т. Д. Он также провел некоторую оптимизацию на уровне исходного кода для своего внутреннего представления дерева конструкций C ++ перед выводом C. Версия, которая сгенерированный C, не полагался на C для какой-либо проверки типа. Он просто использовал C в качестве ассемблера. Полученный код был бескомпромиссно быстрым.
Сначала он создал что-то, что он назвал «C с классами», реализованный простым препроцессором в C. Это был в основном C ++, но препроцессор почти не проверял. Затем он использовал это для написания Cfront, более мощной версии переводчика C ++ в C, с проверкой типов, таблиц символов и т. Д.