Читайте также:
|
|
Хорошо оформленная программа. Хорошо оформленная программа – программа сконструированная в соответствии с синтаксисом Стандарта и его семантическими правилами, и удовлетворяющая Правилу Одного Определения (см. ниже). Плохо оформленная программа не удовлетворяет этим требованиям.
Компиляция.
В C++ исходный файл подвергается ряду преобразований на пути к исполняемой программе. Первоначальные шаги включают обработку всех # include директив и условных директив препроцессора для того, чтобы получить то, что в Стандарте названо единицей трансляции. Единицы трансляции концептуально важны, поскольку они не имеют никаких зависимостей (связей) от других файлов. Программисты пока еще используют термин исходный файл, даже если речь идет о модуле трансляции. Термин “трансляция”, обычно, включает в себя как компиляцию, так и интерпретацию, хотя большинство С++-трансляторов являются компиляторами. Эдесь мы обсудим, как в С++ читаются и компилируются исходные файлы (модули трансляции).
В C++ программа может состоять из многих исходных файлов, и каждый файл может компилироваться отдельно. Концептуально(схематично), процесс компиляции имеет несколько шагов:
1. Чтение физических символов из исходного файла и трансляция их в символы исходного набора. Исходный “файл” не обязательно есть некоторый физический файл – он может быть получен из базы данных, например.
2. Если встречается пара (обратный слэш, символ новая строка), т.е., (\,\n), то она уничтожается. Эта комбинация не должна попадать в середину unicode -символа и не должна быть в конце файла. Она может использоваться в символьном или строковом литерале, или для продолжения директивы препроцессора и в однострочном комментарии, расположенном на нескольких линиях. Непустой файл должен заканчиваться символом новая строка.
3. Разбиение исходного кода на препроцессорные лексемы, разделенные пробелами и комментариями. Препроцессорные лексемы слегка отличаются от лексем времени компиляции. Препроцессорные лексемы могут быть именем заголовка (header), идентификатором, цифрой, символьным литералом, строковым литералом, символом или каким-либо знаком. Каждая такая лексема является самой длинной последовательностью знаков, которая может быть идентифицирована как верная (допустимая в языке) лексема, не зависимо от того, что следует после этой лексемы.
4. Выполняется препроцессорная обработка и подстановка (раскрытие) макросов. Все # include – файлы обрабатываются, как описано в шагах 1-4.
5. Преобразование символьных и строковых литералов в исполняемый набор символов.
6. Конкатенируются смежные (соседние) строковые литералы. “Узкие” с узкими, “Широкие” – с широкими. Смешение узких строковых литералов с широкими приводит к ошибке.
7. Выполняется основная компиляция.
8. Сборка (объединение) откомпилированных файлов. Для каждого файла все требуемые экземпляры шаблонов (инстанциации, инстанцированные шаблоны) идентифицируются, и необходимые определения шаблонов размещаются по своим местам и компилируются.
9. Разрешаются внешние ссылки. Откомпилированные файлы линкуются (компонуются) для получения исполняемый код (image).
// Вот такая невеселая работа у компилятора. И это - только концептуально.
Дата добавления: 2015-11-16; просмотров: 43 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Некоторые общие замечания и пропедевтика. | | | Компиляторы в семействе ОС Windowss |