Все ли компиляторы C ++ генерируют код на C? - PullRequest
8 голосов
/ 22 июля 2010

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

Ответы [ 5 ]

13 голосов
/ 22 июля 2010

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

На ранних этапах разработки языка, чтобы увидеть, возможен ли язык, самый простой способ получить работающий компилятор - это создать компилятор, который преобразует ваш язык в C, а затем позволить компилятору нативного C создать настоящий двоичный файл.

Проблема в том, что специфичные для языка конструкции теряются, и, следовательно, потенциальные возможности для оптимизации могут быть упущены, поэтому большинство языков на втором этапе получают собственный выделенный компилятор front end, который понимает специфичные для языка конструкции и, таким образом, может предоставлять стратегии оптимизации на основе эти конструкции.

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

9 голосов
/ 22 июля 2010

Неа. GCC например идет от C ++ -> ассемблер. Вы можете увидеть это, используя опцию -S с g ++.

На самом деле, теперь, когда я думаю об этом, я не думаю, что какой-либо современный компилятор перейдет на C до ASM.

5 голосов
/ 22 июля 2010

Нет. C ++ -> C использовался только на самых ранних этапах развития и развития C ++. Большинство компиляторов C ++ сегодня компилируются непосредственно в ассемблер или машинный код. Borland C ++, например, компилируется непосредственно в машинный код.

1 голос
/ 22 июля 2010

Нет. Это миф , основанный на том факте, что таким образом была реализована очень ранняя версия работы Страуструпа. Компиляторы C ++ генерируют машинный код почти точно так же, как компиляторы C.

На сегодняшний день единственный известный мне компилятор C ++, который создает код C, - это Comeau . Может быть один или два для встроенных целей, но это, конечно, не главное.

0 голосов
/ 11 июня 2014

Это не определено стандартом. Конечно, компиляция в C-source - разумный способ сделать это. Требуется только, чтобы на целевой платформе был C-компилятор с разумной степенью соответствия, так что это очень переносимый способ работы. Недостатком является скорость. Вероятно, пострадают скорость компиляции и, возможно, также скорость выполнения (из-за загрузки приведенных типов, например, виртуальных функций, которая не позволяет компилятору полностью оптимизироваться). Не так давно была компания, у которой был очень хороший компилятор C ++, делающий именно это. К сожалению, я не помню название компании и короткий гугл не вернул имя обратно. Владелец компании был активным участником комитета по ISO C ++, и вы могли протестировать свой код прямо на домашней странице, которая также имела несколько приличных ресурсов о C ++. Изменить: один из моих коллег постеров только что напомнил мне. Я, конечно, говорил о Комо.

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