SPO

Системное программное обеспечение

1. Трансляторы, компиляторы, интерпретаторы.
Трансляторы, компиляторы, интерпретаторы. Этапы и фазы трансляции. Схема работы транслятора.

Трансляторы - программа или устройство, переводящее входную строку из одного языка в другой без потери списка.
a
·A b
·B
Интерпретаторы – перевод из одного языка в другой по шагам( это транслятор, который обычно совмещает процесс перевода и выполнения программы компилятор сначала переводит программу, а только затем ее можно выполнить).
Компиляторы - переводит целиком( это транслятор, переводящий текст программы в машинный код).

Этапы трансляции. Общая схема работы транслятора
На рисунке ниже представлена общая схема работы компилятора. Из нее видно, что в целом процесс компиляции состоит из двух основных этапов синтеза и анализа.


























На этапе анализа выполняется распознавание текста исходной программы, создание и заполнение таблиц идентификаторов. Результатом его работы служит некое внутреннее представление программы, понятное компилятору. На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице (таблицах) идентификаторов, порождается текст результирующей программы. Результат этого этапа – объектный код.
Кроме того, в составе компилятора присутствует часть, ответственная за анализ и исправление ошибок, которая при наличии ошибки в тексте исходной
программы должна максимально полно информировать пользователя о типе
ошибки и месте ее возникновения. В лучшем случае компилятор может предложить пользователю вариант исправления ошибки. Эти этапы, в свою очередь, состоят из более мелких этапов, называемых фазами компиляции. Состав фаз компиляции приведен в самом общем виде, их конкретная реализация и процесс взаимодействия могут различаться в зависимости от версии компилятора. Однако в том или ином виде все представленные фазы практически всегда присутствуют в компиляторах.
Рассмотрим основные фазы (части) компиляции:
Лексический анализ (сканер) – это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного
языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического разбора. С теоретической точки зрения лексический анализатор не является обязательной, необходимой частью компилятора. Однако существует причины, которые определяют его присутствие практически во всех компиляторах.
Синтаксический разбор – это основная часть компилятора на этапе
анализа. Она выполняет выделение синтаксических конструкций в тексте исходной программы, обработанном лексическим анализатором. На этой же фазе
компиляции проверяется синтаксическая правильность программы. Синтаксический разбор играет главную роль – роль распознавателя текста входного языка программирования.
Семантический анализ – это часть компилятора, проверяющая правильность текста исходной программы с точки зрения семантики входного языка.
Кроме непосредственно проверки, семантический анализ должен выполнять
преобразования текста, требуемые семантикой входного языка (такие, как добавление функций неявного преобразования типов). В различных реализациях
компиляторов семантический анализ может частично входить в фазу синтаксического разбора, частично – в фазу подготовки к генерации кода.
Подготовка к генерации кода – это фаза, на которой компилятором выполняются предварительные действия, непосредственно связанные с синтезом тек-
ста результирующей программы, но еще не ведущие к порождению текста на
выходном языке. Обычно сюда входят действия, связанные с идентификацией
элементов языка, распределением памяти и т. п.
Генерация кода – это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Кроме непосредственного порождения текста результирующей программы, генерация обычно включает в себя также оптимизацию – процесс, связанный с обработкой уже порожденного текста. Иногда оптимизацию выделяют
в отдельную фазу компиляции, так как она оказывает существенное влияние на
качество и эффективность результирующей программы.
Таблицы идентификаторов (иногда «таблицы символов») – это специальным образом организованные наборы данных, служащие для хранения информации об элементах исходной программы, которые затем используются для по рождения текста результирующей программы. Элементами исходной программы, информацию о которых нужно хранить в процессе компиляции, являются переменные, константы, функции и т. п. – конкретный состав набора элементов зависит от используемого входного языка программирования. Понятие «таблицы» вовсе не предполагает, что это хранилище данных должно быть организовано именно в виде таблиц или других массивов информации.

2 . Ассемблер
Однопроходные и многопроходные трансляторы. Ассемблеры. Макроязыки, препроцессоры.
Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.
Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.

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

Макроязык набор правил для объявления и использования макросов. Макросы используются в языках программирования, например, в ассемблере и в прикладных программах, например, в Microsoft Office.
(Макрос символьное имя, заменяющее несколько команд языка ассемблера.)

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

3. Лексический анализ.

