<<
>>

Генерация программного кода

Метод разработан для объектно-ориентированных языков, но может быть расширен и для других языков. Однако это расширение выходит за рамки данного исследования.

В отличие от таких инструментов, как 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

Еще по теме Генерация программного кода:

  1. Особенности программной реализации имитационного моделирования коммутационного устройства
  2. Лукин Михаил Андреевич. Верификация автоматных программ. Диссертация на соискание ученой степени кандидата технических наук. Санкт-Петербург - 2014, 2014
  3. ИССЛЕДОВАНИЕ ХАРАКТЕРИСТИК КОММУТАЦИОННОГО УСТРОЙСТВА С ПАРАЛЛЕЛЬНО-КОНВЕЙЕРНОЙ ДИСПЕТЧЕРИЗАЦИЕЙ ПАКЕТОВ
  4. Требования к функциональным блокам коммутационного устройства
  5. Некоторые вопросы реформирования административного правосудия в Кыргызской Республике
  6. Тема: ПРОИЗВОДСТВО В СУДЕ КАССАЦИОННОЙ ИНСТАНЦИИ
  7. О понятии финансового опциона
  8. § 2. Понятие и функции нотариата
  9. ГРИБОВСКАЯ Наталья Юрьевна. ЛЕКСИКА ТВЕРСКИХ ГОВОРОВ, ХАРАКТЕРИЗУЮЩАЯ ЧЕЛОВЕКА (СЕМАНТИКО-МОТИВАЦИОННЫЙ АСПЕКТ). Автореферат диссертации на соискание ученой степени кандидата филологических наук. Тверь - 2019, 2019
  10. 26. Возникновение гражданских правоотношений не предусмотренных в ГК