C ++ построен поверх C? - PullRequest
       10

C ++ построен поверх C?

6 голосов
/ 09 февраля 2010

Преобразуется ли код C ++ в C перед компиляцией?

Ответы [ 6 ]

22 голосов
/ 09 февраля 2010

Несколько компиляторов C ++ (оригинальный cfront, Comeau C ++) используют C в качестве промежуточного языка во время компиляции. Большинство компиляторов C ++ используют другие промежуточные языки (например, llvm).

Редактировать: Поскольку, похоже, существует некоторое недопонимание в истории: "C с классами" начинался с использования препроцессора "Cpre". В то время это рассматривалось строго как диалект языка С, а не как отдельный язык сам по себе. В декабре 1983 года люди начали рассматривать его как отдельный язык, и было изобретено имя C ++. Как оказалось, разработка cfront началась в апреле 1983 года, поэтому доступная для использования версия стала доступной (для немногих избранных) примерно в то же время, когда появилось название «C ++». Похоже, это в основном совпадение, а не план.

Что касается выдачи C в качестве выходных данных, это было довольно распространенным явлением в Unix. Например, компилятор Berkeley Pascal и, по крайней мере, пара компиляторов Fortran также выдали C в качестве выходных данных.

Однако есть огромная разница между Cpre и Cfront. Хотя оба выпускали C в качестве выходных данных, Cpre практически не проверял синтаксис самостоятельно - он искал несколько конкретных вещей и выполнял относительно механический перевод для них. Только когда компилятор C посмотрел на результат, был проведен настоящий синтаксический анализ. Если ваш код содержал синтаксическую ошибку, он был почти уверен, что она не будет перехвачена, пока компилятор C не проанализирует вывод Cpre.

Cfront, однако, выполнил полный синтаксический анализ самого исходного кода, поэтому (если не считать ошибки в его генераторе кода), вы никогда не увидите синтаксическую ошибку от компилятора C. Компилятор C просто использовался в качестве генератора кода, поэтому никому не нужно было переписывать CFront для поддержки различных процессоров, форматов объектных файлов и т. Д.

Если вы хотите получить более подробную информацию, глава 2 Проектирование и развитие C ++ почти целиком посвящена временному интервалу "C with Classes" (и есть другие подробности о его распространении). на протяжении всей книги).

13 голосов
/ 09 февраля 2010

Нет, но, как и в большинстве мифов, в этом есть доля правды. Оригинальный компилятор для C с классами (который позже стал C ++) был по прозвищу CFront и действительно переводил в C.

6 голосов
/ 09 февраля 2010

Не в большинстве современных компиляторов.

Однако оригинальный компилятор C ++ был на самом деле препроцессором. Он генерировал код на C, который затем был скомпилирован компилятором C.

5 голосов
/ 09 февраля 2010

В первые дни компиляторов C ++ некоторые делали это так. Однако я не видел компилятора C ++, реализованного таким образом с конца 1980-х годов.

2 голосов
/ 09 февраля 2010

заголовок, кажется, спрашивает, является ли C ++ надмножеством C, то есть вы можете просто сбросить любой код c в компилятор c ++, и он будет работать? В таком случае, да, вроде ...

Одно из главных отличий состоит в том, что C автоматически приводит к вам указатели, а c ++ - нет, вам нужно приводить вручную ...

Кто-нибудь еще что-нибудь помнит?

это все, что я помню из ужасного процесса преобразования массивного C-проекта в компиляцию под c ++ по некоторым причинам ...

2 голосов
/ 09 февраля 2010

Как ответили другие. NO.

Однако, если вы хотите использовать язык ООП, такой как C #, и ваш код скомпилирован в C, я рекомендую вам взглянуть на Vala .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...