Понять, как работает компилятор

Я изучаю язык программирования C++, и у меня есть вопросы о том, как компилятор создает исполняемый файл. Моя книга говорит:

C++ — это компилируемый язык, поэтому вам необходимо перевести исходный код в файл, который сможет выполнить компьютер. Этот файл создается компилятором и называется объектным кодом ( .obj ), но программа, подобная программе hello world, состоит из написанной нами части и части библиотеки C++.

Что это за часть в программе hello world?

Тогда моя книга говорит:

Вы должны скомпилировать и скомпоновать две части программы для создания исполняемого файла.

Означает ли это, что исполняемый файл является результатом связывания двух частей программы и что объектный код не может быть выполнен?


person Piero Borrelli    schedule 13.09.2014    source источник


Ответы (3)


Две части: 1) «ваш код, который вызывает функцию печати и передает строку», которая является вашей скомпилированной программой hello world; 2) код, который реализует функцию печати (например, "std::cout ‹‹"). Мы называем это стандартной библиотекой.

Очевидно, что без объектного файла стандартной библиотеки вы не сможете получить полноценный исполняемый файл из-за отсутствия реализации std::cout.

Одна из причин, по которой существует стандартная библиотека, заключается в том, чтобы сделать пользовательский код (ваш файл hello world) более переносимым между различными операционными системами, потому что в системах Unix вам фактически нужно использовать функцию «записи», чтобы напечатать строку; но в других системах вы можете использовать функции, отличные от «записи». Стандартная библиотека унифицирует его для вас.

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

person Tim Shen    schedule 13.09.2014
comment
Итак, почему в моей книге раньше говорилось: то, что вы пишете, называется исходным кодом, а то, что выполняет программа, называется объектным кодом или исполняемым файлом. Файл объектного кода имеет суффикс .obj, тогда в моей книге говорится: мы должны связать две части программы. чтобы получить исполняемый файл с суффиксом .exe. Зачем ?? - person Piero Borrelli; 17.09.2014
comment
Почему они называются исходным кодом/объектным кодом/исполняемым файлом? Я не пытался их разгадать. Вики-страницы могут вам помочь. В вашей книге предполагается конкретная платформа и даже конкретная IDE; эти суффиксы различаются на других платформах - person Tim Shen; 18.09.2014

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

Компилятор делает много шагов:

  • Код сначала предварительно обрабатывается (заменяет макросы (#define) по их значению и включаемые файлы (#include) по их содержимому.
  • Анализ синтаксиса для проверки правильности синтаксиса C++
  • Сематический анализ для построения дерева инструкций
  • Оптимизация (если требуется)
  • Генерация кода: он пишет код сборки, специфичный для целевой платформы.
  • Связывание: объединение всего кода в исполняемую программу.

По крайней мере, это то, что я помню из того, что узнаю в школе...

person jpo38    schedule 13.09.2014

Правильно: C и C++ имеют отдельные этапы компиляции и компоновки. Исходный код компилируется в объектный код для этого конкретного процессора. Объектные файлы и библиотеки связываются вместе, а затем выполняются.

Java и C# используют байт-код, который интерпретируется и выполняется соответствующими виртуальными машинами.

person duffymo    schedule 13.09.2014
comment
Разве Java и C# не компилируются JIT, а не интерпретируются? - person OMGtechy; 13.09.2014
comment
@OMGtechy: это деталь реализации. Конечно, карта Java, например, не пытается компилировать JIT. - person TonyK; 13.09.2014
comment
оба верны. вы компилируете исходный код .java для генерации байтового кода в файлах .class. байт-код .class интерпретируется JVM. да, он использует статистику для оптимизации во время выполнения. - person duffymo; 14.09.2014
comment
@duffymo: это не компиляция JIT. Большинство интерпретаторов Java фактически компилируют (некоторые) байт-код в собственный машинный язык во время выполнения из соображений производительности. Это больше, чем просто использование статистики. - person TonyK; 14.09.2014
comment
Согласованный. Вы почти удивитесь, почему они больше не заставляют нас компилировать в файлы .class. Просто прочитайте файл .java и вырежьте посредника. - person duffymo; 14.09.2014