Опишите этапы трансляции. Приведите общую схему транслятора. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Опишите этапы трансляции. Приведите общую схему транслятора.



Опишите этапы трансляции. Приведите общую схему транслятора.

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

Генерация кода — это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Таблицы идентификаторов (иногда - «таблицы символов») — это специальным образом организованные наборы данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порожде­ния текста результирующей программы.

 

Дайте определение транслятора. Приведите характеристики однопроходных и много проходных трансляторов.

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

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

 

Опишите принцип работы интерпретатора. Перечислите особенности постороения интерпретаторов.

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

 

Дайте определение таблиц идентификаторов. Опишите простейшие способы организации таблиц идентификаторов.

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

 

7) Опишите организацию таблиц идентификаторов методом бинарного дерева.

Построение таблиц идентификаторов по методу бинарного дерева:

Можно сократить время поиска искомого элемента в таблице идентификаторов, не увеличивая значительно время, необходимое на ее заполнение. Для этого надо отказаться от организации таблицы в виде непрерывного массива данных.Существует метод построения таблиц, при котором таблица имеет форму бинарного дерева. Каждый узел дерева представляет собой элемент таблицы, причем корневым узлом становится первый элемент, встреченный компилятором при заполнении таблицы. Дерево называется бинарным, так как каждая вершина в нем может иметь не более двух ветвей. Для определенности будем называть две ветви «правая» и «левая».Алгоритм заполнения бинарного дерева: 1) Выбрать очередной идентификатор из входного потока данных. Если очередного идентификатора нет, то построение дерева закончено.2) Сделать текущим узлом дерева корневую вершину.3) Сравнить имя очередного идентификатора с именем идентификатора, содержащегося в текущем узле дерева.4) Если имя очередного идентификатора меньше, то перейти к шагу 5, если равно – прекратить выполнение алгоритма (двух одинаковых идентификаторов быть не должно!), иначе – перейти к шагу 7.5) Если у текущего узла существует левая вершина, то сделать ее текущим узлом и вернуться к шагу 3, иначе – перейти к шагу 6.6) Создать новую вершину, поместить в нее информацию об очередном идентификаторе, сделать эту новую вершину левой вершиной текущего узла и вернуться к шагу 1.

7) Если у текущего узла существует правая вершина, то сделать ее текущим узлом и вернуться к шагу 3, иначе – перейти к шагу 8.8) Создать новую вершину, поместить в нее информацию об очередном идентификаторе, сделать эту новую вершину правой вершиной текущего узла и вернуться к шагу 1.

 

Назначение и функции компоновщика?

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

 

Опишите формат представления данных в IBM PC.

Слово оперативной памяти размещается в перевернутом виде.В двойном слове на ряду с перевертованием байта происходит перевертывание слов.Предостовление символьных данных:1)Каждому символу в памяти ЭВМ ставится в соответствии не отрицательное число размером 3 байта.для каждой строки отводится нужное кол-во соседних байт памяти адресом строки считается адрес первого символа.Символы хранятся в памяти в двоичном виде.

 

Организация циклов

Цикл, как известно, представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются “вручную”. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр ecx/cx как счетчик цикла.

Дадим краткую характеристику этим командам: loop метка_перехода (Loop) — повторить цикл. Работа команды заключается в выполнении следующих действий:

-декремента регистра ecx/cx;

- сравнения регистра ecx/cx с нулем:

-если (ecx/cx) > 0, то управление передается на метку перехода;

-если (ecx/cx) = 0, то управление передается на следующую после loop команду.

loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.

Команды loope и loopz — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравиться. Работа команд заключается в выполнении следующих действий:

-декремента регистра ecx/cx;

-сравнения регистра ecx/cx с нулем;

-анализа состояния флага нуля zf:

-если (ecx/cx) > 0 и zf = 1, управление передается на метку перехода;

-если (ecx/cx) = 0 или zf = 0, управление передается на следующую после loop команду.

loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1.

Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

-декремента регистра ecx/cx;

-сравнения регистра ecx/cx с нулем;

-анализа состояния флага нуля zf:

-если (ecx/cx) > 0 и zf = 0, управление передается на метку перехода;

-если (ecx/cx)=0 или zf=1, управление передается на следующую после loop команду.

 

 

22) Приведите основные принципы организации и обработки массивов в языке Ассемблер. Приведите примеры?

массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа. Используя директивы label и rept. Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. К примеру, определим массив байт в области памяти, обозначенной идентификатором mas_b. В данном случае директива label определяет символическое имя mas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директив label.

Передача параметров