Лексема (лексическая единица языка) – это структурная единица языка,
которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка.
Лексемами языков естественного общения являются слова. Лексемами
языков программирования являются идентификаторы, константы, ключевые
слова языка, знаки операций и т. п. Состав возможных лексем каждого конкретного языка программирования определяется синтаксисом этого языка.
Лексический анализ (ЛА) – это первый этап процесса компиляции. На этом
этапе символы, составляющие исходную программу, группируются в отдельные лексические элементы, называемые лексемами. Выбор конструкций, которые будут выделяться как отдельные лексемы, зависит от языка и от точки зрения разработчиков компилятора.
Назначение и особенности построения таблиц идентификаторов
Проверка правильности семантики и генерация кода требуют знания характеристик переменных, констант, функций и других элементов, встречающихся в программе на исходном языке. Все эти элементы в исходной программе, как правило, обозначаются идентификаторами. Выделение идентификаторов и других элементов исходной программы происходит на фазе лексического анализа. Их характеристики определяются на фазах синтаксического разбора,
семантического анализа и подготовки к генерации кода. Состав возможных характеристик и методы их определения зависят от семантики входного языка. В любом случае компилятор должен иметь возможность хранить все найденные идентификаторы и связанные с ними характеристики в течение всего процесса компиляции, чтобы иметь возможность использовать их на различных фазах компиляции. Для этой цели, как было сказано выше, в компиляторах используются специальные хранилища данных, называемые таблицами символов или таблицами идентификаторов. Любая таблица идентификаторов состоит из набора полей, количество которых равно числу различных идентификаторов, найденных в исходной программе. Каждое поле содержит в себе полную информацию о данном элементе
таблицы. Компилятор может работать с одной или несколькими таблицам идентификаторов, в зависимости от реализации компилятора. Напримерf _8NX_X8_, можно организовывать различные таблицы идентификаторов для различных модулей исходной программы или для различных типов элементов входного языка. Состав информации, хранимой в таблице идентификаторов для каждого элемента исходной программы, зависит от семантики входного языка и типа элемента. Например, в таблицах идентификаторов может храниться следующая
информация:
1. Для переменных: имя, тип данных, область памяти;
2. Для констант: название (если имеется), значение, тип данных;
3. Для функций: имя, количество и типы формальных аргументов, тип возвращаемого результата, адрес кода функции.

4. Синтаксический анализ.

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

Рекурсивный спуск это эффективный и простой нисходящий алгоритм распознавания. Он состоит в следующем. Для каждого нетерминала грамматики (понятия, конструкции языка), то есть для каждой синтаксической диаграммы, записывается отдельная распознающая процедура. При этом соблюдаются следующие соглашения: 1. Перед началом работы процедуры текущим является первый символ анализируемого понятия. 2. В процессе работы процедура считывает все символы входной цепочки, относящиеся к данному нетерминалу (выводимые из данного нетерминала) или сообщает об ошибке. Если правила для данного нетерминала содержат в правых частях другие нетерминалы (синтаксическая диаграмма данного нетерминала содержит другие нетерминалы), то процедура обращается к распознающим процедурам этих нетерминалов для анализа соответствующих частей входной цепочки. 3. По окончании работы процедуры текущим становится первый символ, следующий во входной цепочке за данной конструкцией языка (символами, выводимыми из данного нетерминала). Распознавание начинается вызовом распознающей процедуры начального нетерминала. При этом текущим символом, как это следует из п. 1, должен быть первый символ входной цепочки. По завершении работы начальной процедуры текущим должен быть символ «конец текста». Таким образом, анализ методом рекурсивного спуска всегда строится по следующей схеме: Название «рекурсивный спуск» обусловлено тем, что при наличии в грамматике самовложения вызовы распознающих процедур будут рекурсивными. Процесс распознавания развивается от начального нетерминала (корень дерева разбора) через вызов процедур для промежуточных нетерминалов (внутренние вершины дерева) к анализу отдельных терминальных символов (листья дерева). Это нисходящий разбор. Каждая распознающая процедура строится по соответствующей синтаксической диаграмме, которая играет роль схемы алгоритма. Соответствие участков Принцип работы анализатора, который строится по предлагаемым схемам, состоит в том, что, анализируя очередной символ входной цепочки, распознаватель выбирает путь движения по синтаксической диаграмме, соответствующий этой цепочке.

5. Латентно-семантический анализ (ЛСА) это метод обработки информации на естественном языке, анализирующий взаимосвязь между коллекцией документов и терминами в них встречающимися, сопоставляющий некоторые факторы (тематики) всем документам и терминам.

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

6. Подготовка к генерации кода. Распределение памяти. Виды переменных и областей памяти. Выравнивание границ. Менеджеры памяти. Статическое и динамическое связывание.

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

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

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

Динамическое связывание (позднее связывание) способ соединения библиотек в программировании.
Статическое связывание (раннее связывание)
Динамические библиотеки - Часть основной программы, которая загружается в ОС по запросу работающей программы в ходе её выполнения (Run-time), то есть динамически (Dynamic Link Library, DLL в Windows, SO в Linux). Один и тот же набор функций (подпрограмм) может быть использован сразу в нескольких работающих программах, из-за чего они имеют ещё одно название библиотеки общего пользования (Shared Library). Если динамическая библиотека загружена в адресное пространство самой ОС (System Library), то единственная копия может быть использована множеством работающих с нею программ, что положительно сказывается на степени использовании ресурса ОЗУ. Динамические библиотеки могут содержать в себе как критические для работы программы части, так и дополнительные функции. Дополнительным плюсом такого подхода является то, что динамическая библиотека может быть использована в качестве плагина (Plug-ins), расширяющего функциональность программы. Минусом является то, что в случае, если модуль, который содержит в себе критическую часть, отсутствует, программа не сможет продолжить работу.

