Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
avmis.docx
Скачиваний:
22
Добавлен:
01.04.2025
Размер:
428 Кб
Скачать
☆

76. Загрузка программ на выполнение.

Загру́зчик (англ. loader) — в информатике, программа, отвечающая за загрузку исполнимых файлов и запуск соответствующих новых процессов. Обычно является частью операционной системы, но может быть и самостоятельной программой — к примеру, позволяющей операционной системе запускать программы, скомпилированные для других операционных систем (см. также: эмуляторы, WINE).

При запуске новой программы загрузчик должен:

Считать данные из запускаемого файла.

Если необходимо — загрузить в память недостающие динамические библиотеки.

Заменить в коде новой программы относительные адреса и символические ссылки на точные, с учётом текущего размещения памяти, то есть выполнить связывание адресов (англ. Relocation).

Создать в памяти образ нового процесса и запланировать его к исполнению.

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

77. Компиляоры. Принципы работы.

Компиля́тор — программа или техническое средство, выполняющее компиляцию.

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

Виды компиляторов

  • Векторизующий. Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором.

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

  • Диалоговый. См.: диалоговый транслятор.

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

  • Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.

  • Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.

  • Отладочный. Устраняет отдельные виды синтаксических ошибок.

  • Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.

  • Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.

  • Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Процесс компиляции состоит из следующих этапов:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.

  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.

  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.

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

  5. Генерация кода. Из промежуточного представления порождается код на целевом языке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]