ВВЕДЕНИЕ
Сложно ли создать свой интерпретатор? Сразу возникает столько вопросов. Хотя бы что это такое - интерпретатор? Для простоты будем считать что это программа. Работает она следующим образом и рассмотрим это на простом бытовом примере, а именно замене перегоревшей лампочки. Действия по замене лампы накаливания:
- Обесточить люстру;
- Вывернуть лампу против часовой стрелки из патрона;
- Проверить ее мощность указанную на колбе;
- Подобрать замену;
- Ввернуть лампу по часовой стрелке в патрон;
- Включить люстру.
Когда Вы меняете первый раз в своей жизни лампочку по этой простой инструкции Вы выполняете ее интерпретацию. Делаете все медленно и обстоятельно. Это будет происходить потом каждый раз, просто вы уже буде знать ее наизусть и делать все неосознанно и быстро. Что же такое интерпретация? Вы читаете первую инструкцию (Обесточить люстру). Далее анализируете ее, выбираете из памяти понятия-образы "обесточить" и "люста". Решаете какие действия для это нужно сделать. Выполняете эти действия - щелкаете выключателем. Вот как все просто, Вы проинтерпретировали первую инструкцию.
АНАЛИЗ ПРОБЛЕМЫ
Поскольку интерпретаторы вообще и особенно для абстрактных языков мало интересны для практических целей, нужно найти реальную проблему. С такой проблемой я и столкнулся - вышедший из строя станок с ЧПУ 2С42-65. Так как это УЧПУ (устройство с числовым программным управлением) оказалось старше меня, то единственный способ оживить станок - это замена УЧПУ. Было принято решение разработать свое устройство ЧПУ для металлообрабатывающего станка. При выполнении этой задачи были сформулированы следующие требования:
- В основе УЧПУ должна быть вычислительная платформа совместимая с архитектурой х86 фирмы Intel;
- Возможность объединения всех станков в локальную сеть;
- Обмен информации выполняется по промышленным стандартным интерфейсам (RS-422, RS-485) и протоколам (MODBUS);
- Повышение точности обработки за счет диагностических алгоритмов коррекции движения рабочего органа;
- Взаимодействие с CAD/CAM-системами (AutoCAD, Компас) посредством импорта данных через стандартизованный форматы (Gerber);
- Требования к кодированию информации управляющих программ (УП), изложенные в ГОСТ 20099-83 /1/ и документации на УЧПУ 2С42-65 /2/.
АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
На рисунке 1.1 представлен круг вопросов решаемых при модернизации станков с числовым программным управлением и место проекта в нем. Как видно он довольно обширный и требует системного подхода.
Рисунок 1.1 - Модернизация станка с ЧПУ
Интерпретатор является подсистемой программного обеспечения(ПО) УЧПУ, поэтому рассмотрим подробнее ее составляющие. В состав ПО УЧПУ будут входить следующие модули:
- Оболочка. Обеспечивает взаимодействие с оператором станка посредством графического интерфейса. Координирует работу остальных модулей ПО УЧПУ. Часть функций оболочки связанных с управлением транслятором реализованы в тестовой программе модуля транслятора;
- Интерпретатор. Обеспечивает формирование команд для модуля управления движением путем анализа УП. Формирует различные сообщений связанных с процессом трансляции. Сообщения отображаются оболочкой. Транслятор наиболее универсальная часть ПО УЧПУ, так как он работает со стандартизованными входными данными и имеет четко определенный программный интерфейс. Эти свойства позволяют встраивать его в другие подобные системы;
- Модуль управления движением, управляет электроникой и электромеханикой станка;
- Модуль диагностики станка. Выполняет контроль исправности аппаратных средств, сохранности системного ПО, контроль над правильным протеканием процесса управления с целью предотвращения аварий в системе и брака.
Входными данными интерпретатора является управляющая программа (УП). УП состоит из кадров, которые в свою очередь состоят из слов. Слово состоит из символа адреса (латинская прописная буква), математического знака «+» или «-» (при необходимости), последовательности цифр. Язык не чувствителен к регистру символов и не содержит символов-разделителей (отделяющих один идентификатор от другого) кроме конца кадра (перевод строки).
Значительную часть языка составляют подготовительные и вспомогательные функции (коды Gxx и Mxx соответственно), их назначение изложен в /1/, часть положений в данном ГОСТе отмеченных как «не определено» приводятся ниже в соответствии с /2/, в таблице 1.1.
Таблица 1.1 – Особенности использования адресов в УЧПУ 2С42-65
Функция | Адрес | Смысл |
---|---|---|
Номер программы | О | Номер программы от 1 до 99 |
Номер инструмента | Т | Номер инструмента от 0 до 99 |
Номер смещения инструмента | Н, D | Номер инструмента от 0 до 99 |
Пауза | Е | Задание паузы от 0,1 до 6553,5 сек |
Номер подпрограммы | Р | Задание номера подпрограммы от 1 до 99 |
Число повторений | L | Число повторений подпрограммы, постоянно цикла |
Рисунок 1.2 - Модель типового интерпретатора
Назначение блоков:
- Таблицы. Хранят набор лексем, статическую и динамическую информацию, связанную с ними. Таблица символов транслятора должна обеспечивать доступ к своим элементам за минимальное время, хэш-таблица обеспечивает доступ к любому элементу за одинаковое время, то есть от количества элементов это время не увеличивается, как, например, в случае с бинарным деревом;
- Лексический блок. Выполняет проверку на соответствие УП алфавиту языка, выделяет лексемы и выполняет их поиск в таблице символов;
- Синтаксический анализатор. Переводит последовательность лексем, построенную лексическим блоком, в другую последовательность, которая непосредственно отражает порядок, в котором, по замыслу программиста, должны выполняться операции в программе, язык УП довольно простой и поэтому не требует синтаксического анализа;
- Генератор кода. Формирует управляющие команды для модуля управления движением.
Таким образом, необходимо разработать только три блока:
- Таблица символов;
- Лексический блок;
- Генератор кода.
ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ АНАЛИЗ И ПРОЕКТИРОВАНИЕ
Для проектирования применен язык UML, как наиболее подходящий для визуализации, спецификации, конструирования и документирования объектно-ориентированных систем. Язык UML используется для создания диаграмм отражающих систему с различных точек зрения. Было выбрано три вида диаграмм, так как точки зрения и аспекты, охватываемые остальными диаграммами тривиальны.
Диаграмма вариантов представляет статический аспект с точки зрения прецедентов (рисунок 1.3) и является основой для дальнейшего проектирования.
Рисунок 1.3 -Диаграмма вариантов использования
Описание вариантов использования.
«Выполнить поиск». Оболочка передает транслятору не более 5 символов. Обычно вначале выполняется поиск номера программы, далее начало программы или главный кадр, или номер кадра.
«Установить режим». Обобщает следующие варианты задания режима выполнение программы:
- «Автоматический».
- «Полуавтоматический».
- «Ручной».
«Выполнить пуск». Старт выполнения программы в установленном режиме:
- Автоматический, старт программы с ее начала;
- Полуавтоматический, старт программы со следующего кадра;
- Ручной, старт выполнения введенного кадра;
«Выполнить программу». Выполнение программы в соответствии с установленным режимом.
«Остановить программу». Остановка автоматической работы УЧПУ, состояние координат остается согласно последнему кадру, происходит возврат УЧПУ (не станка!) в исходное состояние. Остановка программы возможна, только если она выполняется (на это указывает связь с ролью «extend» - расширяет).
«Команда модулю движения». Формирование команды для модуля управления движения.
«Выдать сообщение». Обобщает следующие варианты:
- «Ошибка трансляции» - неизвестный символ (отсутствует в алфавите языка) или неправильное кодирование, например вызов подпрограммы, является не последним словом в кадре.
- «Информационное сообщение» - сообщения о ходе выполнения программы.
- «Сообщение программы» - текстовое сообщение, запрограммированное в УП.
Диаграмма классов транслятора представляет статический аспект с точки зрения проектирования (рисунок 1.4), она позволила сгенерировать класс с объявлениями его методов и атрибутов, структуры данных и связи между ними непосредственно на языке С++.
Рисунок 1.4 -Диаграмма классов
Главным процессом модуля является интерпретация. Поэтому была выделена сущность – интерпретатор. Остальные сущности являются данными и включены посредством различных связей в интерпретатор. Деление интерпретатора на другие сущности со своими операциями не было выполнено из-за соображений производительности. Описание связей:
- FInterpreter – hash_map<string, _TableData> (1:1) - направленная связь агрегации с шаблоном hash_map, роль А называется NameTable;
- FInterpreter – _Command (1:1) - направленная связь агрегации с структурой, содержащей данные команды модуля управления движением;
- FInterpreter - _Mode (1:1) - направленная связь агрегации с перечислением, описывающего режимы работы транслятора;
- FInterpreter - _State (1:1) - направленная связь агрегации с перечислением, описывающего состояния конечного автомата лексического анализатора.
Шаблон hash_map выполняет функции таблицы символов и хранит пары ключ (строка) – значение (структура _TableData). Значения отображены направленной связью агрегации один ко многим.
Структура _TableData содержит данные о лексеме и содержит шаблон stack (направленная связь агрегации, роль А называется VarTable).
Шаблон stack используется при вызове подпрограмм.
Диаграмма последовательности для варианта использования «Пуск» представляет динамический аспект с точки зрения проектирования (рисунок 1.5).
Рисунок 1.5 - Диаграмма последовательности
После создания объекта класса FInterpreter в его конструкторе выполняется настройка таблицы символов с помощью метода InitNameTable(). Далее выполняется установка режима отработки программы – вызов метода SetCurrentMode(_Mode). В установленном режиме происходит старт выполнения программы – метод Start(). Этот метод выполняет лексический анализ УП на основе информации хранящейся в таблице символов. Выделения лексем программы ищутся в таблице методом find(string). Метод find возвращает итератор – NameTableIter, через который изменяется или извлекается информация по найденной лексеме. Большинству лексем назначен конкретный метод класса FInterpreter, например лексеме М02 соответствует метод afM02().
4 ответов