Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книги / ПРОЕКТИРОВАНИЕ ПОВС (последнее).doc
Скачиваний:
77
Добавлен:
01.06.2015
Размер:
36.23 Mб
Скачать

7.3.Разработка транслятора, загрузчика и диспетчера системы программного обеспечения модульных ивс

Для ИВС модульного типа основной проблемой создания МО является проблема построения главной части МО ИВC – программного обеспечения ИВС, а в ПО ИВС - построение специальной программы – транслятора. Эта программа должна производить отображение исходной задачи, записанной на входном языке ИBC, в модули структуры. Схематически система отображения задач в модульную структуру, которая каждую элементарную конструкцию языка (функцию) отображает в соответствующий функциональный модуль ИВС (Т-оператор) [30], представлена на рис. 7.2.

Вначале рассмотрим принципы построения блочного транслятора компилирующего типа [10], основанного в простейшем случае на неформальном представлении исходных алгоритмов задач, т.е. без учета правил языка программирования высокого уровня [28].

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

Рис. 7.2. Схема отображения задач в модульную ИВС

Рис. 7.3. С-структура объектной программы

Программное обеспечение ИВС условно разбивается на три основные части:

1) собственно транслятор, который переводит подпрограмму в двоично-символьную или полускомпилированную форму. Из таких двоично-символьных подпрограмм окончательная программа составляется с помощью второй части;

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

Таким образом, загрузчик выполняет две логически различные между собой операции: связь подпрограмм и настройку подпрограмм по месту;

3) управляющая программа, в которой блок "обработка запросов и прерываний" имеет черты супервизора. Вся управляющая программа для ИВС представляется как операционная система [90].

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

Таким образом, при организации работы модульных ИВС можно рассматривать отображение задач в них безотносительно к внутреннему содержанию модулей, реализующих базисные операторы, это дает возможность на внешнем уровне, при программировании, использовать естественную математическую запись исходной задачи. Объектная программа представляет собой двоичное дерево, объединенное с графом обратных связей, определяемого методом представления задачи. На рис. 7.3 для выражения

показано двоичное дерево с графом обратной связи:

,

где GOC – граф обратных связей, определяемый методом отображения. Структура транслятора представлена на рис. 7.4.·

Рис 7.4. Блочный транслятор модульной ИВС

Первая часть – ассемблер – компилятор, который состоит из следующих блоков:

1) блок "Начало программы" – принимает директиву комплексу и производит запуск транслятора;

2) блок "Анализатор семантического кода" – анализирует код входного слова и переводит его на язык системы;

3) блок "Составитель TF – воспроизводит образ входного слова путем построения для него цепи, состоящей из базисных операторов, и формирует вектор приоритетов, в соответствии с которым производится отображение задачи в ИВС;

4) блок "Выбор микропрограмм" – производит по данным предыдущего блока выбор микропрограмм из массива для модулей ИВС и упорядочение их в соответствии с вектором приоритетов по заданной дисциплине.

Вторая часть – загрузчик, который состоит из следующих блоков:

1) блок "Подготовка числовых данных" – готовит всю числовую информацию (расчет начальных данных, масштабирование и др.) для функциональных модулей;

2) блок "Загрузка функциональных модулей" – производит опрос и загрузку модулей микропрограммы, связь микропрограмм (коммутация модулей), пуск и решение задачи.

Третья часть – управляющая программа – супервизор, состоящая из следующих блоков:

1) блок "Редактор" – производит редактирование результатов решений, вывод их на внешние устройства и организует обмен данными с ЦВМ;

  1. блок "Состояние ИВС" – хранит состояние модулей в виде таблицы состояния. Схема вычисления функций по Шеннону может представлять собой одновременно реализацию нескольких базисных операторов. Таблица состояния модулей хранит информацию о том, какой модуль выполняет данный базисный оператор и какие операторы (так называемые, побочные) он ещё может выполнить;

  2. блок "Обработка запросов и прерываний" - производит совместно с предыдущим блоком "Состояние ИВС" обработку запросов, поступающих от первой части транслятора на решение задач и возникающие в системе прерывания.

Наряду с отмеченным, массив микропрограмм включает в себя микропрограммы реализации операторного базиса [30] , в котором работает ИВС.

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

- лексический анализатор (сканер);

- синтаксический анализатор;

- генератор внутреннего кода (семантический анализатор);

- генератор объектного кода;

- информационные таблицы.

Пользуясь грамматикой ЯП и имея в виду структурную схему (рис. 7.5), рассмотрим работу отдельных модулей компилятора. Здесь пунктирными линиями обозначены информационные потоки, сплошные – указывают на порядок работы модулей.

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

В разработанном трансляторе SCANER реализован в виде подпрограммы (модуль SCANER). В табл. 7.1 приведены внутренние представления символов, используемых в данном трансляторе.

Рис 7.5. Блок - схема транслятора ЯП ИВС