Язык высокого уровня – передают параметры вызываемое процедуры в стеке и ожидают возврощение параметров в регистре АХ, ЕАХ, если результат не уменшается в ЕАХ то используется пара ДХ: АА. Ассемблер на языках высокого уровня используются для организации прерываний, приоброзований сложных бытовых структур.

 

Классификация прерываний

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

· внешние - вызываются внешними по отношению к микропроцессору событиями (по существу - это группа аппаратных прерываний) Вложенных прерываний нет!

· внутренние - возникают внутри микропроцессора во время вычислительного процесса (по существу - это исключительные ситуации и программные прерывания).

! В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами.

 

 

39. Опишите организацию аппаратных прерываний

К аппаратным средствам системы прерываний относятся:

· выводы микропроцессора - на них формируются сигналы, извещающие микропроцессор либо о том, что некоторое внешнее устройство «просит уделить ему внимание» (INTR), либо о том, что требуется безотлагательная обработка некоторого события или катастрофическая ошибка (NMI)

· INTR - вывод для входного сигнала запроса на прерывание,

· NMI - вывод для входного сигнала немаскируемого прерывания

· INTA - вывод для выходного сигнала подтверждения получения сигнала прерывания микропроцессором (этот сигнал поступает на одноименный вход микросхемы конроллера 8259А;

· программируемый контроллер прерываний 8259А · внешние устройства (таймер, клавиатура, магнитные диски и т.п.)Процессор получив сигнал по линии INT на выполнение прерывания сохраняет в стеке выполняемой программы содержимое регистров FLAGS, CS:IP.Загружает CS и IP из соответствующего вектора прерываний, и тем самым на обработчик прерываний, связанный с этим вектором и передает ей управление. Обработчик прерываний всегда завершается командой iret (interruptreturn, возврат из прерывания), которая возвращает старые значения CS, IP и регистра флагов, тем самым приводя к возврату в точку программы, где она была прервана.

40) Опишите структуру контроллера прерываний, назначение его основных узлов.

Для того, чтобы написать программу обработки прерываний от какого-либо устройства. необходимо быть знакомым с особенностями функционирования и программирования контроллера. Логически в контроллере можно выделить 4 основных узла:

· Регистр входных запросов

· Регистр маски

· Схема приоритетов

· Регистр обслуживаемых запросов

Последовательность обработки внешнего аппаратного прерывания имеет следующий вид:

1. Сигнал запроса прерывания поступает на вход регистра запросов и устанавливает в 1 соответствующий бит. значение регистра маски (программируемый через порт 21h) равное 0 разрешает прохождение сигнала на схему анализатора приоритетов., значение равное 1 запрещает.

2. Сигнал запроса прерывания поступает на вход регистра обслуживаемых запросов и дает разрешение на установку в 1 его бита

3. Микропроцессор, получив сигнал INT формирует выходной сигнал INTA, который устанавливает бит регистра обслуживаемых запросов, разрешенный сигналом запроса прерывания и сбрасывает аналогичный бит регистра запросов.

 

Программы типа.EXE

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

В то время как программы типа.СОМ имеют существенное ограничение на общий размер (не более 64 Кбайт в сумме на собственно программу, данные и стек), программы типа.ЕХЕ могут быть практически неограниченного размера. Хотя обычный программный загрузчик в системе DOS не использует этого достоинства файлов типа.ЕХЕ, но способность загружать отдельные части больших программ в разные участки памяти, а также благоприятная возможность выделить "чистый код" программы, который может разделяться несколькими задачами, - все это существенно в многозадачных средах типа Мicrosoft Windows.

В операционной системе DOS загрузчик всегда вводит программу типа.ЕХЕ в память непосредственно над префиксом сегмента программы, хотя порядок сегментов программы, данных и стека может меняться. Файл типа.ЕХЕ содержит заголовок, или блок управляющей информации характерного формата. Размер заголовка определяется числом команд программы, настраиваемых во время загрузки, но всегда кратен 512 байт. До того как DOS передает управление программе, вычисляются начальные значения регистра сегмента программы CS и указателя команд IP, при этом используются информация о точке входа из заголовка файла типа.ЕХЕ, а также адрес загрузки программы. Эта информация извлекается из оператора ЕND исходного текста одного из модулей программы. Регистры сегмента данных DS и дополнительного сегмента ES указывают на префикс, таким образом, программа может обращаться к указателю блока окружения, хвосту команды и другой полезной информации, находящейся в РSР [5, c. 65].

