Компиляция (compilation) – это преобразование программы или ее отдельного модуля, составленного на языкепрограммирования высокого уровня (исходная программа, исходный модуль – файл с расширением .срр) в программу или модуль намашинном языке или языке, близком к машинному (объектный модуль – файл с расширением .obj). В процессе компиляции программа преобразуется в промежуточную форму, к которой впоследствии необходимо присоединить библиотечные средства, содержащиестандартные подпрограммы и процедуры, а если нужно, то можно добавить любые другие модули, написанные самим пользователем, и скомпилированные в объектные модули, возможно даже с других языков высокого уровня.
Объектный модуль не может быть исполнен, его местоположение в оперативной памяти еще не известно (не определено). Компилятор вырабатывает относительные адресасвязи с другими модулями. В дальнейшем их предстоит заменить конкретными адресами (абсолютными адресами) той части оперативной памяти, в которой эта программа будет выполняться.
От исходника до исполняемого файла
Компиляцию осуществляет специальная программа – компилятор (compiler), которая является неотъемлемой частью системы программирования. На вход компилятора поступаетисходный модуль(файл .срр), который после компиляции преобразуется в объектный модуль (файл .obj)
Существуют различные виды компиляторов:
Источник: studfile.net
Урок 15
Системное программное обеспечение. Системы программирования
§40. Системное программное обеспечение. §41. Системы программирования
• транслятор;
• компоновщик (редактор связей, сборщик, англ, linker) — программа, которая собирает разные части (модули) создаваемой программы и функции из стандартных библиотек в единый исполняемый файл. На рисунке 6.16 показано, как собирается программа на языке Си, состоящая из двух модулей (исходные файлы qq.c и qql.c).
Рис. 6.16
• отладчик (англ, debugger 1 ) — программа для поиска ошибок в других программах, позволяющая:
— выполнять программу в пошаговом режиме (по одной строке);
— выполнять программу до строки, где установлен курсор; устанавливать точки останова (англ, breakpoints);
— просматривать и изменять значения переменных в памяти;
1 Согласно одной из версий, это название связано с жучком, который попал между контактов реле компьютера Mark II в 1947 г. Дословно: debug — «удаление жучков».
• профилировщик (англ, profiler) — программа, позволяющая оценить время работы каждой процедуры и функции («профиль» времени выполнения программы); используется для того, чтобы выяснить, какую именно процедуру нужно оптимизировать в первую очередь.
Любая система программирования включает библиотеки стандартных подпрограмм. Это набор готовых процедур и функций, которые можно вызывать из своей программы. Например, в большинстве языков программирования есть стандартные функции для вычисления синуса и косинуса. Они подключаются к программе на этапе сборки, это делает компоновщик.
Язык C++ с нуля | #35 Разделение программного кода на несколько файлов в c++
Многие программы используют одни и те же достаточно сложные системные функции (например, операции с окнами в графической среде). Если включать эти функции в код каждой программы, размеры исполняемых файлов намного увеличатся, из-за этого жёсткий диск и память будут расходоваться неэффективно.
Поэтому библиотеки таких функций хранятся на диске в виде отдельных файлов — динамически подключаемых библиотек, в системе Linux они имеют расширение so (от англ, shared objects — разделяемые объекты), а в Windows — расширение dll (от англ, dynamic-link library — динамически подключаемая библиотека). Когда программа вызывает функцию из такой библиотеки, библиотека загружается в память, и управление передаётся вызванной функции. Несколько программ могут обращаться к одной и той же копии библиотеки в памяти.
Набор стандартных структур данных и функций операционной системы, которые программисты могут использовать в прикладных программах, называется интерфейсом прикладного программирования (англ. API — Application Programming Interface). В ОС Windows применяется Windows API, а в Unix-подобных операционных системах — стандарт POSIX (англ. Portable Operating System Interface for Unix — переносимый интерфейс операционных систем Unix).
Сейчас для разработки программ чаще всего используют интегрированные среды (англ. IDE — Integrated Development Environment). В такую оболочку обычно входит текстовый редактор для набора текста программ, транслятор, компоновщик, отладчик и профилировщик.
Многие современные интегрированные среды позволяют строить интерфейс программы (расположение элементов в окне) с помощью мыши. Они называются средами быстрой разработки приложений (англ. RAD — Rapid Application Development) или средами визуального программирования. На рисунке 6.17 показано окно RAD-среды Lazarus для программирования на объектной версии языка Паскаль.
Среди профессиональных RAD-сред нужно в первую очередь назвать Microsoft Visual Studio (msdn.microsoft.com/vstudio). Её профессиональная версия — коммерческая, но все желающие могут бесплатно скачать и использовать ограниченную версию (Express) для учебных целей.
Большой популярностью пользуются также среды Dev-C++ (wxdsgn.sourceforge.net) и Delphi (embarcadero.com). Кросс-платформенная среда Code::Blocks (www.codeblocks.org) распространяется бесплатно, существуют версии для Windows, Mac OS и Linux.
Рис. 6.17
Следующая страница Вопросы и задания
Cкачать материалы урока
Источник: xn—-7sbbfb7a7aej.xn--p1ai
Путь от текста программы к исполняемому коду
Чтобы выполнить программу, требуется перевести ее на язык, понятный процессору — в машинные коды. Этот процесс состоит из нескольких этапов.
Сначала исходный текст программы обрабатывается препроцессором. Он разыскивает в тексте программы «свои» директивы (инструкции, команды), которые начинаются с символа # («решетка»), и выполняет их. Директивы препроцессора позволяют вставить в программу тексты из других файлов, исключить из процесса компиляции фрагменты кода или выполнить замену одних фрагментов другими.
Обработанный препроцессором текст программы (в стандарте С++ он называется «единица компиляции») передается компилятору, который выполняет лексический и синтаксический анализ. На фазе лексического анализа лексический анализатор (сканер) последовательно просматривает поступающий на его вход поток символов, составляющих исходный текст программы, и выделяет допустимые лексемы. Их границы определяются по разделителям, пробельным символам и другим лексемам.
На фазе синтаксического анализа синтаксический анализатор (парсер) на основе грамматики языка распознает построенные из лексем выражения и операторы. При этом выявляются синтаксические ошибки. Выполняется также семантический анализ, целью которого также является обнаружение разного рода смысловых ошибок (например, таких, как повторное описание переменной).
Если ошибок в программе не обнаружено, выполняется фаза генерации кода.Конкретный вид кода зависит от того, приложение какого типа мы создаем: Windows или. NET. Если это обычное приложение Windows, то строится объектный модуль — заготовка исполняемой программы в машинных кодах. Для приложения. NET формируется код на системно-независимом языке CIL.
Дальнейшая судьба этого кода также зависит от типа создаваемого приложения. Для обычного приложения Windows компоновщик (синонимы — линкер, редактор связей) формирует исполняемый модуль программы, подключая к объектному модулю другие объектные модули, в том числе содержащие элементы стандартных библиотек, которые используются в любой программе (например, для выполнения вывода на экран). Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе компоновки. Исполняемый модуль имеет расширение. exe и запускается на выполнение обычным образом.
Приложение. NET собирается в сборку компоновщиком сборки и запускается на выполнение под управлением виртуальной машины CLR. При создании. NET -приложений также имеется возможность компилировать отдельно несколько модулей программы, собирая их потом в одну сборку.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru