- •В.Ф. Гузик проектирование проблемно - ориентированных вычислительных систем
- •Часть 1
- •Предисловие
- •Производительность суперкомпьютеров
- •Глава первая. Концепция построения многопроцессорных вычислительных систем с программируемой архитектурой (мвс па)
- •Глава вторая. Организация математического обеспечения мвс с программируемой архитектурой
- •2.1. Основы математического обеспечения многопроцессорных вычислительных систем с программируемой архитектурой
- •2.2. Организация машинных языков высокого уровня и технология программирования мвс с программируемой архитектурой
- •2.3. Организация параллельных вычислительных процессов в мвс с программируемой архитектурой
- •Глава третья. Проблемно-ориентированные мвс па
- •3.1.Методика перехода от систем дифференциальных и алгебраических уравнений к системе уравнений Шеннона
- •3.1.1.Представление исходной задачи в форме, удобной для реализации на цифровых интегрирующих машинах (цим)
- •3.1.2. Методика перехода от заданных функций к системе уравнений Шеннона
- •3.1.3. Методика перехода от заданных дифференциальных уравнений к системе уравнений Шеннона
- •3.1.4.Методика перехода от систем линейных алгебраических уравнений к системе уравнений Шеннона
- •3.1.5.Получение программных матриц соединений цифровых решающих модулей
- •3.1.6.Методика перехода от программных матриц к схеме соединения цифровых решающих модулей (црм) в цим с жесткими связями
- •3.2.Примеры структурной организации вычислительного процесса в цим.
- •3.2.1.Задача №1
- •3.2.2.Задача №2
- •3.2.3.Задача №3
- •Приложение 3.2
- •3.2.4.Задача №4
- •3.2.5.Задача №5
- •Глава четвёртая. Теоретические основы построения интегрируЮщих вычислительных структур модульного типа
- •4.1. Общая структурно-логическая схема проектирования (анализа и синтеза) модульных ивс
- •4.2. Представление задач для модульных ивс в операторном пространстве
- •4.3. Построение базиса в операторном -пространстве для ивс модульного типа
- •4.4. Разработка эффективного машинного алгоритма выбора базиса в операторном -пространстве
- •4.5. Математическая модель ивс модульного типа на основе t -алгоритмов
- •4.6. Примеры, иллюстрирующие работу базовой машины ивс
- •Глава пятая. Анализ и синтез универсальных решающих блоков интегрирующих вычислительных структур (ивс)
- •5.1. Синтез алгоритма универсального решающего блока интегрирующих вычислительных структур
- •5.2. Разработка алгоритма автоматического масштабирования переменных и приращений в универсальном решающем блока ивс
- •5.3. Построение структурных схем универсальных решающих блоков ивс с автоматическим масштабированием переменных
- •5.4 Разработка алгоритма универсального решающего блока, основанного на принципе цифрового слежения и синтез его структурной схемы
- •5.5.Проектирование решающей части интегрирующих вычислительных структур
- •Глава шестая. Проектирование функциональных модулей интегрирующих вычислительных структур
- •6.1. Исследование принципов построения коммутационных систем модульных интегрирующих вычислительных структур
- •6.2. Разработка волновых каскадных коммутирующих сред для интегрирующих вычислительных структур
- •6.3. Принципы построения цифровых решающих и функциональных модулей ивс
- •6.4.Определение параметров функциональных модулей интегрирующих вычислительных структур
- •6.5.Матричное представление функциональных модулей интегрирующих вычислительных структур
- •6.6. Построение специализированного микропроцессора интегрирующей вычислительной структуры
- •Глава седьмая. Система математического обеспечения модульных интегрирующих вычислительных структур
- •7.1. Структура системы математического обеспечения модульных ивс
- •7.2. Разработка языка структурного программирования высокого уровня для модульных ивс
- •7.3.Разработка транслятора, загрузчика и диспетчера системы программного обеспечения модульных ивс
- •7.4. Построение пакета системных программ для программного обеспечения ивс
- •7.5. Организация вычислительных процессов в модульных ивс
- •Глава восьмая. Однородные цифровые интегрирующие структуры
- •8.1. Цифровые интеграторы для оцис
- •8.2. Интерполяционные и экстраполяционные, одноразрядные и многоразрядные однородные цифровые интегрирующие структуры
- •Глава девятая. Примеры проектирования проблемно- ориентированных мвс на интегрирующих структурах
- •9.1. Моделирующий вычислительный комплекс для исследования систем инерциальной навигации на основе модульных ивс
- •9.2. Применение интегрирующих вычислительных структур для реализации систем управления манипуляционными устройствами автономных роботов
- •9.3. Специализированная вычислительная система для решения задач управления с прогнозированием
- •9.4. Логико-интегрирующие вычислительные структуры
- •Приложение 1 Примерный перечень
- •Министерство образования и науки российской федерации
- •Курс «Технология программирования»
- •Практические задания
- •Курс «Интерфейсы периферийных устройств»
- •Курс «Конструкторско-технологическое обеспечение производства эвм»
- •Библиографический список
- •Оглавление
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) блок "Редактор" – производит редактирование результатов решений, вывод их на внешние устройства и организует обмен данными с ЦВМ;
блок "Состояние ИВС" – хранит состояние модулей в виде таблицы состояния. Схема вычисления функций по Шеннону может представлять собой одновременно реализацию нескольких базисных операторов. Таблица состояния модулей хранит информацию о том, какой модуль выполняет данный базисный оператор и какие операторы (так называемые, побочные) он ещё может выполнить;
блок "Обработка запросов и прерываний" - производит совместно с предыдущим блоком "Состояние ИВС" обработку запросов, поступающих от первой части транслятора на решение задач и возникающие в системе прерывания.
Наряду с отмеченным, массив микропрограмм включает в себя микропрограммы реализации операторного базиса [30] , в котором работает ИВС.
Транслятор с ЯП ИВС как и в предыдущем представлении имеет модульную структуру, которую, исходя из общей структуры компилятора, можно изобразить так, как это показано на рис. 7.5. Он состоит из следующих основных модулей (подпрограмм):
- лексический анализатор (сканер);
- синтаксический анализатор;
- генератор внутреннего кода (семантический анализатор);
- генератор объектного кода;
- информационные таблицы.
Пользуясь грамматикой ЯП и имея в виду структурную схему (рис. 7.5), рассмотрим работу отдельных модулей компилятора. Здесь пунктирными линиями обозначены информационные потоки, сплошные – указывают на порядок работы модулей.
Лексический анализатор (модуль SCANER) образует первый этап процесса трансляции. Он представляет собой ту часть транслятора, который читает литеры исходной программы и группирует их в единые синтаксические объекты, называемые лексемами.
В разработанном трансляторе SCANER реализован в виде подпрограммы (модуль SCANER). В табл. 7.1 приведены внутренние представления символов, используемых в данном трансляторе.
Рис 7.5. Блок - схема транслятора ЯП ИВС
Для работы сканера используются следующие переменные и подпрограммы:
СH – глобальная переменная, значением которой всегда является сканируемая литера исходной программы.
CLASS – содержит целое число, которое характеризует класс литеры, находящейся в СH . В табл. 7.2 приведены классы литер, выделенных в данном трансляторе. Таблица классов литер используется в подпрограмме GETCH для определения класса анализируемой сканером литеры. Для этого в начале работы транслятора организуется вектор TL , содержащий 256 элементов. Тогда, используя код литеры, хранящейся в ячейке А, как целочисленный индекс D, находим элемент TL (D), который содержит номер класса литеры, имеющий код D. В качестве внутреннего, кода используется двоичный код для обмена информацией - ДКОИ [10]. Код литеры вычисляется с помощью встроенной функции UNSPEC(A), которая аргументу А ставит в соответствие его двоичный код.
SEΜ – глобальная переменная типа строка знаков, которая содержит цепочку литер, составляющих только что прочитанный символ.
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] и сводится к двум основным функциям:
коммутация ФМ ИВС в соответствии с графом трансляции исходной задачи (или объектным модулем);
2) настройка всех величин в объектном модуле, зависящих от физических адресов ФМ ИВС.
Если в процессе загрузки при коммутации не было выявлено ни одной ошибки, то система выдает на печать сообщение: “Коммутационная информация”, после чего печатаются номера ФМ и операторы (операции или функции), которые они реализуют, а также массив коммутационной информации KI.
На этом загрузочный модуль заканчивает свою работу и пересылает в диспетчер массив коммутационной информации, который используется для процесса коммутации ФМ в ИВС.
Необходимо отметить, что данный загрузчик относится к перемещаемым. При отсутствии реальной модульной ИВС процесс загрузки в данной системе ПО заканчивается на этапе коммутации ФМ (фактически программных моделей ФМ), после чего производится моделирование задачи.
Основными задачами управляющей программы в системе ПО ИВС является управление вызовами модулей компилятора, загрузчика, программы определения набора базисных операторов, программы расчета начальной числовой информации и других системных модулей, организация заданной последовательности работы модулей ПО ИВС и обмен информацией между модулями, а также сбор статистической информации при работе системы ПО – определение времени работы каждого модуля и всей системы в целом, для чего в диспетчер включена процедура PVR. Эта процедура выдает на печать сообщения о начале и конце работы каждого модуля в следующем виде: ЧЧММССЛЛЛ, где ЧЧ – часы; ММ – минуты; СС – секунды; МЛЛ – миллисекунды.
Время работы каждого модуля определяется как разность двух значений, одно из которых выдается в начале его работы, а другое – в конце. Для определения времени работы всей системы берется разность последнего и первого значений. Кроме того, через модуль управления происходит передача информации между другими программами системы ПО ИВС.