В чем назначение компоновщика и отладчика программ

Компоновщики, как и загрузчики, не являются самыми интересными для изучения, с точки зрения очень многих. Часто их воспринимают как просто еще один лишний шаг, который отделяет только что откомпилированную программу от запуска. Но это мнение ошибочно. Компоновщик это очень интересно! Не верите?

Тогда давайте начнем разбираться.

Зачем вообще нужен компоновщик? Почему недостаточно просто компилятора?

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

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

Вот это и есть семантический разрыв. Понятийный. Смысловой. В конечном итоге человек переводит нужные прикладные сущности в сущности языка программирования. И картинка становится файлом на диске.

011. C++: препроцессор, компилятор, компоновщик — Александр Сомов

Массивом в памяти. А действие «добавим красок» становится функцией, которая изменяет характеристические кривые цветопередачи. И кривые здесь это еще одна сущность. Которая лежит между мыслью и программой. Заполняя собой еще один семантический разрыв.

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

Но не только объекты, но и правила работы с этими объектами. К таким правилам относится машинный код и правила размещения этих объектов. И правила манипулирования ими.

Зачем так много всего, помимо кода и объектов? Дело в том, что компилятор, обрабатывая очередной исходный файл, имеет далеко не всю информацию об объектах расположенных в других исходных файлах и библиотеках.

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

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

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

Этапы компиляции на Си: предобработка, трансляция, компоновка

И сколько их всего будет.

Да и реальная машина (ЭВМ) может очень сильно отличаться от абстрактной, для которой и сформировал код компилятор. И это еще один семантический разрыв. Этот разрыв заполняет среда времени выполнения (run-time), которая обычно является набором библиотек. Причем не редко разделяемых. И сервисы ОС часто бывают обернуты в разделяемые библиотеки.

Читайте также:
Программа как проходит мой день

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

Суть от этого не меняется.

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

Хотя многое зависит от того, выполняется ли программа интерпретатором, или непосредственно машиной. Интерпретаторы я не буду рассматривать.

Компоновщик и его основная функция

Путь от исходных файлов до выполнения на ЭВМ. Место компоновщика на этом пути. Иллюстрация моя

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

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

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

  • LINK, сокращение LNK — это весьма распространенные названия. Отсюда и термин линкер.
  • LNKEDT — связывающий редактор. Сегодня это название редкость. Оно использовалось в ДОС ЕС и ОС ЕС для машин серии ЕС, копиях машин IBM 360/370
  • TKB — построитель задач. Это тоже старое название. Оно использовалось в ОС-РВ для машин серии СМ, копиях машин DEC PDP-11.

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

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

Отсюда и расширение имени .tsk. Это термины, которые использовались давно, задолго до появления ПК. И используются по сию пору. Просто вспомните термин «переключение задач», который можно встретить во многих книгах и статьях про операционные системы.

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

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

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

Читайте также:
Dropbox нужна ли эта программа

Но при всех своих возможностях даже компоновщик не в состоянии создать файл задачи, который можно просто переместить в память и исполнить.

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

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

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

Скрытые от посторонних глаз тонкости и сложности

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

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

Давайте взглянем на небольшой пример

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

В чем назначение компоновщика и отладчика программ

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

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

Компоновщик (также реда́ктор свя́зей, англ. linker, link editor) — программа, которая производит компоновку — принимает на вход один или несколько объектных модулей и собирает по ним исполняемый модуль.

Для связывания модулей, компоновщик использует таблицы имён, созданные компилятором в каждом из объектных модулей. Такие имена могут быть двух типов:

* Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям
* Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя

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

Источник: www.programmersforum.ru

Трансляция, компоновка и отладка программ

Turbo Assembler (TASM) — программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. Кроме того, TASM может работать совместно с трансляторами с языков высокого уровня фирмы Borland, такими как Turbo C и Turbo Pascal. Как и прочие программные пакеты серии Turbo, Турбо Ассемблер больше не поддерживается.

Работа содержит 1 файл

Министерство образования и науки ГОУ ВПО

Альметьевский Государственный Институт Муниципальной Службы

Кафедра информатики и математики

Читайте также:
Какое оборудование проверяет система при входе в программу

Практическая работа №4

по дисциплине: Архитектура компьютера

на тему: Трансляция, компоновка и отладка программ

Выполнила: студент 4 курса

группы 2718 а Зиганшина Г.Р.

Проверила: Маслахова Р.Н.

Turbo Assembler (TASM) — программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. Кроме того, TASM может работать совместно с трансляторами с языков высокого уровня фирмы Borland, такими как Turbo C и Turbo Pascal. Как и прочие программные пакеты серии Turbo, Турбо Ассемблер больше не поддерживается.

TASM до сих пор используется для обучения программированию на ассемблере под архитектуру x86. Многие находят его очень удобным и продолжают его использовать, расширяя набором дополнительных макросов.

Пакет TASM поставляется вместе с компоновщиком Turbo Linker и порождает код, который можно отлаживать с помощью Turbo Debugger.

По умолчанию TASM работает в режиме совместимости с другим распространённым ассемблером — Microsoft Macro Assembler, то есть TASM умеет транслировать исходники, разработанные под MASM. Кроме того, TASM имеет режим IDEAL, улучшающий синтаксис языка и расширяющий его функциональные возможности.

Компоновка

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

  • если в программе используются функции, например, sin, exp и т.д., соответствующие им программные модули выбираются из библиотеки подпрограмм соответствующей системы программирования и вставляются в объектный модуль;
  • объектный модуль преобразуется в соответствии с реальными адресами основной памяти, куда будет размещаться программа для выполнения.

Трансляция

Процесс преобразования программы, написанной на одном языке программирования, в программу на другом языке.

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

Различают два вида трансляции:

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

Отладка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится :

  • узнавать текущие значения переменных;
  • и выяснять, по какому пути выполнялась программа.

Существуют две взаимодополняющие технологии отладки.

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

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

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

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

Источник: www.stud24.ru

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