ВУЗ:
Рис. 5.17. Объектно-ориентированный подход к процессу
трансляции программы
Каждый раз, когда синтаксический анализатор получает очередную лексему, он анализирует считываемую в данный момент
грамматическую структуру. В результате он может запросить у лексического анализатора следующую лексему либо, если он
распознал законченную фразу или оператор, обратиться к генератору кода для порождения соответствующих машинных
инструкций. Каждый поступивший запрос вынуждает генератор кода строить соответствующие машинные команды и до-
бавлять их к объектному коду программы. Как можно заметить, задача перевода программы с одного языка на другой есте-
ственно согласуется с объектно-ориентированной парадигмой. Поэтому исходный текст программы, лексический анализа-
тор, синтаксический анализатор, генератор кода и объектный код могут рассматриваться как объекты, которые взаимодействуют,
посылая друг другу сообщения по мере выполнения своих функций (рис. 5.17).
Связывание и загрузка. Объектный код программы, полученный в результате ее трансляции, хотя и записан на ма-
шинном языке, но чаще всего еще не имеет той формы, которая необходима для выполнения машиной. Одной из причин
этого является то, что многие средства программирования позволяют разрабатывать программы в виде отдельных модулей,
транслируемых в разное время (это способствует приданию программному обеспечению модульной структуры). Поэтому
объектный код, полученный в результате отдельного процесса трансляции, чаще всего представляет собой всего лишь неко-
торую составную часть программы, которая должна быть связана с другими ее частями для решения задач, стоящих перед
всей системой в целом. Даже если вся программа разработана и оттранслирована в виде единственного модуля, ее объект-
ный код все же не готов для выполнения машиной, поскольку любой программе, как правило, требуются функции, выпол-
няемые другими программами или же операционной системой. Поэтому объектный код программы в действительности
представляет собой программу на машинном языке, обычно содержащую несколько неразрешенных ссылок; эту программу
необходимо связать с другими программами, прежде чем можно будет получить полноценный выполняемый модуль.
Связывание объектного кода программы с другими модулями выполняет программа, называемая редактором связей
(linker). Ее задача – связать между собой несколько объектных модулей (полученных в результате предшествующих незави-
симо выполненных процедур трансляций), программ операционной системы и другое программное обеспечение в целях по-
лучения завершенного выполняемого модуля (иногда называемого загрузочным модулем), который представляет собой файл,
размещаемый во внешней памяти машины.
Наконец, чтобы выполнить оттранслированную программу, ее загрузочный модуль должен быть размещен в основной
памяти машины с помощью специальной программы, называемой загрузчиком (loader). Загрузчик обычно является частью
программы-планировщика операционной системы (см. раздел 3.3). Важность этого этапа особенно велика в многозадачных
системах. В подобных системах любая программа вынуждена использовать память совместно с другими параллельно вы-
полняемыми процессами, причем набор параллельно выполняемых процессов изменяется при каждом выполнении програм-
мы. Поэтому точное расположение выделяемого для некоторой программы участка памяти остается неизвестным, вплоть до
ее вызова на выполнение. Таким образом, задачей загрузчика является считывание программы в указанную операционной
системой область памяти и выполнение в ней всех необходимых настроек, которые невозможно осуществить, пока не будет
известно точное расположение данной программы в памяти. (Команды перехода в программе должны выполнять переход на
правильные адреса внутри программы.) Желание минимизировать объем выполняемой загрузчиком окончательной настрой-
ки привело к разработке таких способов программирования, в которых запрещается использовать явные ссылки на адреса
памяти в программе. В результате появились перемещаемые модули (relocatable module), которые выполняются правильно
независимо от их размещения в памяти.
Итак, подготовка программы на языке программирования высокого уровня состоит из трех последовательных этапов:
трансляции, связывания и загрузки, как показано на рис. 5.18. После выполнения трансляции и связывания программу мож-
но повторно загружать и выполнять без обращения к ее исходному тексту. Однако если в программу потребуется внести из-
менения, то их придется ввести в исходный текст, а затем вновь оттранслировать и заново связать модифицированную вер-
сию исходного текста программы, чтобы создать новый вариант ее загрузочного модуля.
Рис. 5.18. Полный цикл подготовки программы к выполнению
Пакеты разработки программного обеспечения. В настоящее время прочно укрепилась тенденция объединять транс-
лятор с другими элементами программного обеспечения в общий пакет, функционирующий как единая интегрированная
программная система. В соответствии со схемой классификации, предложенной в разделе 3.2, такую систему следует отне-
сти к прикладному программному обеспечению. Используя такой программный пакет, программист получает удобный дос-
туп к текстовому редактору, предназначенному для написания программ, транслятору, необходимому для перевода про-
Страницы
- « первая
- ‹ предыдущая
- …
- 128
- 129
- 130
- 131
- 132
- …
- следующая ›
- последняя »