Начальное содержимое регистра сегмента стека SS и указателя стека SP устанавливается из заголовка. Эта информация берется из объявления сегмента с атрибутом SТАСК в исходном тексте программы. Пространство памяти, выделяемое под стек, может инициализироваться тем или иным значением в зависимости от определения сегмента стека.Программа типа.ЕХЕ, поступающая на вход компоновщика, может состоять из большого числа отдельных объектных модулей. Допускается, чтобы каждый модуль использовал уникальное имя сегмента программы, а процедуры имени атрибут либо NEAR, либо FAR в зависимости от условий определения имени и размеров выполнимой программы. Программист должен заботиться о том, чтобы компонуемые вместе модули содержали только один сегмент с атрибутом SТАСК и только одну точку входа, определяемую директивой ассемблера ЕND. Результатом работы компоновщика является файл с расширением.ЕХЕ, который можно немедленно запустить на выполнение.

 

Окружение

Представляет собой область памяти, в котором виде символьных строк записаны значения переменных, которые имеют след. Формат – переменная=значение и заканчивается нулевым байтом. Ряд переменных окружения, имена которые зарезервированы системе, но пользователь может добавлять свой. COMSPEC,PATH,FILES. Окружение для командного процессора загружается из файла config.sys, autoexe.bat.

 

49)Формат и назначение блока управления памятью. Каждой программе в MS DOS отводится блок памяти. С каждым таким блоком ассоциирован дескриптор, называемый MCB - Memory Control Block. Этот дескриптор содержит размер блока, идентификатор программы, которой принадлежит этот блок и признак того, является ли данный блок последним в цепочке. Размер сегментов и их адреса отсчитываются в параграфах размером 16 байт. После запуска.com-файл получает сегмент размером 64К, а.exe - всю доступную память. Обычно.exe-модули сразу после запуска освобождают ненужную им память и устанавливают brklevel на конец своего сегмента, а потом увеличивают brklevel и наращивают сегмент по мере необходимости. Естественно, что наращивать сегмент можно только за счет следующего за ним в цепочке MCB, и MS DOS разрешит делать это только в случае, если этот сегмент не принадлежит никакой программе. При запуске программы DOS берет последний сегмент в цепочке, и загружает туда программу, если этот сегмент достаточно велик. Если он недостаточно велик, то появляется сообщение Not enough memory и отказывается загружать программу. При завершении программы DOS освобождает все блоки, принадлежавшие программе. При этом соседние блоки объединяются. Пока программы, действительно, завершаются в порядке, обратном тому, в котором они запускались, - все вполне нормально. Другое дело, что в реальной жизни возможны отклонения от этой схемы. Формат блока MCB. Внутри блока MCB хранится длина описываемого данным MCB фрагмента памяти. Следующий фрагмент памяти начинается сразу за предыдущим. Все блоки управления памятью связаны в список. Блоки MCB бывают двух типов - M и Z. M-блоки - это промежуточные блоки. Блок типа Z является последним блоком в списке и может быть только один. Приведем формат блока MCB: Смещение, байт Размер, байт Имя, поля Описание

0 1 type Тип блока MCB (M или Z)

1 2 owner Сегментная компонента адреса владельца блока; этот блок всегда выровнен на границу параграфа (если 0, то блок описывает сам себя)

3 2 size Число параграфов в этом блоке

5 11 reserve Зарезервировано.

Организация дочерних процессов.

 

50)Организация дочерних процессов. Программа загружается в память при выполнении функции DOSexec(int 21h, 4BH) которая играет роль встречного загрузчика.Способы загрузки выполнения:1.набор текста в каждой строке с нажатием Enter. В этом случаефукцию exec вызывает командный процессор command.com 2.операционная система.3.программа пользователя может вызывать функцию exec.Последовательный вызов функции exec различными спосабами порождает дочернии процессы.процесс который иницировал функцию exec называеться родительным.Программа функций exec в памяти вклбчает три важных компанента:1.окружение2.префикс программного окруженя3.программы.Окружение и сама программа предваряются блоком управления памяти 16-байт.в процессе начальной загрузки DOS создает так называемое окружение в катором будут работать активированные программы.Первое окружение получает командный процессор command.com.

Опишите этапы трансляции. Приведите общую схему транслятора.

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

Генерация кода — это фаза, непосредственно связанная с порождением команд, составляющих предложения выходного языка и в целом текст результирующей программы. Это основная фаза на этапе синтеза результирующей программы. Таблицы идентификаторов (иногда - «таблицы символов») — это специальным образом организованные наборы данных, служащие для хранения информации об элементах исходной программы, которые затем используются для порожде­ния текста результирующей программы.

 



Поделиться:


Последнее изменение этой страницы: 2016-06-28; просмотров: 933; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.200.95.157 (0.045 с.)