Компоновка и загрузка

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

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

Наконец, для выполнения оттранслированной программы загрузочный модуль помещается в память программой, которая называется загрузчиком (loader) и часто является частью планировщика операционной системы (раздел 3.3). Этот этап очень важен в многозадачных системах. Программа использует память совместно с другими выполняемыми процессами, и количество этих процессов постоянно меняется, поэтому до момента выполнения программы неизвестно, какая область памяти ей доступна. Задача загрузчика состоит в том, чтобы поместить программу в область памяти, отведенную операционной системой, и в последний момент (в последнюю микросекунду) внести изменения, которые могут понадобиться, когда становятся известны адреса конкретных ячеек памяти. (Команда перехода должна переходить к необходимому оператору программы.) Желание свести эти последние изменения к минимуму привело к созданию методов, с помощью которых можно избежать явного обращения к ячейкам памяти в программе. В результате появились перемещаемые модули (relocatable module), которые выполняются правильно независимо от их размещения в памяти.

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


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



double arrow
Сейчас читают про: