Проект CompCert - це дослідницький компілятор C, який пишеться не на C або C ++, а більше на Ocaml та Coq.
Зверніть увагу, що C ++ використовувався для перекладу на C (у Cfront ). Тепер ви можете використовувати передній частині GCC до Gimple , потім скинути Gimple в якусь базу даних, а потім написати Gimple своєму перекладачу асемблера. Але юридичні причини ( виняток із бібліотеки виконання GCC ) вимагає, щоб такий компілятор був відкритим кодом. Поцікавтесь у свого адвоката деталями, я не юрист. Старі варіанти GCC написані на мові C (+ декілька мов, що належать до домену), а для деяких варіантів C ++ - це передній край. OpenWatcom може бути компілятором C ++, написаним на C (я залишаю вам це перевірити).
Джерело Compcert є у вільному доступі для наукових та дослідницьких цілей. Якщо ви хочете використовувати його промислово (і на законних підставах), вам потрібно отримати ліцензію від Absint.
Дивіться також це та те, що відповідає на два пов’язані питання.
Якщо мені в 2020 році було доручено написати компілятор C (або C ++) з нуля (працює на Linux, можливо, якийсь крос-компілятор ), я, мабуть, не напишу його на C ++. Я б подумав написати це за допомогою Ocaml , Go або Rust . І я міг би базувати його на Frama-C, якщо це дозволять. Якщо потрібно ввести код у C або C ++, я спершу кодую бібліотеку сміттєзбірника для цього, ймовірно, якийсь рівень стійкості - дуже корисний для оптимізації цілої програми - і тоді я б розглядав підхід метапрограмування (генеруючи більшу частину коду С або С ++ компілятор з моїми спеціальними інструментами, можливо, Bismon або RefPerSys якщо це дозволено).
Ви можете знайти деякі (більш-менш відкриті джерела) компіляторів C, кодовані в Common Lisp або Python (наприклад, ShivyC або nqcc ). Загляньте також у ZetaC .
Зауважте, що останні версії GCC технічно не кодуються в чистому C ++, це десяток мов, специфічних для домену, які беруть участь у GCC (декілька з них є Turing-завершеними ). Дивіться також мій старий проект GCC MELT .
Я не здивуюся, якщо в майбутніх версіях GCC в них буде вбудований якийсь інтерпретатор Python або Guile (наприклад, як заміна менеджеру пропусків GCC).
Погляньте також на проект MILEPOST GCC .