Что происходит при компиляции программы

Компиляция — преобразование программой-компилятором исходного текста программы, написанного на языке высокого уровня в машинный язык, в язык, близкий к машинному, или в объектный модуль. Результатом компиляции является объектный файл с необходимыми внешними ссылками для компоновщика.

Компилятор читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.

Пакетная. Компиляция нескольких исходных модулей в одном пункте задания.

Построчная. То же, что и интерпретация.

Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе. Так, в зависимости от значения некоторой константы, можно включать или выключать трансляцию части текста программы.

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

C++ с нуля | 08 | Компиляция и линковка

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

Существуют различные виды компиляторов:

·интерпретирующие (пошаговые), осуществляющие последовательную независимую компиляцию каждой отдельной инструкции исходной программы;

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

·отладочные, облегчающие пользователю отладку программ.

Компиляция относится к обработке файлов исходного кода (.c, .cc, или .cpp) и создании объектных файлов проекта. На этом этапе не создается исполняемый файл. Вместо этого компилятор просто транслирует высокоуровневый код в машинный язык.

Например, если вы создали (но не скомпоновали) три отдельных файла, у вас будет три объектных файла, созданные в качестве выходных данных на этапе компиляции. Расширение таких файлов будет зависеть от вашего компилятора, например *.obj или *.o. Каждый из этих файлов содержит машинные инструкции, которые эквивалентны исходному коду. Но вы не можете запустить эти файлы! Вы должны превратить их в исполняемые файлы операционной системы, только после этого их можно использовать

Сборка(build)— процесс получения информационного продукта из исходного кода. Чаще всего включает компиляцию и компоновку, выполняется инструментами автоматизации

Основной задачей программиста, который непосредственно занимается кодированием (написанием исходного кода) программы, является написание исходного текста программы на одном из языков программирования. Хороший программист, разрабатывая новую программу, не пишет весь код заново.

Компиляция. Как работает компилятор

Он старается использовать уже готовые (написанные ранее) программные коды (библиотеки), написанные как им самим, так и другими разработчиками. Если рассматривать эти библиотеки, как строительные блоки, то программист из них, как из кирпичей строит здание – новую программу. Такой подход к программированию называется технологией повторного использования кода.

Что обычно из себя представляют подобные строительные блоки? Это программный код и необходимые ресурсы (например, файлы данных или рисунков). Стоит отметить, что по мере развития библиотек, появляются их новые версии. Но при этом старые не исчезают, а продолжают использоваться уже написанными ранее программами.

В процессе развития технологии программирования было несколько вариантов реализации подхода к повторному использованию кода. На сегодняшний день – это широко используемые динамически подгружаемые библиотеки (DLL-библиотеки).

DLL- файлы – это обычные PE-файлы (файлы в формате PE – portable executable) . Это значит, что компьютер, работающий под управлением 32- или 64-разрядной версии Windows, способен загрузить этот файл и выполнить код, содержащийся в нем. Данный подход используется уже несколько лет и кроме достоинств в нем есть ряд недостатков (наиболее известный получил звучное название «Ад DLL») от которых настало время избавляться. И в качестве решения проблем DLL-библиотек в .NET предложен новый подход, в соответствии с которым на замену DLL-библиотекам пришло понятие сборок. Сборка – это единица повторного использования кода, в которой поддерживается система управления версиями и заложена система управления безопасности программного обеспечения. Стоит обратить внимание на одну из революционных особенностей сборок по отношению к DLL-библиотекам – сборки самодостаточны, они содержат метаданные (metadata), которые несут в себе информацию о версии, зависимостях, типах, атрибутах и многое другое.

Читайте также:
Как создать свою программу для детского сада

О том, как это реализовано в .NET и как воспользоваться всеми преимуществами нового подхода к повторному использованию кода, пойдет речь в этом разделе.

