Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ ИТМО
О чем доклад? Как описать сложную логику работы приложения. Как преобразовать это описание в код максимально удобным способом. Инструментальное средство MetaAuto.
Мотивация Существует разрыв между фазами проектирования и реализации. В большинстве случаев моделируют статическую часть программы с помощью диаграммы классов. Сложную логику невозможно описать. Диаграммы взаимодействия и последовательности бесполезны. Диаграммы состояний использовать сложно.
Что нам нужно? Необходимо научиться описывать сложную логику. Необходимо инструментальное средство для преобразования этого описания в исходный код программы.
Как описывать сложную логику работы программы Программирование с явным выделением состояний.
Программа с явным выделением состояний Явное выделение состояний: Вместо набора флагов – выделенное состояние. Непредвиденные переходы исключаются. Ускорение тестирования.
Описание программы с явным выделением состояний Диаграммы состояний UML или аналогичные (графы переходов автоматов). Требуется автоматическая генерация кода или исполнение программы по графам переходов.
Преимущества программ с явным выделением состояний. Облегчение проектирования Облегчение документирования Ускорение процесса тестирования.
Аналоги Для многих языков программирования не созданы соответствующие инструментальные средства. Существующие инструментальные средства не позволяют настраивать получаемый исходный код.
Процесс генерации исходного кода
Генерация кода подстановки (templates C++); подстановки с исполнением кода (ASP); обработчики данных регулярной структуры (XSLT). Наличие групп состояний. Наличие групповых переходов. Наличие логических выражений.
Пример. Шаг 1 Visio file
Пример. Шаг 2 … … XML file
Пример. Шаг 3 //--- this file is machine generated --- //Model: namespace Automatas { public class BaseAutomata { } } /// <summary> /// /// </summary> public abstract class : BaseAutomata { protected string y = "s0"; public void A(int e) { switch (y) { } } XSLT-шаблон
Пример. Шаг 4 //--- this file is machine generated --- //Model: ModelName namespace Automatas { public class BaseAutomata { } /// /// Lexical analyzer /// public abstract class A2 : BaseAutomata { protected string y = "s0"; public void A(int e) { switch (y) { case "s0": if (e == 0) {z401(); y = "s1";} break; case "s1": if (e == 1) {z200(); y = "s1";} else if (e == 0) {z401(); y = "s1";} break; } /// protected abstract void z200(); /// /// Initialize and return the first match /// protected abstract void z401(); } /// /// Syntactical analyzer /// public abstract class A1 : BaseAutomata { protected string y = "s0"; public void A(int e) { switch (y) { case "s0": if (true) {z200(); Call_A2(0); y = "s1";} break; case "s1": if (x206()) { y = "s4";} else if (x201()){z201(); z301(); y = "s1";} else if (x202()){ y = "s2";} else if (x203()){z203(); y = "s3";} break; case "s2": if (x205()) { y = "s0";} else if (x204()) {z202(); Call_A2(1); y = "s1";} else if (true) { y = "s4";} break; case "s3": if (x207()) {z204(); y = "s1";} else if (true) { y = "s4";} break; case "s4": if (true) {z205(); y = "s0";} break; } /// /// Command in the top of the stack /// /// Is condition correct protected abstract bool x201(); /*Часть входных переменных и действий пропущено*/ } Код программы
Интеграция с MS Visual Studio 2003
Применения При создании самого инструментального средства Созданы шаблоны для языков C#, C++, Assembler Предполагается использовать для встроенных систем настраиваемость простота использования
Вопросы?
Спасибо за внимание Дополнительная информация: