Генерация программного кода
Метод разработан для объектно-ориентированных языков, но может быть расширен и для других языков. Однако это расширение выходит за рамки данного исследования.
В отличие от таких инструментов, как Unimod[81]и Stateflow[51], в данном подходе предлагается генерировать не самостоятельную программу, а подпрограмму.
Для объектно-ориентированных языков это набор классов, который пользователь может включить в свою программу. Для того чтобы обеспечить удобство использования сгенерированного кода, делаются следующие шаги:• Для каждого автоматного типа генерируется отдельный класс в отдельном файле. Такой класс называется автоматизированным классом [45].
• Сгенерированный класс содержит: функцию переходов автомата, перечисление, содержащее события, необходимые переменные для переходов и определения функций (выходных воздействий второго типа), в которые пользователь может дописать собственный код, и этот код не исчезнет при повторной генерации кода.
• В коде специальными комментариями помечаются места, которые полностью переписываются, и в которые не следует писать пользовательский код, так как он не сохранится. Пользовательский код из остальных мест будет полностью сохранён.
• Если пользователь добавит новые выходные воздействия второго типа, то их определения будут добавлены к сгенерированному коду.
• Пользователь может задать пространство имён (или пакет в языке Java), в котором будет находиться сгенерированный код. Если между генерациями кода пространство имён было удалено, то оно будет восстановлено.
• Если пользователь добавит к автоматизированному классу наследование от базового класса или интерфейса, то повторная генерация кода сохранит это наследование.
• Генерируются вспомогательные классы, включая менеджер потоков, которые обеспечивают взаимодействие автоматов, находящихся в
разных потоках. Если многопоточность не требуется, то генерацию таких классов можно отключить.
• Пользователь может ввести произвольное число автоматных объектов, которые будут запущены при запуске менеджера потоков.
3.3.1. Первичная генерация кода
При первичной генерации кода файл с автоматизированным классом полностью перезаписывается. Если файла не существовало, то он создаётся.
3.3.2. Повторная генерация кода
При повторной генерации кода файл с предыдущей версией считывается в память и построчно отправляется на вход обработчику CodeProcessor. CodeProcessorчитает строку, и в зависимости от её содержимого, отправляет события автомату GenFinder.Этот автомат записывает код обратно в файл.
На рисунке 3.3.2.1 изображена диаграмма состояний конечного автомата GenFinder, который управляет повторной генерацией кода. Для удобства переходы перенумерованы и их номера отмечены красным.
Список событий автомата GenFinder:
• _class - объявление автоматизированного класса.
• _namespace - объявление генерируемого пространства имён.
• action_found - объявление выходного воздействия второго типа.
• eof - конец файла.
• gen_functions - маркер начала или конца генерируемых функций.
• next_line - новая строка кода, в которой не встретилось ничего из вышеперечисленного.
Рисунок 3.3.2.1. Автомат GenFinder
В таблице 3.3.2.1 приведён список выходных воздействий автомата
GenFinder.
Таблица 3.3.2.1. Выходные воздействия автомата GenFinder
Имя выходного воздействия | Описание |
CheckBrackets | Проверяет корректность расстановки фигурных скобок. Если в конце файла не хватает фигурных скобок, дописывает их. |
InsertNamespace | Записывает объявление пространства имён в буфер. |
RegisterAction | Отмечает найденное выходное воздействие второго типа. |
WriteBuffer | Записывает буфер в файл. |
WriteCurLine | Записывает текущую строку в буфер. |
WriteGeneratedFunctions | Записывает в буфер все сгенерированные члены автоматизированного класса (всё, что непосредственно относится к автомату). |
WriteNewFile | Перезаписывает файл полностью (проводит первичную генерацию кода). |
WriteRemainActions | Записывает в буфер те выходные воздействия второго типа, которые не были найдены в файле. |
Для того чтобы не перегружать диаграмму переходов, выходные воздействия автомата приведем в табл.
3.2.2.2 (в автомате GenFinderвсе выходные воздействия на переходах). Моноширинным шрифтом набраны имена выходных воздействий, обычным - комментарии.Таблица 3.2.2.2. Выходные воздействия автомата GenFinder
Номер перехода | Список выходных воздействий |
1 | WriteNewFile |
2 | InsertNamespace WriteCurLine WriteBuffer |
3 | WriteCurLine |
4 | WriteCurLine WriteBuffer |
5 | WriteCurLine WriteBuffer |
6 | WriteCurLine |
7 | RegisterAction WriteCurLine |
8 | WriteGeneratedFunctions WriteRemainActions WriteBuffer |
9 | WriteNewFile |
10 | WriteCurLine |
11 | WriteCurLine WriteBuffer |
12 | WriteCurLine |
13 | WriteCurLine |
14 | RegisterAction WriteCurLine |
15 | RegisterAction WriteCurLine |
16 | WriteGeneratedFunctions WriteRemainActions WriteBuffer |
17 | WriteBuffer |
18 | WriteGeneratedFunctions |
19 | WriteCurLine |
20 | WriteRemainActions CheckBrackets WriteBuffer |
21 | RegisterAction WriteCurLine |
3.4.
Еще по теме Генерация программного кода:
- Особенности программной реализации имитационного моделирования коммутационного устройства
- Лукин Михаил Андреевич. Верификация автоматных программ. Диссертация на соискание ученой степени кандидата технических наук. Санкт-Петербург - 2014, 2014
- ИССЛЕДОВАНИЕ ХАРАКТЕРИСТИК КОММУТАЦИОННОГО УСТРОЙСТВА С ПАРАЛЛЕЛЬНО-КОНВЕЙЕРНОЙ ДИСПЕТЧЕРИЗАЦИЕЙ ПАКЕТОВ
- Требования к функциональным блокам коммутационного устройства
- Некоторые вопросы реформирования административного правосудия в Кыргызской Республике
- Тема: ПРОИЗВОДСТВО В СУДЕ КАССАЦИОННОЙ ИНСТАНЦИИ
- О понятии финансового опциона
- § 2. Понятие и функции нотариата
- ГРИБОВСКАЯ Наталья Юрьевна. ЛЕКСИКА ТВЕРСКИХ ГОВОРОВ, ХАРАКТЕРИЗУЮЩАЯ ЧЕЛОВЕКА (СЕМАНТИКО-МОТИВАЦИОННЫЙ АСПЕКТ). Автореферат диссертации на соискание ученой степени кандидата филологических наук. Тверь - 2019, 2019
- 26. Возникновение гражданских правоотношений не предусмотренных в ГК