Для работы сканера используются следующие переменные и подпрограммы:

  1. СH – глобальная переменная, значением которой всегда является сканируемая литера исходной программы.

  2. CLASSсодержит целое число, которое характеризует класс литеры, находящейся в СH . В табл. 7.2 приведены классы литер, выделенных в данном трансляторе. Таблица классов литер используется в подпрограмме GETCH для определения класса анализируемой сканером литеры. Для этого в начале работы транслятора организуется вектор TL , содержащий 256 элементов. Тогда, используя код литеры, хранящейся в ячейке А, как целочисленный индекс D, находим элемент TL (D), который содержит номер класса литеры, имеющий код D. В качестве внутреннего, кода используется двоичный код для обмена информацией - ДКОИ [10]. Код литеры вычисляется с помощью встроенной функции UNSPEC(A), которая аргументу А ставит в соответствие его двоичный код.

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

  2. SYN – глобальная переменная, соответствующая внутреннему представлению лексемы, находящейся в SEM.

Переменные SEM и SYN являются выходной информацией сканера, которую далее будут использовать синтаксический и семантический анализаторы.

5. GEТСН – процедура, задача которой состоит в том, чтобы выбрать следующую литеру исходной программы и поместить ее в СH , a класс литеры в CLASS. Кроме того, GEТСН, когда это необходимо, читает и выдает на АЦПУ следующую строку исходной программы. Процедура также следит за картами продолжения, которые отмечены в шестой колонке литерой, отличной от пробела. Когда GЕТСH достигает концы карты, читается следующая карта и проверяется литера в шестой колонке. Если там нет пробела, то процедура продолжает пересылать литеры из колонки 7,8 …; если пробел – то в сканер отсылается специальная литера "конец карты" (I = 1), которая затем пересылается синтаксическому анализатору.

Таблица 7.1

Таблица 7.2

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

Для работы сканера необходимы следующие таблицы.

1. Таблица операций, функций и служебных слов. В данном трансляторе она состоит из 3 частей: TS1,TS2 и ТS3.

Таблица символов TS1 содержит все служебные слова, разделители и функции. Таблица символов TS2 содержит их внутренние представления, а ТS3 – физические адреса микропрограмм, реализующих данные операции и функции.

2. Таблица для определения класса литер. Эта таблица реализована как таблица - вектор TL(I), а код данной литеры используется в качестве индекса: для литеры С TL TL(UNSPEC(C)+1)содержит ее класс. Здесь внутренняя функция UNSPEC преобразует символ, который является для нее аргументом, в его двоичное представление в коде EBCDIC. Таблица используется в процедуре GЕТСН. Таблица литер TL приведена на рис. 7.6.

Рассмотрим организацию блоков синтаксического и семантического анализов. По определению [10], синтаксис языка – это множество правил, согласно которым его основные символы, слова, организуются в предложения, тогда как семантика языка – это множество правил интерпретации значения предложения.

Исходя из теории построения компиляторов, при конструировании синтаксического анализатора за основу выбран нисходящий метод грамматического разбора ("top-down") без возвратов [10]. Этот выбор связан еще и с тем, что метод рекурсивного спуска сохраняет свою гибкость и по отношению к семантической обработке. Для этого в процедуры включаются группы команд семантической обработки, не откладывая этот этап до тех пор, пока будет обнаружена вся фраза. Семантические программы сопоставляются с каждым правилом грамматики. Такие программы осуществляют семантическую обработку, когда связанные с ними правила вызывают синтаксическую редукцию. Разделение синтаксиса и семантики позволяют формализовать и автоматизировать синтаксическую обработку и использовать более систематический подход при ее реализации.

В результате использования данного метода исходная программа приводится к грамматике без леворекурсивных правил, чем достигается детерминированность процесса разбора "top-down" . Приведение выполняется

Рис.7.6 Таблица литер TL

на основе теоремы, сформулированной в работе [107].

Таким образом, для языка программирования ИВС используется рекурсивный спуск с контекстом на один символ вперед.

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

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

Грамматика входного языка в данном трансляторе является грамматикой вида LL (I).

Контекстно-свободная грамматика без e правил называется простой LL (1) грамматикой, если для каждого все его продукции начинаются различными терминальными символами.

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

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

Процедуры в синтаксическом анализаторе записываются с соблюдением следующих правил и условий [10, 107].

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

2. Подобно этому, перед тем как выйти из процедуры с сообщением об успехе, символ, следующий за yжe разобранной подцепочкой, помещается в SYN.

3. Процедура SCANER готовит очередной символ исходной программы и помещает его в SYN.

4. Подпрограмма ERROR вызывается в тех случаях, когда обнаружена синтаксическая ошибка. Транслятор должна выявлять по возможности максимальное количество ошибок в исходной программе. Подпрограмма ERROR выдает сообщения об ошибке в следующем виде: "синтакс. ошибка:" <род ошибки> <символ, на котором была прервана трансляция >.

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

5. Для того, чтобы начать синтаксический анализ инструкции, обращаются к программе SCANER, которая поместит первый символ в SYN, а затем вызывается процедура STATE.

По существу, в анализаторе используется обычный стековый механизм, связывающий процедуры во время работы.

Преимущество этого метода заключается в том, что программируя, можно реорганизовать правила так, чтобы они согласовывались с процедурами.

Для внутреннего представления исходной программы используются различные методы, например, польская запись, запись в форме тетрад, запись в форме триад и так далее. В качестве внутренней формы исходной программы в данном трансляторе генерируются тетрады в следующем виде: <оператор>, <операнд>, < операнд >, <результат>.

В приводимом трансляторе используются следующие виды тетрад: - сложение [вычитание, деление, умножение] значений» описанных в P1 и Р2 и запоминание результата по адресу, описанному в Р3.

– переход на i-ю тетраду, если значение, описанное в Ρ, равно нулю [положительное, отрицательное].

#, P1, P2, P3 – значения, описанные в P1, возводятся в степень, описанную в Р2 и результат запоминается по адресу, описанному в P3.

= ,P1, ,P3 – запоминание значения, описанного в P1, в ячейке, описанной в Р3.

P0, P1, , P3 – вычисление значения функции Р0 от аргумента, описанного в Р1, и запоминание в ячейке, описанной в Р3.

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

Рассмотрим для примера процедуру ТЕRΜ, в которой генерируются тетрады для * и /. Сначала делается разбор множителя и указатель на него заносится в локальную переменную Y. Затем мы сканируем операцию * (или /) и второй операнд, после чего для нее генерируется тетрада. Заметим, что после каждой генерации тетрады в Y заносится указатель на имя переменной, содержащей результат операции. Этот процесс повторяется до тех пор, пока не будут обработаны все операции * и /.

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

Особо следует отметить семантическую обработку для интеграла. В силу его специфики, синтаксическая обработка для интеграла отличается от синтаксического анализа для других функций. Выражение для интеграла записывается в нормальной форме Бэкуса в следующем виде INT (<идентификатор>, <идентификатор> , <выражение>, <выражение>), где < идентификатор> обозначает нижний и верхний пределы интегрирования, а < выражение> – соответственно подынтегральную функции и дифференциал. Информация, заключенная в этой записи, не может быть передана в одной тетраде. Поэтому при семантической обработке интеграла генерируются две тетрады следующего вида:

INT, Р1, Р2, 0 – в ячейках P1 и Р2 описаны соответственно нижний и верхний пределы интегрирования.

INT, Р1, Р2, РЗ – значение интеграла от подынтегральной функции, описанной в P1, и дифференциала, описанного в Р2 , запоминается по адресу, описанному в РЗ.

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

Рассмотрим построение программы загрузки объектного модуля и программы-диспетчера программного обеспечения ИВС.

Рис. 7.7. Пример генерации объектного кода

Загрузчиком называется программа, которая подготавливает объектный модуль к загрузке и выполнению операций и инициирует его выполнение на ЦВМ. В силу особенностей интегрирующих вычислительных структур, осуществляющих моделирование решения задач структурным способом, модуль загрузки ИВС реализуется проще, чем в ЭВМ общего назначения. Работа загрузчика ведется по принципу "загрузить-выполнить" [10] и сводится к двум основным функциям:

  1. коммутация ФМ ИВС в соответствии с графом трансляции исходной задачи (или объектным модулем);

2) настройка всех величин в объектном модуле, зависящих от физических адресов ФМ ИВС.

Если в процессе загрузки при коммутации не было выявлено ни одной ошибки, то система выдает на печать сообщение: “Коммутационная информация”, после чего печатаются номера ФМ и операторы (операции или функции), которые они реализуют, а также массив коммутационной информации KI.

На этом загрузочный модуль заканчивает свою работу и пересылает в диспетчер массив коммутационной информации, который используется для процесса коммутации ФМ в ИВС.

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

Основными задачами управляющей программы в системе ПО ИВС является управление вызовами модулей компилятора, загрузчика, программы определения набора базисных операторов, программы расчета начальной числовой информации и других системных модулей, организация заданной последовательности работы модулей ПО ИВС и обмен информацией между модулями, а также сбор статистической информации при работе системы ПО – определение времени работы каждого модуля и всей системы в целом, для чего в диспетчер включена процедура PVR. Эта процедура выдает на печать сообщения о начале и конце работы каждого модуля в следующем виде: ЧЧММССЛЛЛ, где ЧЧ – часы; ММ – минуты; СС – секунды; МЛЛ – миллисекунды.

Время работы каждого модуля определяется как разность двух значений, одно из которых выдается в начале его работы, а другое – в конце. Для определения времени работы всей системы берется разность последнего и первого значений. Кроме того, через модуль управления происходит передача информации между другими программами системы ПО ИВС.