Процесс компиляции программ на C++
В данной статье я хочу рассказать о том, как происходит компиляция программ, написанных на языке C++, и описать каждый этап компиляции. Я не преследую цель рассказать обо всем подробно в деталях, а только дать общее видение. Также данная статья — это необходимое введение перед следующей статьей про статические и динамические библиотеки, так как процесс компиляции крайне важен для понимания перед дальнейшим повествованием о библиотеках.
Все действия будут производиться на Ubuntu версии 16.04.
Используя компилятор g++ версии:
$ g++ —version g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Состав компилятора g++
Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.
Зачем нужно компилировать исходные файлы?
Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать как библиотеку. Поэтому каждый исходный файл требуется скомпилировать в исполняемый файл, динамическую или статическую библиотеки (данные библиотеки будут рассмотрены в следующей статье).
Отличие интерпретируемого языка программирования от компилируемого для самых маленьких и нубов.
Этапы компиляции:
Перед тем, как приступать, давайте создадим исходный .cpp файл, с которым и будем работать в дальнейшем.
driver.cpp:
#include using namespace std; #define RETURN return 0 int main()
1) Препроцессинг
Самая первая стадия компиляции программы.
Препроцессор — это макро процессор, который преобразовывает вашу программу для дальнейшего компилирования. На данной стадии происходит происходит работа с препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include), убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски кода в соответствии с условиями #if, #ifdef и #ifndef.
Хэдеры, включенные в программу с помощью директивы #include, рекурсивно проходят стадию препроцессинга и включаются в выпускаемый файл. Однако, каждый хэдер может быть открыт во время препроцессинга несколько раз, поэтому, обычно, используются специальные препроцессорные директивы, предохраняющие от циклической зависимости.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг:
g++ -E driver.cpp -o driver.ii
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
int main()
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
2) Компиляция
На данном шаге g++ выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код — это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s:
$ g++ -S driver.ii -o driver.s
driver.s
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.
Объектный файл — это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом.
Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o:
$ as driver.s -o driver.o
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, следует рассказать о таблице символов.
Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах.
Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver:
$ g++ driver.o -o driver // также тут можно добавить и другие объектные файлы и библиотеки
5) Загрузка
Последний этап, который предстоит пройти нашей программе — вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу:
$ ./driver // Hello, world!
Заключение
В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.
Источник: temofeev.ru
Что такое компиляция
Компиляция – это слово многогранное, и в зависимости от сферы применения имеет разные, иногда непохожие значения.
Чаще всего этот термин используют в программировании, но так же он употребим в литературе, научных трудах, музыке и финансах.
Компиляция — это.
Слово образовано от латинского compilatio, и буквально переводится как «ограбление или кража». Но в отрицательном контексте его можно встретить всё же намного реже, чем в положительном.
Компиляция — это сочинительство (не обязательно литературное) на основе чужих работ и исследований. Она представляет пересказ написанного кем-то ранее, и поэтому ничего нового не даёт.
Но на самом деле, даже в таком виде она бывает полезной. Ведь если человек, создающий сие сочинение, хорошо разбирается в теме, и связывает чужие используемые отрывки своими рассуждениями и связками, с помощью которых легче отследить логическую цепочку. И это очень важно и полезно.
Такие известные писатели, как С.Цвейг, А.Моруа, были отличными компиляторами, произведениями которых зачитывалось не одно поколение любителей литературы.
Компиляция текста — что это такое
Само понятие существует столько же, сколько талантливые книги, как научные, так и художественные.
Профессиональные компиляторы ставят в конце своего нового текста список материалов, которые они использовали. И то, что список, как правило, очень большой, уже говорит о серьёзной проделанной работе.
Количество источников — важное отличие от плагиата.
Использование множества источников создаёт информативный материал, в котором можно найти большое количество данных по заданной теме. В положительном контексте это служит популяризаторским и просветительским целям.
Но трактование слова компиляция в смысле «кража» тоже встречается.
Это, например, почти все газеты и журналы, которые очень часто вместо собственных мыслей и описаний событий, используют уже готовые, взятые в интернете, и только пересказанные своими словами, не исключено, что ещё и с искажением смысла. Случайным, или не очень, если издание ангажированное (это как?).
Компиляция в программировании — что это
Это трансляция программы, написанной на высокоуровневом языке, в программу с языком более низкого уровня, но с совпадающим или похожим машинным кодом. Для этого используются компиляторы.
Существует несколько категорий компиляции:
- условная, когда у транслируемого текста те же нормы, что и в первоначальном варианте;
- пакетная, с использованием нескольких модулей в задании;
- построчная — поочерёдная интерпретация завершённой грамматической конструкции.
Именно в программировании термин встречается особенно часто, в других сферах он чаще заменяется синонимами.
Другие примеры употребления термина
- В музыке это понятие распространено не меньше, чем в литературе, но означает несколько иное.
- Компиляцией можно назвать любое попурри. По утверждению википедии, попурри, pot-pourri — мешанина. В переводе с французского, музыкальная пьеса из популярных мотивов и музыкальных тем. Но попурри отличается тем, что часто является импровизацией, а не ранее оформленным альбомом.
- Так же называются альбомы на определённую тему. Они могут быть разными, например: составленные из узнаваемых работ одного автора, созданных им в разное время; хитпарады; музыка одного стиля, сборники одного автора или исполнителя.
Классические танцы дополняет современный, балет (это что?) и брейк одновременно существуют на одной сцене. Музыкальное сопровождение полностью эклектично. Представители стиля — канадский цирк Дюсалей, театр Моники (США), Театр Золотых фигур (Россия).
Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru
Эта статья относится к рубрикам:
Сейчас весь мир помешался на уникальности текстов, в том числе и в научных работах. Пропускают текст через специальную программу, которая выдаёт в процентах уникальность работы, вот с компиляцией тут вообще теперь ловить нечего, даже ссылки на цитируемые источники не помогут, ибо программе на них плевать, а люди за ней не подчищают.
Не соглашусь с Владимиром — учитывая сколько сейчас пишется научных работ, без компиляции никак не обойтись.
Компилируемые программы работают куда быстрее транслируемых, а всё потому что, во время работы программы не тратится время на преобразование исходного кода в машинный.
Хочу вступиться за газеты, они же подают новости, разумеется, у каждой новости есть первоисточник, если же новости придумывать, то это уже будет фейк.
Ваш комментарий или отзыв
Источник: ktonanovenkogo.ru
Компилируемый и интерпретируемый языки: основы для начинающих разработчиков
Изучение
На чтение 8 мин Просмотров 421 Опубликовано 12.07.2022
По мере развития компьютерной науки менялись и способы взаимодействия программистов с компьютерами, основная цель которых заключалась в том, чтобы указать им, что делать. Сегодня современные языки программирования ближе к человеческим языкам, чем двоичные инструкции, которые понимает электронный компьютер. Это поднимает вопрос о том, как эти языки программирования становятся понятными компьютерам.
Ответ частично связан с компилируемыми и интерпретируемыми языковыми реализациями, и эта статья заложит основу для изучения сходств и различий между этими концепциями. Мы кратко представим тему языков программирования и предоставим некоторые соответствующие аналогии, которые помогут вам понять, как языки программирования взаимодействуют с компьютерами.
Одно небольшое замечание: языки программирования сами по себе не компилируются и не интерпретируются и могут быть реализованы с помощью компилятора или интерпретатора. Но для простоты в этой статье мы будем ссылаться на компилируемые и интерпретируемые языки.
Широкое введение в языки программирования
На самом фундаментальном уровне компьютеры понимают машинный язык. Многословный набор инструкций, состоящий из двоичных данных (единиц и нулей), сообщает физическим компонентам или оборудованию компьютера выполнять операции и передавать информацию в разные места и, в конечном счете, выполнять задачу, которую хочет выполнить программист.
Символы в двоичном формате
A 01000001
a 01100001
B 01000010
b 01100010
C 01000011
c 01100011
В первые дни программирование электронных компьютеров было как физической работой, так и умственной. Компьютеры в основном состояли из электронных ламп, которые нужно было вручную подключать, отключать, заменять и перемещать — все это для того, чтобы гигантские машины обрабатывали уравнения. Каким бы трудоемким это ни было, программисты в своих действиях говорили на машинном языке, вводя двоичные данные для обработки информации и получения результатов. Более поздние итерации компьютерных технологий позволили программистам вводить типизированные программы на машинном языке, устраняя необходимость в танцах с электронными лампами, которые были в первые дни.
Итак, на машинном языке стало проще писать! Однако у программистов по-прежнему была огромная проблема: количество двоичного кода, необходимого для того, чтобы заставить машину выполнить даже простую команду, было (и есть) откровенно огромным.
Если машинный язык настолько сложен для основных функций сложения, представьте, сколько строк единиц и нулей вы бы увидели, если бы пытались сказать процессору обработать сложный алгоритм. Вероятно, вы можете себе представить, что программирование современного приложения на уровне машинного кода практически невозможно.
Эта проблема привела к ценному изобретению: языку ассемблера. Язык ассемблера — это своего рода сокращение или мнемоническое устройство (для обобщения), которое напрямую соотносится с двоичным кодом. Почти каждая аппаратная архитектура компьютера имеет свой собственный уникальный язык ассемблера, который транслируется в шаблоны единиц и нулей и в конечном итоге говорит компьютеру, что делать. Таким образом, работа программиста на электронных лампах была заменена ассемблером, компьютерной программой, содержащей набор инструкций, определенных разработчиками аппаратного обеспечения для перевода языка ассемблера в машинный язык.
К несчастью для программистов того времени, написание чего-либо, кроме самых простых программ на языке ассемблера, по-прежнему оказывалось не только трудным, но и отнимающим много времени. Эта проблема снова привела к созданию дополнительных языков, напрямую соотносящихся с различными аспектами языка ассемблера (уже являющегося мнемоническим приемом). Именно здесь мы начинаем видеть самые первые итерации современных языков программирования. Одним из наиболее широко используемых примеров является язык C, который больше похож на человеческий английский, как вы можете видеть в этом коде.
#includestdio.h> int main() printf(«Hello Worldn»); return ; >
Эти удобочитаемые языки, называемые языками высокого уровня, могут иметь больше смысла для программиста, чем двоичный код. Но если вы попытаетесь дать компьютеру программу на языке высокого уровня, подобную приведенному выше коду, это ничего не даст. Это не потому, что компьютер имеет что-то против вас, а просто потому, что он не понимает. Это все равно, что дать вашему другу, который говорит только по-английски, руководство по испечению шоколадного торта, только оно написано на урду.
Чтобы ваш друг мог следовать руководству, его инструкции необходимо преобразовать на язык, который понимает ваш друг (английский). Это можно сделать, либо составив перевод руководства и передав его своему другу, либо интерпретировав инструкции для него, пока он выпекает. Именно здесь проводится различие между компилируемыми и интерпретируемыми языками. К счастью, большинство современных компьютеров поставляются со встроенными ассемблерами, поэтому им не потребуется перевод на уровень машинного языка (двоичного кода). Но их еще нужно перегонять на уровень ассемблерного кода.
Что такое компилируемый язык?
Компилируемые языки — это языки программирования, которые должны быть переведены в машиночитаемые инструкции с помощью компиляторов, которые представляют собой программы, преобразующие исходный код в человекочитаемый формат перед выполнением любого кода. Генерируется исполняемый файл, а затем скомпилированная программа передается на целевую машину для выполнения.
Компилируемые языки работают быстро и эффективно, так как инструкции предварительно скомпилированы на родной язык целевой машины, которая затем не нуждается в помощи при выполнении инструкций.
Некоторые примеры скомпилированных языков включают:
- C, C++, and C#
- Go
- Rust
- Haskell
- Cobol
Что такое интерпретируемый язык?
Интерпретируемые языки — это языки программирования, для которых инструкции не компилируются для целевой машины в машиночитаемой форме. Скорее, этим языкам помогает переводчик. Интерпретатор — это программа, которая транслирует высокоуровневый удобочитаемый исходный код в низкоуровневый машиночитаемый целевой код построчно во время выполнения интерпретируемой программы.
Интерпретация языка менее эффективна, поскольку интерпретатор должен присутствовать на протяжении всего процесса, но эти языки также хорошо адаптируются.
Некоторые примеры интерпретируемых языков включают:
Скомпилированные и интерпретированные: сравнение
Как было сказано в предыдущих двух разделах, компилируемые и интерпретируемые языки по существу выполняют одну и ту же функцию: переводят информацию с языка, понятного программисту, на язык, понятный машине. Тем не менее, у каждого есть свои преимущества и недостатки.
Compilers
- Переводите весь исходный код в машинный код перед выполнением
- Как правило, имеют более высокую скорость выполнения по сравнению с интерпретируемыми языками.
- Требуется дополнительное время перед тестированием для завершения всего шага компиляции
- Генерировать двоичный код, зависящий от платформы
- Предотвращается завершение при возникновении ошибок компиляции
Interpreters
- Преобразуйте каждую команду в исходном коде в машинный код, а затем выполните ее, прежде чем переходитьк следующей команде.
- Как правило, имеют более низкую скорость выполнения,чем скомпилированные языки, потому что они переводят исходный код во время выполнения.
- Часто более гибкие, с такими функциями, как динамическая типизация и меньший размер программы.
- Генерировать двоичный код, не зависящий от платформы,поскольку интерпретаторы сами выполняют исходный код программы.
- Отладка исходного кода во время выполнения
Компилируемые языки очень эффективны с точки зрения требований к обработке, поскольку они не требуют дополнительной мощности, потребляемой интерпретатором. В результате они могут надежно работать очень быстро с минимальными перерывами и использовать в процессе меньше ресурсов компьютера. Однако, когда программист хочет обновить программное обеспечение, написанное на скомпилированном языке, необходимо отредактировать, перекомпилировать и перезапустить всю программу.
Вернемся к аналогии с выпечкой. Представьте, что переводчик только что скомпилировал весь рецепт шоколадного торта в несколько шагов и обнаружил, что днем позже вы (программист) открыли новый процесс изготовления одного компонента. К сожалению, вы говорите и пишете только на урду, и весь рецепт и весь процесс зависят от нового компонента. Мало того, что вы должны написать весь рецепт заново, но и переводчик (компилятор) должен снова выполнить весь процесс.
Теперь представьте тот же сценарий с интерпретируемым языком. Поскольку переводчик присутствует все время, пока ваш друг готовит выпечку, вы можете очень легко попросить переводчика попросить вашего друга ненадолго остановиться. Затем вы можете сами переписать новую часть процедуры, отредактировать затронутые компоненты рецепта и указать интерпретатору возобновить процесс с новой реализованной процедурой. Несмотря на то, что с интерпретатором процесс менее эффективен, редактирование инструкций (программы) намного проще.
Однако представьте, что у вас есть проверенный временем рецепт чего-то вроде яблочного пирога. Бабушка и дедушка ваших бабушек и дедушек передали ее вам, и она не изменилась за более чем столетие. Рецепт отличный, и добавление к нему сослужило бы медвежью услугу. В этом сценарии компилируемый язык является королем. Ваш друг (компьютер) мог уверенно читать и выполнять инструкции (программу) самым эффективным способом до скончания века без необходимости разрушительных итераций.
В реальном мире скомпилированные языки предпочтительнее для ресурсоемкого программного обеспечения, требующего интенсивного использования ресурсов, или в распределенной системе, где ключевым фактором является оптимальная производительность процессора. Интерпретируемые языки предпочтительны для менее ресурсоемких приложений, где ЦП не является узким местом, таких как пользовательские интерфейсы. Еще одним вариантом использования интерпретируемых языков была разработка на стороне сервера до появления контейнеров. Поскольку процессор проводил большую часть времени в ожидании запросов или ответов от базы данных, неоптимальная производительность процессора не вызывала беспокойства.
Начните с языков программирования
Компилируемые и интерпретируемые языки существуют по разным причинам. Именно благодаря этим инновациям современные приложения могут так многого добиться, и если бы не программисты с электронными лампами на заре вычислительной техники, не существовало бы ни одной категории.
К настоящему моменту вы должны иметь общее представление о различиях между компилируемыми и интерпретируемыми языками, но мы лишь дали вам общее введение в эту тему. Для следующих шагов вашего пути обучения вы можете узнать, как пересекаются эти типы языков, а также углубиться в программирование каждого типа. Вы также можете прочитать о более сложных темах, таких как JIT-компиляция, компиляция байт-кода и объектный код.
Источник: bestprogrammer.ru
Компиляция – что это такое простыми словами
Компиляция, от латинского «компилатио» — «кража, ограбление». Данный термин используется в различных сферах человеческой деятельности, и, в зависимости от этого, может принимать различные значения.
Музыка
В музыкальном бизнесе под компиляцией подразумевается некий музыкальный сборник, включающий в себя песни и мелодии на определённую тематику.
Наиболее часто встречающимися музыкальными компиляциями можно назвать сборники разных исполнителей, объединённых одним временем их написания — «Дискотека 80-х (90-2000-х)», или «Хит-парады» от различных студий звукозаписи или радиостанций.
Также компиляцией называется сборник одного исполнителя, составленный из песен, входящих в различные альбомы, или написанные в различные периоды его творческой деятельности.
Классические компиляции
Классическими компиляциями можно назвать следующие типы музыкальных сборников:
- Сборник лучших хитов определённого исполнителя. Часто выходят в виде коллекционных дисков. Если же певец до сих пор записывает новые вещи, то в подобные сборники могут включаться одно-два новых произведения, чтобы фанаты только ради них приобрели диск целиком.
- Раритетные сборники одного исполнителя. В них обычно включаются ранее не выходившие версии песен, внестудийные записи, «квартирники» и прочие ценные для фанатов и «музыкальных гурманов» вещи.
- Полный набор дисков, охватывающий всё творчество определённой группы или певца. Также подобные коллекции могут охватывать обширные по временным рамкам музыкальные произведения определённого жанра – рок-н-ролл, рок, джаз и т.п.
- Сборники, составленные по какой-либо определённой теме. Например, песни о любви, армейские песни, студенческий фольклор.
- Хит-парады. Обычно выпускаются в рамках танцевальной поп-музыки, и представляют лучших исполнителей по разным версиям за последний год.
- Семплеры. Сборники молодых, но перспективных исполнителей, выпускаемые звукозаписывающими компаниями на деньги продюсерских центров в рекламных целях. Распространяются бесплатно, либо за чисто символическую плату. Выпуск семплеров организуется для «раскрутки» определённого, ещё малоизвестного певца или группы. Семплеры могут предназначаться для широкой публики, или для внутрикорпоративного использования – для продюсеров, редакторов телерадиостанций.
Программирование
В программирование под компиляцией подразумевается переделка кода программы, с целью придания ему большей универсальности. К примеру, определённая программа была создана на одном из компьютерных языков. В связи с этим возникает проблема с передачей этой программы иным пользователям, которые работают в другой программной среде.
В данном случае применяется специальная программа-компилятор, способный трансформировать необходимую программу в простейшие машинные кода.
После этого компилированную программу можно устанавливать на любом компьютерном оборудовании, без необходимости загрузки подходящего к ней программного обеспечения. Отсюда возникает понятие «компилируемые компьютерные языки», то есть, те из них, которые легко разлагаются на базовые коды.
На сегодня в информатике выделяется порядка десяти типов программ-компиляторов, каждый из которых действует своим, особым способом – самокомпилируемый, инкрементальный, векторизующий и т.д.
Литература
Литературная компиляция более всего отвечает дословному переводу данного термина («кража»). Подобная деятельность заключается в сочинении и составлении неких научных или учебных текстов, основываясь на чужих источниках. При этом не производится их творческая обработка, новое осмысление. В редких случаях компиляцией может являться и литературное произведение, причём как полностью, так и частично.
В этой ситуации компиляцию следует отличать от плагиата – прямого воровства чужой интеллектуальной собственности. В компиляции используется большое число первоисточников, и все они перечисляются либо в виде сносок, либо отдельным списком в конце произведения.
Таким образом, авторское право не нарушается в смысле прямого воровства идеи и выдачи её за свою собственную. Современный классический пример компиляции – любая энциклопедия. Она составлена в виде «выжимок» из научно-исследовательских трудов различных учёных деятелей.
Литературные компиляции обычно преследуют учебные или просветительские цели. Как отдельный вид литературного искусства сформировалась ещё в те годы, когда законодательно установленных положений об авторском праве ещё не существовало. В русской классике к компиляциям в ранние годы своего творчества часто прибегали такие авторы, как М. Лермонтов, К. Батюшков, И. Козлов.
Японская анимация. Полнометражный или короткометражный мультипликационный фильм, созданный по мотивам определённого сериала, в жанре «аниме».
Источник: max-inform.ru