Компоновка, редактирование связей (linking, linking editing) – это процесс сборки загрузочного модуля (исполняемого файла) из полученных в результате раздельной компиляцииобъектных модулей с одновременным автоматическим поиском и присоединением библиотечных подпрограмм и процедур. В процессе компоновки программа собирается в единое целое непосредственно в оперативной памяти в файл, готовый к работе (загрузочный модуль — файл с расширением .ехе).

Работу по компоновке программы выполняет программа компоновщик (linker). Эта программа выполняет следующие основные функции:

·распределяет пространство оперативной памяти для программы;

·связывает вместе части программы, представленные отдельными объектными модулями (файлами .obj);

·настраивает адреса подготовленной программы, заменяя все относительные адреса, выработанные компилятором, соответствующими абсолютными адресами фактически распределенной памяти.

Компоновщики бывают в двух реализациях:

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

· компоновщики, которые готовят загрузочный файл, сразу физически размещают подготовленную версию машинного кода программы в памяти и передают управление на первую команду программы для непосредственного исполнения.

Эти операции могут быть выполнены с помощью меню Build.

Краткое описание основных команд этого меню:

·Сompile– компиляция выбранного файла, результат компиляции отображаются в окнахTask ListиOutput.

·Build– компоновка проекта. Компилируются все файлы, в которых произошли изменения с момента последней компоновки. После компиляции происходит сборка всех объектных модулей, включая библиотечные, в результирующий исполняемый файл. Сообщения об ошибках компоновки выводятся в окна Task List иOutput.

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

·Rebuild – делается то же, что и в команде Build, но при выполнении этой команды компилируются все файлы проекта независимо от того, были ли в них изменения.

Источник: www.art-talant.org

В чем состоит процесс компиляции?

Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера). Входной информацией для компилятора (исходный код) является описание алгоритма или программа на проблемно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код).

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

1. Компиляция. Программа, как правило, состоит из нескольких модулей. В результате компиляции для каждого модуля генерируется объектный файл, который содержит инструкции на целевом языке и информацию о содержащихся в модуле функциях и о внешних функциях, используемых в модуле. Процесс компиляции зависит, как правило, только от типа процессора.

Читайте также:
Как на электронную книгу установить программы

2. Компоновка (англ. linking, linkage). Все необходимые объектные файлы собираются вместе. Далее происходит процесс разрешения ссылок — все внешние по отношению к каждому отдельному модулю ссылки должны быть разрешены, то есть для каждой из них должна быть поставлена в соответствие конкретная функция из другого модуля программы, либо из внешней библиотеки.

Например, если в модуле вызывается функция операционной системы, которая рисует на экране линию, то компилятор , что такая функция существует. В процессе сборки этой ссылке должна быть сопоставлена конкретная функция из конкретной библиотеки (для Windows — это как правило dll, для Linux — so) операционной системы. Кроме того при генерации исполняемого файла (для Windows — exe-файл) должны быть соблюдены требования операционной системы к формату исполняемых файлов. Поэтому процесс сборки зависит от операционной системы, а зачастую — и от версии операционной системы.

Примеры компиляторов: GCC, Free Pascal Compiler.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Студопедия рекомендует:

Методы обучения Сущность и структура методов обучения. Слово «метод» в переводе с греческого означает способ познания.
Алгоритм внутривенной инъекции Цель: лечебная, диагностическая. Показания: определяет врач. Противопоказания:аллергическая реакция на препарат. I. ПОДГОТОВКА К.
Информационные технологии в образовании В настоящее время, значительно увеличилась роль информационных технологий в жизни людей.
Основные положения «Русской правды» П.И. Пестеля Годами трудился Павел Пестель над проектом своей конституции. Он был сторонником диктатуры временного верховного правления во время.
Учимся решать экономические задачи Типы задач: · Задачи на выведение формул всех видов издержек.

Источник: studopedia.ru

Часть 4. Процессы, происходящие при компиляции и запуске программы

Для получения представления о том, как работает .NET и какие службы она предлагает, рассмотрим, Что происходит при запуске программы, разработанной для среды исполнения .NET.

Пусть для примера приложение состоит из основного кода, написанного на С#, и библиотеки, созданной с помощью VB.NET.

Приложению необходимо общаться с существующим СОМ-компонентом, и подразумевается, что оно будет использовать некоторые из базовых классов .NET (практически невозможно создать приложение, которое будет делать что-нибудь полезное, если при этом оно не будет использовать базовые классы .NET):

Рис. 2. Процессы, сопровождающие компиляцию и исполнение приложения

На диаграмме прямоугольники показывают основные компоненты, связанные с компиляцией и исполнением программы, а стрелки — исполняемые задачи. В верхней части рисунка представлен процесс раздельной компиляции каждого проекта в сборку.

Две сборки способны взаимодействовать друг с другом благодаря свойствам совместимости языков .NET. Нижняя часть диаграммы демонстрирует процесс JIT-компиляции в сборках из IL в машинный код, который выполняется в области приложения внутри процесса. Показаны некоторые действия, которые выполняет код внутри CLR для достижения этой цели.

Компиляция

Перед запуском программа должна быть откомпилирована. Однако, в отличие от прежних исполняемых файлов и DLL, теперь компилированный код программы не содержит инструкций ассемблера. Вместо этого он содержит инструкции на промежуточном языке Microsoft (MSIL или IL). Промежуточный язык в чем-то похож на байт-код Java.

IL — это низкоуровневый код, который может быть быстро преобразован (откомпилирован JIT) a родной машинный код.

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

Читайте также:
Что будет если пользоваться нелицензионными программами

Прежний программный продукт состоял бы из исполняемого файла, содержащего точку входа основной программы, и одной или нескольких библиотек или СОМ-компонентов. Продукт для .NET состоит из определенного числа сборок, одна из которых является исполняемой и содержит точку входа основной программы, а другие представляют собой библиотеки.

В примере, приведенном на рисунке, имеются всего две сборки: исполняемая, содержащая код на С#, и библиотека, содержащая компилированный код VB.NET.

Исполнение

В период исполнения программы среда исполнения .NET загружает первую сборку, ту, что содержит точку входа основной программы.

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

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

На этом этапе CLRвыполнит еще одно действие для проверки так называемой безопасности кода по типу памяти(memory type safely). Код считается безопасным по типу памяти только в том случае, если он обращается к памяти способами, которые может контролировать CLR.

Безопасный по типу памяти код гарантированно не будет пытаться прочесть или записать в память, не принадлежащую ему. Это важно, так как .NET имеет механизм (так называемые области приложений), позволяющий нескольким приложениям выполняться в одном процессе. При этом необходимо гарантировать, что никакое приложение не будет пытаться обратиться к памяти другого приложения. ЕслиCLR не будет уверена в том, что код безопасен по типу памяти, то в зависимости от местной политики безопасности она может даже отказать в исполнении кода.

Затем CLR выполняет код. Она создаст процесс, в котором будет исполняться код, и отмечает область приложения, в которой размещается главный поток приложения.

В некоторых случаях программа может потребовать поместить ее в уже имеющийся процесс запущенного ранее кода, тогдаCLR создаст для нее только новую область приложения.

CLR берет первую часть кода, которая требуется для исполнения, и компилирует ее с промежуточного языка на язык ассемблера, после чего выполняет ее из соответствующего потока программы.

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

Этот процесс носит название компиляции Just-In-Time. Отметим, что JIT-компилятор может в зависимости от параметров компиляции, указанных в сборке, оптимизировать код в процессе компиляции, например, путем подстановки некоторых методов (inline) вместо их вызовов.

Во время выполнения кода CLR следит за использованием памяти. На основе этих наблюдений она в определенные моменты будет останавливать программу на короткий промежуток времени (обычно миллисекунды) и запускать сборщика мусора, который проверит переменные программы и выяснит, какие из областей памяти активно используются программой, для того, чтобы освободить неиспользуемые участки.

CLR также производит загрузку сборок по мере необходимости, в том числе СОМ-компонентов, используя службы .NET COM interop.

Источник: megaobuchalka.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru