Графические или визуальные языки проектирования и программирования уже прочно вошли в «арсенал» средств инженеров-разработчиков и проектировщиков программного обеспечения (ПО), в том числе и мультиверсионного программного обеспечения. Для графических языков разработаны свои среды разработки, отладчики, трансляторы [6, 8].
На сегодняшний день уже решено множество прикладных задач в области программного обеспечения [1, 7]. Причем прикладные задачи зачастую решаются с помощью уже готовых, известных алгоритмов, которые требуется лишь модифицировать для применения их при реализации конкретной задачи [1, 6]. В условиях постоянно растущего темпа жизни, развития новых технологий, увеличения потребностей общества и каждого человека в частности возрастает и потребность в качественном программном обеспечении для удовлетворения нужд пользователей. Скорость создания ПО приходится также постоянно увеличивать за счет использования современных методов и средств проектирования и разработки программного обеспечения [2, 6].
В современной программной инженерии существует практика разработки предметно-ориентированных языков программирования для решения конкретных практических задач и описания объектов предметной области решаемой задачи. Причем для разработки сложных предметно-ориентированных языков применяются специализированные инструменты [6]. Для описания программных алгоритмов были разработаны и широко применяются такие визуальные языки, как блок-схемы и UML-диаграммы деятельности. При этом нет полноценного прикладного унифицированного предметно-ориентированного символьного (текстового) языка для описания программных алгоритмов, кроме учебного алгоритмического языка, предложенного в [4]. Он, как видно из названия, является учебным и был создан для обучения учащихся средних школ основам информатики, а не для практического применения при разработке программного обеспечения.
Наличие языка, нацеленного на практическое применение, позволит унифицировать представление программных алгоритмов, созданных с помощью различных графических языков, с применением их различных нотаций. Это даст возможность использования одного программного средства для генерации кода описанного алгоритма на целевом языке программирования, вместо необходимости в подборе под конкретный тип диаграммы своего инструментария кодогенерации. В свою очередь, эта возможность позволит значительно ускорить разработку ПО, и особенно мультиверсионного ПО так как на его создание затрачиваются значительные средства при разработке различных версий программных модулей, которые должны отличаться друг от друга способом реализации, например алгоритмом, используемым для решения конкретной задачи.
Предметно-ориентированный язык описания алгоритмов
В качестве графического языка, на основании представления которого будет производиться генерация кода на предметно-ориентированном языке, для записи программного алгоритма на первом этапе разработки были выбраны блок-схемы алгоритмов. Данный выбор был обусловлен применением ГОСТ 19.701-90 для стандартизации условных обозначений [3], что является важным аспектом для устранения неоднозначности понимания и начертания элементов блок-схемы.
К промежуточному представлению программного алгоритма на предметно-ориентированном языке предъявляются следующие требования:
1) простота для понимания человека;
2) хорошая формализация;
3) четкая структурированность;
4) легкость создания программного алгоритма на основе графического представления.
В качестве промежуточного представления программного алгоритма было выбрано представление алгоритма на XML, так как представление данных в XML-формате отвечает всем вышеуказанным требованиям.
Каждой фигуре, представленной в [3], ставится в соответствие элемент (тег) с ее названием, переведенным на английский язык. В зависимости от свойств графического элемента каждый тег может иметь определенный набор атрибутов и/или определенное количество наследников (вложенных в него тегов). На основе данных положений был создан предметно-ориентированный язык промежуточного представления программных алгоритмов на базе XML.
Промежуточное представление программного алгоритма, созданное с помощью специальных программных средств на основе блок-схемы, сложно использовать непосредственно для генерации кода на целевом языке. Поэтому XML-представление разбивается на последовательность строк, или лексем. Множество лексем разбивается на непересекающиеся подмножества (лексические классы) [5, 8].
Транслятор предметно-ориентированного языка использует традиционную схему взаимодействия синтаксического и лексического анализаторов, когда синтаксический анализатор обращается к лексическому за очередной лексемой. Задача синтаксического анализа заключается в построении синтаксической структуры XML-документа для последующей генерации на ее основе программного кода на целевом языке программирования. Построение синтаксической структуры документа осуществляется путем нахождения порождения (если таковое существует) конкретной языковой конструкции, для чего применяется заданная грамматика языка. Более наглядно процесс создания кода на целевом языке программирования на основе блок-схемы алгоритма приведен на рис. 1. Для упрощения на рис. 1 не показано взаимодействие с окружением транслятора.
Практический пример кодогенерации
В качестве примера представлена генерация кода программы на языке Cи для нахождения экстремума с помощью одного из методов оптимизации – метода равномерного поиска. Блок-схема, на основании которой производится генерация кода, представлена на рис. 2. Можно отметить, что на рис. 2 приведена укрупненная блок-схема алгоритма.
На основе блок-схемы (рис. 2) создается промежуточное XML-представление на предметно-ориентированном языке, которое приведено в листинге 1. В листинге 2 представлен код программы на целевом языке программирования Cи.
Из приведенного примера видно, что промежуточный код на предметно-ориентированном языке прост и понятен как для человека, так и для автоматизированных средств разбора, благодаря его формализованности и структурированности.
Рис. 1. Блок-схема процесса автоматизированной кодогенерации
Рис. 2. Блок-схема алгоритма равномерного поиска
Полученный в результате исходный код программы на целевом языке программирования, в данном случае на языке Cи, также приводится в удобочитаемом виде, что позволяет при необходимости с легкостью его модифицировать.
Заключение
На текущий момент существует ряд генераторов кода на различных целевых языках программирования, как на основе блок-схем, так и UML-диаграмм различного вида. Отличительной особенностью предлагаемого в статье подхода является концепция двухфазной генерации программного кода на целевом языке программирования с использованием промежуточного представления на предметно-ориентированном языке описания алгоритмов. Такой подход дает возможность полного контроля процесса кодогенерации, а также позволяет генерировать по одному алгоритму код одновременно на нескольких целевых языках программирования. Данная концепция может быть применена при создании мультиверсионного программного обеспечения с целью диверсификации версий модулей, как на уровне алгоритмов, так и языков реализации.
Листинг 1. XML-представление алгоритма равномерного поиска
Листинг 2. Программный код исходного алгоритма на целевом языке C
Исследование выполнено при финансовой поддержке РФФИ в рамках научного проекта № 16-57-46016 СТ_а.
Библиографическая ссылка
Грузенкин Д.В., Царев Р.Ю., Кузнецов А.С. МОДЕЛЬ ДВУХФАЗНОЙ ТРАНСЛЯЦИИ КОДА МУЛЬТИВЕРСИЙ ПРОГРАММНЫХ МОДУЛЕЙ // Фундаментальные исследования. 2015. № 12-5. С. 886-890;URL: https://fundamental-research.ru/ru/article/view?id=39645 (дата обращения: 21.03.2025).