РАЗРАБОТКА СРЕДСТВ АВТОМАТИЗАЦИИ ПОСТРОЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННЫХ ПРОГРАММ С ЯВНЫМ ВЫДЕЛЕНИЕМ СОСТОЯНИЙ В.С. Гуров, М.А. Мазин, А.С. Нарвский, А.А. Шалыто
Введение
В последнее время широкое распространение получили пакеты для проектирования программ на языке UML. Они позволяют разработчику создавать модель программы с помощью набора диаграмм. В дальнейшем диаграммы могут быть преобразованы в код на целевом языке программирования.
В языке UML существуют диаграммы для описания как статической структуры программы (диаграммы классов), так и для описания поведения объектов (диаграммы состояний, диаграммы взаимодействия, диаграммы последовательности вызовов).
Существует множество методологий для моделирования статической структуры программ, а также для получения кода на целевом языке. Описание же поведенческой части программы, как правило, носит неформальный характер. Отсутствует семантическая связь с создаваемым впоследствии кодом, т. е. диаграммы, описывающие поведение, используются только для понимания предметной области. Более того, при наличии сложной логики построение диаграмм взаимодействия и диаграмм последовательности вызовов весьма проблематично. В этой ситуации также весьма сложно применять и диаграммы состояний в виде, предлагаемом авторами UML [1], так как в этом случае идентификаторы входных и выходных воздействий на них не разместить. Кроме того, UML-диаграммы состояний имеют ограничения по вложенности автоматов в состояния.
В работе [2] предложен метод проектирования событийных объектно-ориентированных программ с явным выделением состояний, названный SWITCH-технологией. Особенность этого подхода состоит в том, что поведение объектов описывается с помощью конечных автоматов, представляемых в форме графов переходов с нотацией, описанной в работе [3]. Для каждого автомата также строится схема связей, которая задает интерфейс автомата.
Существуют утилиты, позволяющие автоматически получать код из графов переходов. Например, в работе [4] такая утилита предложена в рамках SWITCH-технологии. При этом необходимо отметить, что указанные утилиты обладают ограниченной функциональностью .
Настоящая работа посвящена решению задачи автоматизации построения программ указанного класса - событийных объектно-ориентированных программ с явным выделением состояний. При этом для обеспечения переносимости создаваемых приложений применяется язык программирования Java и язык разметки XML. Для проектирования используется SWITCH-технология и унифицированный язык моделирования UML. Схема связей автомата, которая разрабатывается в соответствии с указанной технологией, записывается с помощью UML-диаграммы классов, а граф переходов - с помощью UML-диаграммы состояний.
1. Процесс моделирования системы
Предлагаемый процесс моделирования системы состоит в следующем:
• на основе анализа предметной области строится концептуальная модель системы -сущности и отношения между ними;
• в отличие от традиционных для объектно-ориентированного программирования подходов [5], из числа сущностей выделяются источники событий, объекты управления и автоматы. Источники событий активны - они по собственной инициативе
воздействуют на автомат. Объекты управления пассивны - они выполняют действия по команде от автомата. Объекты управления также формируют значения входных переменных для автомата. Автомат активируется источниками событий и на основании значений входных переменных и текущего состояния воздействует на объекты управления, переходя их в новое состояние;
• используя нотацию диаграммы классов, строится схема связей автомата, задающая его интерфейс. На этой схеме слева отображаются источники событий, в центре -автоматы, а справа - объекты управления. Источники событий с помощью иМЬ-ассоциаций связываются с автоматами, события которым они поставляют. Автоматы связываются с объектами, которыми они управляют;
• схема связей, кроме задания интерфейса автомата, выполняет функцию, характерную для диаграммы классов - задает объектно-ориентированную структуру программы;
• каждый объект управления содержит два типа методов, которые реализуют входные переменные (х^ ) и выходные воздействия ^к);
• для каждого автомата с помощью нотации диаграммы состояний строится граф переходов типа Мура-Мили, в котором на каждой дуге могут указываться событие (е1), булева формула из входных переменных и формируемые на переходах выходные воздействия. В вершинах могут указываться выходные воздействия и имена вложенных автоматов. Каждый автомат имеет одно начальное и произвольное количество конечных состояний;
• состояния на графе переходов могут быть простыми и сложными. Если в состояние вложено другое состояние, то оно называется сложным. В противном случае состояние является простым. Основной особенностью сложных состояний является то, что наличие дуги, исходящей из сложного состояния, интерпретируется как наличие такой дуги, исходящей из каждого вложенного состояния;
• все сложные состояния неустойчивы, а все простые, кроме начального, - устойчивы. При использовании сложных состояний в автомате при появлении события может выполняться более одного перехода. Это происходит в связи с тем, что сложное состояние является неустойчивым, и автомат осуществляет переходы до тех пор, пока не достигнет первого из простых (устойчивых) состояний. При этом отметим, что, если в графе переходов сложные состояния отсутствуют, то, как и в 8Ш1ТСИ-технологии, при каждом запуске автомата выполняется не более одного перехода;
<s l}' -seventproviders-pi : ....unimod.adapter.standalone,provider,Tinner 11 * «statennachine» A1 : ol «controlledobject» ol : ...unirnod,adapter.standalone,co,Counter
i/ E101: String = "elOl" -(Next tick happened}
-► (■ x4: int -¡Returns counter value} (■ zl: void -[Resets counter to zero} (■ z2: void -[Increments counter} (■ z3: void -[Decrements counter} (■ z5: void -[Prints counter into System.out}
-►
o2 «controlledobject» o2 : test,co.Printer
-► « zl: void-[Print "Hello, World!"} (■ z2: void -[Print "Bye, World!"}
Рис. 1. Схема связей автомата
Рис. 2. Граф переходов автомата
• каждая входная переменная и каждое выходное воздействие являются методами соответствующего объекта управления, функциональность которых реализуется вручную на целевом языке программирования.
На рис. 1 приведен пример схемы связей автомата, представленной с использованием UML-нотации диаграммы классов.
На рис. 2 приведен пример графа переходов автомата, представленного с использованием UML-нотации диаграммы состояний.
Множество диаграмм классов и диаграмм состояний, построенных описанным выше образом, задает поведенческую модель системы. Содержимое диаграмм может быть автоматически преобразовано в текстовое описание в формате XML, для последующей передаче интерпретатору.
2. Программный пакет UniMod
Для автоматизации описанного выше процесса моделирования авторами был разработан программный пакет UniMod. Он состоит из следующих частей:
• ядро, которое содержит объектную метамодель конечного автомата, алгоритмы разбора и трансляции булевских выражений на переходах, алгоритмы проверки корректности конечного автомата и среду исполнения XML-описания;
• встраиваемый модуль для платформы Eclipse, который позволяет создавать схемы связей автомата и графы переходов в виде UML-диаграмм, сообщает пользователю об ошибках, допущенных им в процессе проектирования, и предлагает пути их устранения, выполняет генерацию XML-описания, а также позволяет запускать спроектированную автоматную модель «в одно нажатие».
2.1. Интерпретатор .XML-описания модели системы
На языке Java разработана среда для интерпретации XML-описания модели. При этом сначала описание однократно и целиком преобразуется в соответствующее внутреннее объектное представление программы. В результате образуется система, состоящая из среды исполнения и объектного представления программы. Эта система функционирует в соответствии с описанной ниже операционной семантикой:
• при запуске системы инициализируются все источники событий. После этого они начинают воздействовать на связанные с ними автоматы;
• каждый автомат начинает свою работу из начального состояния, а заканчивает в одном из конечных;
• при получении события автомат выбирает все исходящие из текущего состояния переходы, помеченные символом этого события;
• автомат перебирает все выбранные переходы и вычисляет булевы формулы, записанные на них, до тех пор, пока не найдет формулу со значением true;
• если переход с такой формулой найден, автомат выполняет выходные воздействия, записанные на дуге, и переходит в новое состояние. В новом состоянии автомат выполняет выходные воздействия, указанные в этом состоянии, а также запускает вложенные в него автоматы;
• если переход не найден, то автомат продолжает, аналогично изложенному выше, поиск перехода у состояния, в которое вложено текущее состояние;
• при переходе в конечное состояние автомат останавливает все источники событий. После этого работа системы завершается.
При этом как при работе, так и при отладке могут вестись два типа протоколов (логов) - длинный и короткий. Первый из них отражает внутреннее поведение автоматов, в том числе вложенных, записи для которых выделяются отступами. Во втором протоколе отражаются только входные переменные и выходные воздействия.
2.2. Проверка корректности модели системы
В стандарте на язык UML синтаксис и семантика диаграмм определяется набором ограничений, записанных на языке объектных ограничений (Object Constraint Language). Данный набор ограничений должен удовлетворяться для любой правильно построенной диаграммы. Именно на этих ограничениях и основана проверка корректности модели диаграмм. Авторами предлагается расширить множество ограничений следующим образом:
• все состояние на диаграмме состояний должны быть достижимы;
• множество исходящих переходов для любого состояния должно быть полно и непротиворечиво. Это означает, что при обработке любого события не должно быть альтернативных переходов и хотя бы один переход должен выполняться.
Проверка набора ограничений, описанных в стандарте UML, является тривиальной задачей, поэтому дальше описано, как осуществляется проверка дополнительных ограничений, введенных авторами.
UML-диаграммы состояний графами не являются. Чтобы распространить теорию графов на эти диаграммы, их необходимо преобразовать.
Определение 1. Определим UML -диаграмму состояний как тройку D = (Ss>Sc,t), где S s - множество простых состояний, Sc - множество сложных состояний, а T -множество переходов между состояниями, каждый переход задается парой (, s2), где оба элемента принадлежат объединению множеств простых и сложных состояний.
Будем говорить, что диаграмма состояний D' = (Ss, Sc', T') получена из диаграммы
D =(Ss' Sc,t) исключением сложного состояния sc, если
Sc ' = Sc \ {sc }
T' = T¿2):si esc,(sc,s2)eT}u{(sl552):s2 = mit^Щ,sc)eT})\sc)}^{(sc,s2)})
5
где init(sc) - начальное состояние в sc. Также будем говорить, что псевдограф G = (V, E) получен из диаграммы состояний D = (ss, Sc, T) путем исключения всех сложных состояний, если диаграмма D' = (ss', 0, T') получена из диаграммы D = (ss, Sc ,t) последовательным исключением всех сложных состояний, V = ss', а e = T'.
Утверждение 1. Для каждой диаграммы состояний существует единственный псевдограф, полученный из нее путем исключения всех сложных состояний. То есть процесс исключения всех сложных состояний приводит к одному и тому же результату вне зависимости от порядка исключения состояний.
Все возможные диаграммы состояний можно разбить на классы эквивалентности. Две диаграммы эквивалентны, если им соответствует один и тот же псевдограф. Полученные результаты позволяют распространить теорию графов на диаграммы состояний.
Определение 2. Простое состояние на ЦМЬ-диаграмме состояний называется достижимым, если в псевдографе, полученном исключением всех сложных состояний, соответствующая ему вершина достижима из вершины, соответствующей начальному состоянию на ЦМЬ-диаграмме, которое вложено в сложное состояние, не вложенное ни в какое другое сложное состояние.
Множество достижимых состояний можно построить обходом графа переходов «в глубину» [7]. Время, затрачиваемое на обход графа, пропорционально количеству вершин в нем - 0(У).
Единственность перехода для каждого набора входных воздействий (непротиворечивость) означает, что для каждого состояния условия на всех переходах попарно ортогональны, то есть, если с - условие на 1-ом переходе, то
г Ф 1 ^ с л с = 0
г ]
Полнота множества переходов для состояния означает, что
с1 Vс2 V... Vсы = 1
Далее показано, как решить задачу проверки полноты и непротиворечивости графа переходов конечного автомата.
2.3. Разбор, минимизация и интерпретация булевских формул
Для проверки полноты и непротиворечивости множества переходов, для каждой вершины необходимо решать задачу проверки тождественного равенства единице или нулю произвольной булевской формулы. Это ^Р-полная задача [8]. Для ее решения можно использовать два подхода:
• вычисление значений формулы на всех возможных значениях переменных, то есть построение таблицы истинности;
• минимизация булевской формулы. Для тождественно истинных и тождественно ложных формул минимизация приводит к получению константного значения.
Второй подход обладает рядом преимуществ. Во-первых, он позволяет расширить класс используемых булевских формул, дополнив множество литералов одноместными предикатами [9]. Во-вторых, в случае, если формула не является тождеством, то ее минимизированное представление можно использовать для облегчения процесса создания корректных диаграмм. По указанным причинам в состав программного пакета ЦШМоё входит модуль минимизации булевских формул.
Ниже приведена грамматика в виде набора форм Бэкуса-Наура (БНФ), задающая язык формул, для которых реализован алгоритм минимизации.
8 Т Т'
Т' ог
Т' г
Т Ь Ь'
Ь' апё Т
Ь' г
Ь ( )
Ь по1 Ь
Ь Ь Р ¡ё
Ь Ьоо1
р ¡ё ор ¡Ш
р Ш ор ¡ё
Терминальные символы имеют следующий смысл: or - дизъюнкция; and - конъюнкция; not - отрицание; id - идентификатор; bool - булевская константа; int - целочисленная константа; op - символ предиката (<, <, >, >, =,
Построение синтаксического анализатора для данной грамматики осуществлялось с помощью библиотеки ANTLR [10], позволяющей автоматически по заданной LL(k) грамматике [11, 12] строить транслятор входного потока в синтаксическое дерево разбора. Дерево, полученное в результате трансляции, можно использовать для вычисления значений формул во время выполнения программы, а также трансформировать в другое дерево.
Реализованный процесс минимизации булевской формулы основан на трансформации синтаксического дерева разбора и состоит из следующих этапов:
1. приведение формулы к дизъюнктивной нормальной форме (ДНФ);
2. упрощение термов ДНФ с помощью законов идемпотентности, операций переменной с ее отрицанием и операций переменной с константой для булевских переменных;
3. нахождение интервалов целочисленных переменных, входящих в терм, при которых терм не обращается в ложь.
Приведение формулы к ДНФ реализуется с помощью последовательности трансформаций, сохраняющих тождественное равенство соответствующих формул. Формула, приведенная к ДНФ, представляет собой дизъюнкцию термов, каждый из которых -конъюнкция литералов, а каждый литерал - предикат, булевская переменная или ее отрицание.
Для приведения синтаксического дерева к дереву, соответствующему ДНФ, необходимо и достаточно удовлетворить следующие условия:
• узлы, соответствующие логическому отрицанию, должны быть родительскими только по отношению к узлам, соответствующим вхождениям переменных;
• ни один узел, соответствующий конъюнкции, не должен быть предком по отношению к узлам, соответствующим дизъюнкции.
Для выполнения первого условия дерево трансформируется по законам де Моргана
—(а л b) = — а v — b
1
—(а v b) = — а л — b и отрицания отрицания
На рис. 3 приведена трансформация дерева по закону де Моргана для операции «ИЛИ». Для операции «И» соответствующая трансформация приведена на рис. 4. Закон отрицания отрицания показан на рис. 5.
Выполнение второго условия достигается трансформацией согласно дистрибутивному закону алгебры логики (рис. 6): а V (Ь л с) = (а V Ь ) л (а V с)
а л (Ь V с) = (а л Ь ) V (а л с)
—(— а) = а
Рис. 3. Преобразование по закону де Моргана для операции «ИЛИ»
Рис. 4. Преобразование по закону де Моргана для операции «И»
Рис. 5. Преобразование по закону отрицания отрицания
Рис. 6. Преобразование по дистрибутивному закону
Важно отметить, что порядок применения преобразований не безразличен - сначала должно быть удовлетворено первое условие, и лишь затем второе. Если сначала удовлетворить второе условие, а затем первое, то, в общем случае, результирующая формула не будет иметь вид ДНФ, и необходимо будет применять преобразования до тех пор, пока формула не будет приведена к ДНФ, что существенно понизит производительность алгоритма.
После приведения формулы к ДНФ поиск минимальной ДНФ не осуществляется, так как такой поиск является крайне ресурсоемкой операцией. К тому же оптимизация термов для тождественно ложных формул гарантированно приводит к тому, что формула обращается в ложь.
Упрощение термов основывается на применении для булевских переменных законов идемпотентности а v а = а , а л а = а ,
операций переменной с ее отрицанием
а v—a = 1, а л —а = 0 и операций с константой
а V 0 = а, а V1 = 1,
а л 0 = 0,
а л 1 = а.
Из формулы исключаются термы, в которые хотя бы одна переменная входит вместе со своим отрицанием. Множественные вхождения одного литерала в терм заменяются единственным вхождением.
Для упрощения термов, в которые входят предикаты над целочисленными переменными, используется специальная техника, описанная далее.
Определение 3. Ядром предиката Р назовем множество значений переменной, на котором предикат Р обращается в истину Кег Р = {х: Р(х) = 1}.
Если в терм входят предикаты Р}, Р2, ..., Рп от переменной х0, то терм обращается в тождественную ложь, когда
п
П Кег (Р ) = 0
1=1
то есть когда при любом значении переменной х0 хотя бы один предикат ложен.
Упомянутая техника состоит в том, чтобы для каждой переменной терма построить пересечение ядер предикатов, в которые она входит, и в случае, если хотя бы одно пересечение пусто, исключить терм из формулы. Заметим, что эта техника не использует целочисленной природы переменных, поэтому может быть распространена на предикаты заданные над произвольным множеством.
Теорема 1. Если ни одно правило для упрощения термов не привело к исключению терма из ДНФ, то существует комбинация значений переменных, обращающая терм в истину.
Доказательство. То, что терм не исключен из формулы ни по одному правилу, означает, что ни одна булевская переменная не входит в формулу со своим отрицанием, и для всех целочисленных переменных пересечение ядер, соответствующих предикатов, не пусто.
В качестве значения булевской переменной возьмем истину, если переменная входит в формулу без отрицания, и ложь - в противном случае. Для целочисленной переменной в качестве значения выберем любое из пересечения ядер, соответствующих ей предикатов. Выбранные значения переменных обращают терм в истину. ■
Как правило, формулы, соответствующие каждому переходу, не слишком длинны. Поэтому, если предварительно привести формулы для условий на каждом переходе к ДНФ и принять за один шаг алгоритма перемножение термов, то можно оценить время, затрачиваемое на проверку полноты и непротиворечивости.
Оценка сложности алгоритма проверки непротиворечивости. Пусть для данного состояния с данным событием связано N переходов, каждый из которых помечен формулой
С (1 = 1,..., N).
Количество термов в 1-ой формуле обозначим через ш1
1 т,
С, = Ц V ... V 1
Для проверки непротиворечивости 1-ого и ]-ого условий необходимо привести к ДНФ их конъюнкцию
С, л С^ = (^ V к V 1 ) Л ^ V к V ■
Эта операция займет m' Х М] шагов. Количество термов в каждой формуле не пре-m = max (mi)
восходит числа ' , поэтому количество шагов для проверки непротиворечивости всей системы переходов можно оценить как
0(с2 х т2)
Оценка сложности алгоритма проверки полноты. Для проверки полноты необходимо привести к ДНФ отрицание дизъюнкции всех формул с (г = N)
— ( V к V СN ) = —((^1 V к V ^ ) V к ^tN V к V ^ ))
Видно, что приведение этой формулы к ДНФ с помощью описанной выше процедуры и последующая оптимизация термов имеет экспоненциальную от количества формул трудоемкость. Увеличить производительность алгоритма позволяет эвристика, основанная на дополнительной оптимизации термов. Предлагаемая процедура проверки полноты состоит из следующих этапов:
1. построение дизъюнкции формул условий на переходах;
2. оптимизация термов в дизъюнкции;
3. приведение к ДНФ отрицания формулы, полученной на шаге (2);
4. оптимизация термов в формуле, полученной на шаге (3);
5. равенство лжи результирующей формулы означает полноту системы формул. Количество термов за счет оптимизации на шаге (2) сокращается, поэтому приведение к ДНФ на шаге (3) происходит значительно быстрее.
В случае, если система не полна, минимизированная формула, полученная на шаге (4), может быть использована в качестве условия на переходе, который необходимо добавить, для обеспечения полноты.
Теорема 2. Формула, полученная на шаге (4), ортогональна каждой формуле с (} = 1,к, N), и система условий, дополненная этой формулой, полна.
Доказательство. Формула, полученная на шаге (4), тождественно равна
— ( V к V СN ),
ее конъюнкция с формулой с:
— ( V ... V С V ... V СN ) Л с = (-с1 Л к Л Л к Л-СN) Л с =
— с л к л — с л с1 л к л — СN = —с л к л 0 л к л — СN = 0
Полнота системы следует из того, что дизъюнкция формулы со своим отрицанием тождественно истинна. ■
Эта теорема используется при построении инструмента для редактирования диаграмм состояний. Если введенная пользователем система переходов не полна, инструмент указывает, какое условие следует задать на переходе для исправления ошибки. Подобным образом может быть использована и формула, полученная в результате проверки непротиворечивости двух условий.
Теорема 3. Пусть с ' - формула, полученная в результате минимизации конъюнкции формул С и су. Тогда формулы с- л—с' и су ортогональны. И если система
{с1,к,с ,СN} полна, то система {с1,---,с л—с',•••,СN} также полна. Доказательство. Проверка ортогональности:
( Л —с')Л с} = ( Л — (с Л с}))Л с} =
с л Су л ( — сг- v —су ) = ( л Су л — сг- ) v (С1 л Су л —су ) =
( 0 л су )v(ci л 0) = 0 Полнота:
с л —с ' = с1 л — (с1 л Су ) = (с л — с ) v (с Л—С у ) = с1 л — Су
1
таким образом, дизъюнкция формул равна
с1 v к v (с1 л С ') v к v Су v к v cN = с1 v к v (с1 л —Су ) v к v Су v к v cN
но
(
)vcj =( civcj)л(
-е.- vc, =c vc,
j
)
j
поэтому
с-1 v к v (с,- л ) v к v с]- v... v см = с v... v с, v к v с]- v к v см
Последняя формула тождественно истинна в силу полноты системы переходов
Теорема 3 также используется при построении инструмента редактирования диаграмм - инструмент подсказывает пользователю пути устранения противоречий в системе условий на переходах.
Встраиваемый модуль для платформы Eclipse (http://www.eclipse.org) входит в состав пакета UniMod и позволяет создавать схемы связей и графы переходов автоматов. Платформа Eclipse обладает рядом преимуществ перед такими продуктами, как, например, IntelliJIDEA или Borland JBuilder:
• является бесплатным продуктом с открытым исходным кодом;
• содержит библиотеку для разработки графических редакторов - Graphical Editing Framework;
• активно развивается фирмой IBM и уже сейчас обладает не меньшей функциональностью, чем упомянутые выше аналоги.
На рис. 7 представлена рабочая область платформы Eclipse с запущенным модулем UniMod. На этом рисунке справа вверху в виде дерева представлена структура разрабатываемого конечного автомата. Узлами дерева являются объекты управления, состояния и переходы между состояниями. Узлу, который представляет объект управления, сопоставлен класс на схеме связей. Узлу, представляющему состояние - состояние на графе переходов. При выделении какого-либо узла в дереве открывается диаграмма, на которой присутствует соответствующий элемент, и он выделяется. Такой подход позволяет легко ориентироваться в структуре создаваемого конечного автомата.
В окне, расположенном в нижней части экрана, отображаются ошибки, найденные при проверке корректности построенной модели.
Для обеспечения удобной и быстрой разработки программ на текстовых языках в современных средствах разработки реализованы:
• подсветка семантических и синтаксических ошибок;
• автоматическое завершение ввода и автоматическое исправление ошибок;
• запуск и отладка программы внутри среды разработки.
В английском языке эти возможности называются «code assist». При создании модуля для платформы Eclipse авторы перенесли указанные подходы на процесс редактирования диаграмм.
Проверка корректности диаграмм происходит следующим образом. В фоновом режиме запускается процесс, который при любом изменении диаграммы проверяет ее на корректность. При нахождении ошибки некорректный элемент на диаграмме выделяется цветом. На рис. 8 приведен пример диаграммы с недостижимым состоянием, которое автоматически выделено красным цветом.
Традиционно автоматическим завершением ввода называется подход, благодаря которому среда по заданному началу лексемы определяет набор допустимых конструкций, префиксом которых данное начало является, и предлагает пользователю выбрать одну из них. Автоматическое исправление ошибок предполагает, что редактор для каждой найденной ошибки указывает пользователю варианты ее исправления.
В случае текстового редактора оба подхода основываются на знании грамматики языка и наборе семантических правил.
{c1,..., ci,..., cn }.
■
2.4. Встраиваемый модуль для платформы Eclipse
Рис. 7. Рабочая область платформы Eclipse
Ч Palette ti L-!
f
в • «i r\
o2,z 6 eiA 11,1 s e23 jü 2. z 1
11 ( ; ( 1
Dsrarrnected í.zé ^ Connected ^ lOO
EL fD 3 «
e i
j J
< ) J .
el/bi-zl, ol-z3
&TW ■S
f^j Connectivity
Censóle РгоЫнгк К i error, 0 wacmnqa, ú infos | JeSÜpiiOfl_
Rfcsotxce | Inroloer
O [Al: Error] StalltßLfiatlanaWe dient,ummod Messender9nUone^esHjrces/|
Рис. 8. Недостижимое состояние на графе переходов
В предлагаемом графическом редакторе диаграмм эти подходы реализованы авторами на базе ограничений, определенных стандартом языка иМЬ и описанных выше дополнительных ограничений. Так, для недостижимого состояния, представленного на рис. 8, пользователю будет предложено добавить переход в это состояние из любого достижимого (рис. 9).
B|
* Palette Ь R
0 1r
о • т о,
ez/uLj E. Z3 ,'t>2
< i Ufr
□iBiDnfiitted 1 Cormeited 1 i 100
ЧШ
£ -
J
f J L
=M iLl 1, ol.z3
1 ЕГГПГ ^
L _ J
1
^Cormecti'; f- Quick Fi) IX
¿_ Problems 1 егтог, С v.arr А viilabte fixes: ^ = в
DeKJOto Idc: tiansiton fron с late [Etartl h ".IT.-Л rii'J^^^B и itate [Erofl
О Ial-bt»; *dd transition frcunstite piscornittteti] to statt [Error]
OK
J
Рис. 9. Предлагаемые варианты исправления ошибки на диаграмме
В случае неполноты или противоречивости системы переходов пользователю будет предложено модифицировать условия на переходах или добавить новый переход. Алгоритм определения того, как нужно модифицировать систему переходов, основан на теоремах 2 и 3.
Для запуска программы, написанной на текстовом языке программирования, ее текст либо компилируется в код, исполняемый операционной системой (С++, Pascal) или виртуальной машиной (Java, C#), либо непосредственно исполняется интерпретатором (JavaScript, Basic).
Подобные решения доступны и для графического языка программирования. При запуске диаграммы ее содержимое преобразуется в XML-описание, которое передается интерпретатору. Интерпретатор, в соответствии с операционной семантикой, изложен-
ной выше, «выполняет» ХМЬ-описание. Это описание является изоморфным представлением содержимого диаграмм, и поэтому можно говорить о «запуске» диаграмм как программ.
Заключение
Разработанный метод апробирован при создании ряда приложений и показал свою эффективность. К таким приложениям относятся, например: клиент-серверное приложение мгновенного обмена сообщениями и задача о преступниках (http://is.ifmo.ru/projects/).
Предложенный подход позволяет:
• сократить объем ручного программирования;
• при наличии библиотеки источников событий и объектов управления для определенной предметной области полностью отказаться от ручного программирования;
• использовать диаграммы классов и графы переходов в составе проектной документации;
• формально и наглядно описывать логику поведения программы и модифицировать ее, изменяя только графы переходов;
• упростить сопровождение проекта вследствие повышения централизации логики программы.
Исходные тексты, документация и примеры использования программного пакета «UniMod» представлены на сайте http://unimod.sourceforge.net.
Литература
1. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руководство пользователя. М.: ДМК, 2000. - 320 с.
2. Шалыто А.А., Туккель НИ. Танки и автоматы // BYTE / Россия. 2003. №2. С. 69-73. http://is.ifmo.ru (раздел «Статьи»).
3. Шалыто А.А., Туккель Н.И. SWITCH-технология - автоматный подход к созданию программного обеспечения "реактивных" систем // Программирование. 2001. №5. С. 45-62. http://is.ifmo.ru (раздел «Статьи»).
4. Головешин А. Использование конвертора Visio2SWITCH. http://softcraft.ru
5. Грэхем И. Объектно-ориентированные методы. Принципы и практика. 3-е издание. М.: Вильямс, 2004.
6. Eclipse. http://eclipse.org
7. Кормен Т., Лайзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ. М.: МЦМНО 2000. 960 с.
8. Гэри М., Джонсон Д., Вычислительные машины и труднорешаемые задачи. М.: Мир. 1982.
9. Верещагин Н.К., Шень А. Лекции по математической логике и теории алгоритмов. Ч.2 Языки и исчисления. М.:МЦНМО. 2000. 288 с.
10. Parr T.J., Quong R.W. ANTRL: A Predicated-LL(k) Parser Generator // Software Practice And Experience. 1995. №25 (7).. Р. 789-810.
11. Ахо А., Сети Р., Ульман Д. Компиляторы: принципы, технологии и инструменты. Вильямс. 2001. 768 с.
12. Хантер Р. Основные концепции компиляторов. Вильямс. 2002. 256 с.