Динамические библиотеки хранятся обычно в определенном месте и имеют стандартное расширение. Например, файлы .library в логическом томе Libs: в AmigaOS; в Microsoft Windows и OS/2 файлы библиотек общего пользования имеют расширение .dll; в UNIXподобных ОС обычно .so; в Mac OS .dylib.

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

Статические библиотеки
Могут быть в виде исходного текста, подключаемого программистом к своей программе на этапе написания (например, для языка Fortran существует огромное количество библиотек для решения разных задач именно в исходных текстах), либо в виде объектных файлов, присоединяемых (линкуемых) к исполняемой программе на этапе компиляции (в Microsoft Windows такие файлы имеют расширение .lib, в UNIXподобных ОС обычно .a). В результате программа включает в себя все необходимые функции, что делает её автономной, но увеличивает размер. Без статических библиотек объектных модулей (файлов) невозможно использование большинства современных компилирующих языков и систем программирования: Fortran, Pascal, C, C++ и других.
Основное назначение менеджера памяти в первом смысле реализация динамической памяти. Например, в языке C динамическое выделение памяти производится через функцию malloc.

7. Системы программирования. Интегрированные среды разработки. Структура современной системы программирования. Текстовые редакторы Лексический анализ «на лету».

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

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

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

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

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


8. Система подсказок и справок. Компоновщики. Загрузчики. Трансляция адресов. Настраивающий загрузчик. Динамические загрузчики.

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

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

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

Трансляция адресов
Модуль, который выполняет преобразование относительных адресов в реальные (абсолютные), то есть осуществляет трансляцию.

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

Динамические загрузчики
Если общее количество памяти, требуемое для подпрограмм меньше доступной памяти машины, возникают затруднения. Эти трудности преодолеваются применением схемы динамической загрузки с последовательным использованием объединителя и загрузчика. Эта схема основывается на том, что обычно разные подпрограммы требуются в разное время и могут взаимно исключать себя. Используя явное определение того, какая подпрограмма содержит обращения к другим подпрограммам, можно задать, так называемую, структуру с перекрытием (оверлейную структуру), которая указывает взаимоисключающие подпрограммы.
Формируется загрузочный модуль. Он является перемещаемым, в нем должна быть таблица перемещений. Также в структуре загрузочного модуля должна быть информация о связях. Загрузчик должен содержать такую часть, как диспетчер оверлеев, он отбирает из загрузочных модулей именно те, которые являются стартовыми, в процессе работы организует загрузку в ОП необходимых модулей.

9. Отладчики. Функции отладчиков. Библиотеки подпрограмм. Статические и динамические библиотеки подпрограмм. Ресурсы пользовательского интерфейса.

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

отла
·дчики (англ. debugger) модули среды разработки или отдельные программы, предназначенные для поиска ошибок в программах;

Библиотека (от англ. library) в программировании сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).

Динамические библиотеки
Часть основной программы, которая загружается в ОС по запросу работающей программы в ходе её выполнения (Run-time), то есть динамически (Dynamic Link Library, DLL в Windows, SO в Linux). Один и тот же набор функций (подпрограмм) может быть использован сразу в нескольких работающих программах, из-за чего они имеют ещё одно название библиотеки общего пользования (Shared Library). Если динамическая библиотека загружена в адресное пространство самой ОС (System Library), то единственная копия может быть использована множеством работающих с нею программ, что положительно сказывается на степени использовании ресурса ОЗУ. Динамические библиотеки могут содержать в себе как критические для работы программы части, так и дополнительные функции. Дополнительным плюсом такого подхода является то, что динамическая библиотека может быть использована в качестве плагина (Plug-ins), расширяющего функциональность программы. Минусом является то, что в случае, если модуль, который содержит в себе критическую часть, отсутствует, программа не сможет продолжить работу.

Статические библиотеки
Могут быть в виде исходного текста, подключаемого программистом к своей программе на этапе написания (например, для языка Fortran существует огромное количество библиотек для решения разных задач именно в исходных текстах), либо в виде объектных файлов, присоединяемых (линкуемых) к исполняемой программе на этапе компиляции (в Microsoft Windows такие файлы имеют расширение .lib, в UNIXподобных ОС обычно .a). В результате программа включает в себя все необходимые функции, что делает её автономной, но увеличивает размер. Без статических библиотек объектных модулей (файлов) невозможно использование большинства современных компилирующих языков и систем программирования: Fortran, Pascal, C, C++ и других.











15

Приложенные файлы

  • doc 17434146
    Размер файла: 126 kB Загрузок: 0

Добавить комментарий