Компиляция в программировании. Что такое компилятор - описание

Информатика, кибернетика и программирование

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

Компиляция

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

Исполняемая

Программа

исходная программа

Компилятор

Синтаксический контроль текста программы

Генератор машинного

кода

сообщения об

ошибках

Рис. 1.1. Схема работы компилятора

Компилятор, схема работы которого приведена на рис. 1.1, выполняет последовательно две задачи:

  1. Проверяет текст исходной программы на отсутствие синтаксических ошибок.
  2. Создает (генерирует) исполняемую программу – машинный код.

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

Генерация машинного кода компилятором свидетельствует лишь о том, что в тексте программы нет синтаксических ошибок. Убедиться, что программа работает правильно можно только в процессе ее тестирования – пробных запусках программы и анализе полученных результатов.

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


А также другие работы, которые могут Вас заинтересовать

42971. Принципиальная схема высокоэффективного импульсного регулятора напряжения постоянного тока 1.34 MB
Регуляторыстабилизаторы напряжения или других параметров электроэнергии в цепях постоянного тока выполняются преимущественно на основе полупроводниковых приборов. На выходное напряжение преобразователя электроэнергии влияют различные факторы: изменение входного напряжения и тока нагрузки температура окружающей среды и др. Поскольку они вызывают изменения выходного напряжения их в этом смысле называют возмущающими. Точность поддержания напряжения при воздействии различных возмущающих факторов характеризуется соответствующими параметрами...
42972. Разработка ремонтной мастерской с ремонтно-технологической документацией на ремонт узлов металлоконструкции автомобильного крана 1.23 MB
Определение годового объема работ по ТО и Р ремонтной мастерской и распределение трудоемкости по видам работ 15 1. Определение суммарного объема работ по ТО и Р 15 1. Годовой объем работ по отдельным зонам ремонтной мастерской 16 1. Распределение трудоемкости ТО по видам работ 17 1.
42973. Проектирование консольно-фрезерного станка 155.12 KB
Серийным называется такое производство, при котором изготовление изделий производится партиями или сериями, состоящими из одноименных, однотипных по конструкции и одинаковых по размерам изделий.
42974. Разработка самозагружающегося скипового подъемника, предназначенного для загрузки составляющих в растворосмеситель 363.31 KB
Дипломный проект состоит из расчетно-пояснительной записки содержащий 5 основных разделов и состоящий из 72 страниц машинописного текста и графической части состоящей из 9 листов чертежей. В расчётно-пояснительной записке дан обзор существующей российской техники для получения бетонной и растворной смесей и способов загрузки составляющих в смесители произведен расчёт на прочность скипового подъёмника а также расчет экономической эффективности рассмотрен вопрос безопасности жизнедеятельности приводится список используемой для выполнения...
42975. Цех ремонта сельхозтехники 103.5 KB
площадь застройки промышленного здания в пределах внешнего периметра наружных стен. полезная площадь промышленного здания. Лёгкий бетон=1000 кг м3 Расчёт вспомогательных помещений Показатели для расчёта: Количество работающих во всех сменах: А=А1А2=8436=120 А1 мужчины А2 женщины Количество работающих в наиболее многочисленной смене: В=В1В2=4921=70 В1 мужчины В2 женщины Количество служащих: С=15 Вид помещений Показатель Значение Примечание Все вспомогательные помещения Площадь м2 504...
42976. Двухэтажный 4-квартирный жилой дом со стенами из керамических камней 87.5 KB
Объемнопланировочное решение здания. Конструктивные решения здания. Характеристика района строительства Место расположения будущего здания в городе Рязань. Климатические условия района строительства: среднегодовая температура 38 0С минимальная зафиксированная температура 410С максимальная зафиксированная температура 380С продолжительность периода со среднесуточной температурой  0С составляет 145 суток количество осадков за год 644мм средняя месячная относительная влажность воздуха: наиболее холодного месяца...
42977. Цех по ремонту автотранспорта 61.5 KB
Введение Исходные данные Характеристики климатического района Характеристика рельефа Характеристики огнестойкости и взрыво-пожаробезопасности Технологическая часть Направленность технологического процесса Технологические зоны Грузоподъемное оборудование Технологические зоны с агрессивными средами Объемно-планировочные решения Параметры проектируемого здания Помещения и перегородки Ворота Окна Полы Кровля Расчет количества водоприемных воронок Фасад...
42978. Газоснабжение жилого микрорайона в Советском районе г. Астрахань с газификацией жилого много квартирного дома 86 KB
При определении сметной стоимости строительства внутренних инженерных систем использованы Территориальные единичные расценки на строительные работы ТЕР. ТЕР2001 предназначены для определения прямых затрат в сметной стоимости строительства а также для расчётов за выполненные строительные работы. Сборники ТЕР2001 разработаны в базисном уровне цен Госстроя по состоянию на 1 января 2001 года. При расчёте сметной стоимости базовоиндексным методом приняты: а Объёмы работ для подсчета сметной стоимости работ определяются в разделе...
42979. Двухэтажный 6-квартирный жилой дом со стенами из силикатного кирпича 88.5 KB
Объемнопланировочное решение здания. Конструктивные решения здания. Характеристика района строительства Место расположения будущего здания в городе Орел. Климатические условия района строительства: среднегодовая температура 49 0С минимальная зафиксированная температура 350С максимальная зафиксированная температура 380С продолжительность периода со среднесуточной температурой  0 0С составляет 138 суток количество осадков за год 571мм средняя месячная относительная влажность воздуха: наиболее холодного месяца...

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

Язык для операционной системы

Для начала стоит абстрагироваться, ведь программирование – это не только вбивание определенных ключей-слов в машину, это еще и тщательно продуманные действия, связанные с компонентами системы. Изначально был двоичный код, потом программисты создали полумашинный язык программирования – ассемблер, но для чего?

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

В языке ассемблер все осуществляется благодаря регистрам процессора: деление, умножение, перемещение значения из точки А в точку Б и т. д. Основная его проблема, что он все еще является полумашинным, но все равно поддается прочтению человеку, в отличии от хаотично раскиданных битов. Еще одним минусом было ограниченное количество этих самых регистров.

В 80-х годах решили придумать язык программирования, благодаря которому можно будет легко и просто написать операционную систему. Так появился С и компилятор С GCC от компании GNU. Если вы пользуетесь Linux, то обязательно должны были видеть продукты данной компании. Кстати, ассемблер используется и поныне, ведь некоторые компиляторы создают объектные файлы с двоичным кодом, а другие исполнительные – с кодом на ассемблере. Все зависит от платформы разработчика.

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

    Дебагер – программа, которая отправляет сообщения об ошибке от линковщика, препроцессора, интерпретатора. Препроцессор – это программа, главной задачей которой является поиск специальных меток, начинающихся со знака #, и выполнение определенного рода команд. Например, добавления сторонней библиотеки для компиляции проекта. Интерпретатор – программа, которая переводит наш более-менее понятный язык программирования в двоичный код или ассемблер. Линковщик – программа, благодаря которой недостающие файлы автоматически подключаются.

Также существует 2 типа сборки проекта компилятором: динамическая и статическая. В первой добавляются лишь нужные проекту файлы, несмотря на среду разработки, а во втором случае - все в кучу (подключенные, конечно). Итак, из этого уже можно сказать, что компилятор – это целый список программ для сбора и обработки информации в понятный и логичный для компьютера вид. Дальше мы рассмотрим, с чего все начиналось.

Первые простейшие компиляторы

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


Возможна ли сборка без нового языка?

