C++ создается сверху C?

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

6
задан yxk 22 February 2010 в 22:12
поделиться

6 ответов

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

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

-121--4086435-

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

-121--4086434-

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

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

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

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

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

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

22
ответ дан 8 December 2019 в 02:06
поделиться

JEval - хорошая альтернатива. Я бросил Джеп из-за того, что он стал рекламным. Беспокойство вызывает только то, что JEval кажется немного спящим на данный момент (последний релиз в 2008 году).

-121--2166459-

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

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

-121--4086435-

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

5
ответ дан 8 December 2019 в 02:06
поделиться

Как ответили другие. НЕТ.

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

2
ответ дан 8 December 2019 в 02:06
поделиться

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

одно основное отличие состоит в том, что Си автоматически кастит указатели для вас, а Си++ нет, вам нужно кастовать вручную...

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

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

2
ответ дан 8 December 2019 в 02:06
поделиться

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

13
ответ дан 8 December 2019 в 02:06
поделиться

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

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

6
ответ дан 8 December 2019 в 02:06
поделиться