Если вы достаточно толковый программист, то вполне сможете выполнить эту задачу. Правда, для этого понадобится немало времени и сил. Кстати, раньше даже была профессия такая – программист-линковщик. Это только в новых языках программирования все автоматизировано, а раньше людям приходилось связывать куски кода Make файлами. Между прочим, некоторые проекты на Linux и сейчас можно собрать с помощью этих самых Make-файлов, нужно лишь указать их зависимости вручную.


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

Как видите, компилятор – это не только программа, а еще и усилия множества людей. А они, как утверждал Генри Форд, пытаются автоматизировать каждый процесс.

Лучший компилятор Windows

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

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


    Во-первых, он взял солидную долю стандартных библиотек от С, и новые компиляторы G++ способны компилировать код С, что уже само по себе указывает на их схожесть. Во-вторых, С++ был создан, чтоб заместить С, и итоги этого мы видим сейчас. К слову, программа компилятор G++ не "ругается" до тех пор, пока не будет использован хотя бы один класс – в этом и есть основное отличие двух языков. Можно назвать G++ лучшим компилятором, не зря ведь благодаря ему пишут мобильные приложения, операционную систему Windows и т. д.

Ваш путь будет тернист – это стоит знать прежде всего. Для начала работы с языком, например, если это С, вы обязательно должны будете ознакомиться с компилятором C. А если с ним не подружиться и не понять его логику, то ваши проекты один за одним будут лагать и вылетать.


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

В заключение

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

Общие замечания к интерпретаторам

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

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

Особое положение занимают интерактивные, инкрементальные (поша­говые) интерпретаторы. Для них не обязательно требуется сначала подго­товить всю программу целиком, включая вводимые данные, и только по­том ее интерпретировать. При интерактивной интерпретации можно программу и входные данные приготовить отдельными частями и полу­ченную часть - насколько это возможно - тут же проинтерпретировать (ЯП ВASIC специально ориентирован на инкрементальную интерпретацию).

Сейчас все ближе подходят к созданию интерпретаторов для таких языков, которые выглядят не так, как классические ЯП, ориентирован­ные на вычисления. В частности, в результате длительных исследований стала возможной интерпретация определенных языков, ориентированных скорее на спецификации, а не на вычисления (например, язык ПРОЛОГ, который служит для составления программ в машинно-интерпретируемой логике). Впрочем, для таких языков имеются определенные непре­одолимые преграды из-за границ вычислимости и сложности, которые для многих постановок задач делают практически невозможным исполь­зование этих языков.

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

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



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

ЯП определяется его синтаксисом и семантикой. В процессе компи­ляции или интерпретации программа, понимаемая как синтаксический объект, берется в качестве входных данных и в соответствии с ее семан­тикой превращается в программу на другом языке или в последователь­ность действий (процесс выполнения).

Языки программирования бывают высокого и низкого уровней.

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

Языки высокого уровня позволяют задавать желаемые действия в программе с по­мощью определенного набора операторов. Они значительно ближе и понятнее человеку, чем компьютеру. Каждая команда такого языка может состоять из десятка и более команд микропроцессо­ра. Писать программы на ЯП ВУ легче.


1 – машинно-зависимые (Ассемблер). Языки низкого уровня.

2 – машинно-ориентированные (Си)

3 – универсальные (Фортран, Паскаль, Basic)

4 - проблемно-ориентированные (GPSS, Лого, объектно-ориентированные (форт, Смолток))

5,6,7 – (Пролог, Лисп, СНОБОЛ).

Си, Си++ - вся машинно-зависимая часть программы достаточно легко локализуется и модифицируется при переносе программы на другую архитектуру.

Фортран – первый язык высокого уровня (1958г., фирма IBM), используется и до сих пор, поддерживает модульное программирование, особенно предпочитается математиками.

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

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

Лого , среди проблемно-ориентированных языков – используется в основном для целей обучения. Это диалоговый процедурный язык (простой синтаксис).

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

Смолток – один из ранних ОО ЯП, основная конструкция – это объект и действия с ним, предназначен для нечисловых задач (при построении систем искусственного интеллекта).

Форт – используется при решении задач имитационного моделирования в графических системах.

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

Пролог – язык ИИ, даются термины и связи, а с его помощью создаются новые.

Лисп – имеет мощные графические конструкции, позволяет создавать программы проектирования (деталей, например). Он ориентирован на конструкторскую деятельность. Имеет библиотеку примитивов.

СНОБОЛ – язык ИИ.

Поколения языков программирования

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

1. Начало 50-х годов. Появились первые компьютеры и первые языки ассемблера, в которых программирование велось по принципу «Одна инструкция - одна строка».

2. Конец 50-х начало 60-х годов. Разработан символический Ассемблер, в котором появилось понятие переменной. Возросла скорость разработки и надежность программ.

3. 60-е года. Рождение языков высокого уровня. Простота программирования, не­зависимость от конкретного компьютера, новые мощные языковые конструк­ции.

4. Начало 70-х и по настоящее время. Проблемно-ориентированные языки, опери­рующие конкретными понятиями узкой предметной области. Мощные операто­ры, для которых на языках младшего поколения потребовались тысячи строк исходного кода.

5. Середина 90-х. Системы автоматического создания прикладных программ с помощью визуальных средств разработки, без знания программирования. Инст­рукции вводятся в компьютер в наглядном виде с помощью методов, наиболее удобных для человека незнакомого с программированием.

В нашем институте на различных курсах вы научитесь программировать на различных языках программирования.

Здравствуйте, дорогие читатели! Сегодня мы с вами немного окунемся в теорию. Наверняка, вы все когда-то хотели отправить свою супер-пупер программу другу. Но как это сделать? Не заставлять же его устанавливать PascalABC.NET! О том, как это сделать, мы сегодня и поговорим.

Все языки программирования делятся на два типа - интерпретируемые и компилируемые .

Интерпретаторы

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

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

При интерпретации выполнение кода происходит последовательно строка за строкой (от инструкции до инструкции). Операционная система взаимодействует с интерпретатором, а не исходным кодом.

Примеры интерпретируемых языков: PHP, JavaScript, C#, Python.

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

Программы же, рассчитанные на интерпретаторы, могут выполняться в любой системе, где таковой интерпретатор присутствует. Типичный пример - код JavaScript. Интерпретатором его выступает любой современный браузер. Вы можете однократно написать код на JavaScript, включив его в html-файл, и он будет одинаково выполняться в любой среде, где есть браузер. Не важно, будет ли это Safari в Mac OS, или же Internet Explorer в Windows.

Компиляторы

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

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

При компиляции весь исходный программный код (тот, который пишет программист) сразу переводится в машинный. Создается так называемый отдельный исполняемый файл , который никак не связан с исходным кодом. Выполнение исполняемого файла обеспечивается операционной системой. То есть образуется, например,.EXE файл.

Примеры компилируемых языков: C, C++, Pascal, Delphi.

Ход работы компилятора.

Препроцессинг

Эту операцию осуществляет текстовый препроцессор .

Исходный текст частично обрабатывается - производятся:

  • Замена комментариев пустыми строками
  • Подключение модулей и т. д. и т. п.

Компиляция

Результатом компиляции является объектный код .

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

Компоновка

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

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

EXE файл.

После компоновки у вас образуется.EXE файл вашей программы. Вы можете кинуть ее другу, и она откроется у него прямо в командной строке, как в старом добром DOS. Давайте попробуем создать.EXE файл. Все действия будут приводится в PascalABC.NET.

Заходим в Сервис -> Настройки -> Опции компиляции. Поверяем, стоит ли галочка напротив 2 пункта. Если стоит, то убираем ее.

Теперь откройте свою программу и запустите ее.

Откройте директорию, в которой у вас лежит исходный код программы.

Вот он,.EXE файл.

Кликаем по приложению. Как вы видите, после ввода данных, окошко сразу закрывается. Для того чтобы окно не закрывалось сразу, следует дописать две строчки кода, а именно: uses crt (перед разделом описания переменных) и readkey (в конце кода, перед оператором end).


Подключаем внешнюю библиотеку crt и используем встроенную в нее функцию readkey.

Теперь окно закроется по нажатию любой клавиши.

На заметку: PascalABC.NET - это интегрированная среда разработки.

Среда разработки включает в себя:

  • текстовый редактор;
  • компилятор;
  • средства автоматизации сборки;
  • отладчик.

На сегодня все! Задавайте любые вопросы в комментариях к этой статье. Не забывайте кликать по кнопочкам и делится ссылками на наш сайт со своими друзьями. А для того, чтобы не пропустить выход очередной статьи, рекомендую вам подписаться на рассылку новостей от нашего сайта. Одна из них находится в самом верху справа, другая - в футере сайта.

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

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

В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.

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

В этой же статье тема рассмотрена более детально. Как вы понимаете, для превращения исходного кода в команды процессора нужно специальное программное обеспечение. Мы будем использовать компилятор GCC. Для установки его и всех необходимых инструментов в Ubuntu выполните:

sudo apt install build-essential manpages-dev git automake autoconf

Затем вы можете проверить правильность установки и версию компилятора:

Но перед тем как переходить к самой компиляции программ рассмотрим более подробно составляющие этого процесса.

Как выполняется компиляция?

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

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

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

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

Компиляция программ Linux

Первое что нам понадобиться - это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.

Получение исходников

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

Давайте загрузим сами исходники нашей программы с помощью утилиты git:

git clone https://github.com/vim/vim

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

Настройка configure

Дальше нам нужно запустить скрипт, который проверит нашу программу на совместимость с системой и настроит параметры компиляции. Он называется configure и поставляется разработчиками программы вместе с исходниками. Весь процесс компиляции описан в файле Makefile, его будет создавать эта утилита.

Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:

./bootstrap
$ ./autogen.sh

Также для создания этого скрипта можно воспользоваться утилитой automake:

aclocal
$ autoheader
$ automake --gnu --add-missing --copy --foreign
$ autoconf -f -Wall

Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.

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

./configure --help

Рассмотрим наиболее часто используемые, стандартные для всех программ опции:

  • --prefix=PREFIX - папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
  • --bindir=DIR - папка для размещения исполняемых файлов, должна находится в PREFIX;
  • --libdir=DIR - папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
  • --includedir=DIR - папка для размещения man страниц;
  • --disable-возможность - отключить указанную возможность;
  • --enable-возможность - включить возможность;
  • --with-библиотека - подобно enable активирует указанную библиотеку или заголовочный файл;
  • --without-библиотека - подобное disable отключает использование библиотеки.

Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае./configure есть, и мы можем его использовать:

Во время настройки утилита будет проверять, есть ли все необходимые библиотеки в системе, и если нет, вам придется их установить или отключить эту функцию, если это возможно. Например, может возникнуть такая ошибка: no terminal library found checking for tgetent()... configure: error: NOT FOUND!

В таком случае нам необходимо установить требуемую библиотеку. Например, программа предлагает ncurses, поэтому ставим:

sudo apt install libncurces-dev

Приставка lib всегда добавляется перед библиотеками, а -dev - означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.

Сборка программы

Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:

После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь - создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:

Затем просто установите получившийся пакет с помощью dpkg:

sudo dpkg install vim.deb

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

Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:

sudo make uninstall

Команда удалит все файлы, которые были скопированы в файловую систему.

Выводы

В этой статье мы рассмотрели, как выполняется компиляция программы Linux. Этот процесс может быть сложным для новичков, но в целом, все возможно, если потратить на решение задачи несколько часов. Если у вас остались вопросы, спрашивайте в комментариях!

На завершение видео о том, что такое компилятор и интерпретатор: