Cloud of Science. 2016. T. 3. № 1 http:/ / cloudofscience.ru ISSN 2409-031X
Проблемно-ориентированный подход к пользовательскому программированию
А. В. Пруцков, Д. М. Цыбулько
Рязанский государственный радиотехнический университет 390005, Рязань, ул. Гагарина, 59/1
e-mail: [email protected]
Аннотация. Широкое распространение микропроцессорных устройств сделало актуальным разработку новых подходов к программированию. В отличие от существующих новый подход должен быть простым в освоении для любого пользователя-непрограммиста и проблемно-ориентированным. Авторами статьи предлагается концепция проблемно-ориентированного объектного программирования (ПООП). Согласно этой концепции, программа представляет собой последовательность объектов, передающих друг другу управление. Объекты являются действиями в решении задачи и имеют одинаковую структуру. Написание программы заключается в выборе типов объектов, задании их параметров и последовательности их выполнения. ПООП также представляет собой язык представления с графическим представлением. Ключевые слова: программирование, парадигмы программирования, проблемно-ориентированное объектное программирование.
1. Введение
Пользовательским программированием будем называть подход к программированию, при котором описание решения задачи командами выполняется конечным пользователем, который нуждается в решении этой задачи, а не программистом (разработчиком). Для упрощения описания пользователь оперирует около 510 командами, специфичными для решения этой задачи. Данный подход позволяет пользователю самостоятельно менять способ решения задачи, не прибегая к помощи программиста.
Написание программного обеспечения осуществляется в рамках определенных концепций программирования. В настоящее время существует несколько различных концепций: структурное, объектно-ориентированное, логическое, функциональное и другие. Наибольшее распространение получило объектно-ориентированное, которое возникло в 70-е гг. решить поставленную проблему, была предложена идея преобразования постулата фон Неймана: «данные и программы неразличимы в памяти машины» [1]. В основу данной концепции легли три основополагающих принципа: наследование, инкапсуляция и полиморфизм. Подход,
построенный на этих принципах, стал называться объектно-ориентированным программированием (ООП).
ООП является универсальным подходом к описанию решения задачи в виде унифицированных структур данных. Основная цель появления ООП — сокращение дублирования кода. При использовании этого подхода программист должен владеть определенным уровнем знаний и навыков. Прежде всего необходимо понимать базовые понятия, такие как классы, объекты, наследование, динамическое связывание, абстрактные типы данных и т. д. Изучение основных принципов ООП может потребовать значительное количество времени. Но наибольшую трудность представляет проектирование классов. Эта задача куда более сложная, чем их использование. Для решения данной проблемы специалист должен обладать соответствующим практическим опытом, зачастую довольно значительным. Вся сложность организации структуры программы с использованием ООП ложится на разработчика. От того, насколько грамотно она организована, зависит в том числе и скорость выполнения программы. Оптимальная объектная модель позволяет сделать программное обеспечение более масштабируемым и гибким. Однако качество данной разрабатываемой модели напрямую зависит от квалификации специалиста, который будет создавать программный продукт.
ООП — это универсальная концепция программирования. Однако программное решение задач с помощью ООП в некоторых специфичных предметных областях оказывается сложным для восприятия специалистами в этих областях. Для решения данной проблемы используются предметно-ориентированные языки (Domain Specific Language, DSL), которые разрабатываются для конкретной предметной области с учетом мнения специалистов в этих областях. «Однако их недостатком является сложность разработки самих языков: нужно не только описать сам язык, но и реализовать соответствующую среду разработки, транслятор или интерпретатор для этого языка» [2]. Существующий языковой инструментарий (language workbenches) не решает эту проблему полностью.
Концепция функционального программирования [3] появилась в XX в. В 2000-х гг. после некоторого затишья эта концепция получила новое применение в виде лямбда-выражений в современных объектно-ориентированных языках C# и Java. Функциональное программирование оперирует одним основным понятием — функцией. При этом как аргументами, так и результатом функции могут быть другие функции. Решение задачи в рамках этой концепции представляет собой выражение, состоящее из вызовов функций, а выполнение программы — вычисление этого выражения. Кроме чисел функции могут оперировать списками. Для организации циклов используются рекурсивные функции. Ограничением этого подхода (а
С1оий о/Баеисе. 2016. Т. 3. № 1
также некоторых других, например, логического программирования [4]) является то, что решение не любой задачи можно представить в виде вызовов функций.
Одним из видов методов теоретического программирования является агентно-ориентированное программирование. Согласно этому подходу «агент - это самодостаточная программа, способная управлять своими действиями в информационной среде функционирования для получения результатов выполнения поставленной задачи и изменения текущего состояния среды, то есть агент решает задачи, достигая заданных целей путем выполнения программы и изменения состояния среды» [5]. Агенты взаимодействуют не только со средой, но и между собой для решения своих задач. Агентно-ориентированное программирование базируется на ООП. Основной элемент рассматриваемой концепции — агент наделяется способностями и убеждениями, т. е. что может делать и ради чего действует агент.
В настоящий момент популярны и другие концепции программирования, подробный обзор которых приведен в [5].
С появлением большого числа потребительских микропроцессорных устройств и управляющих ими операционных систем и программ обострилась проблема разработки упрощенного языка программирования, который позволил бы любому пользователю быстро освоить программирование для решения ограниченного круга задач. Существующие подходы не решают эту проблему.
Целью статьи является изложение и обоснование необходимости новой концепции программирования, а также определение перспективных областей его применения.
2. Проблемные и предметные области, их объекты
Программа — это описание взаимодействия между данными и командами (инструкциями). Баланс между данными и командами в программе может быть различным. В программах, предназначенных для обработки конкретных экземпляров сущностей (наборов данных) некоторой предметной области, баланс смещен в сторону данных. В программах, реализующих сложные алгоритмы с минимальным объемом данных, баланс смещен в сторону команд.
Однако команды и данные не могут существовать изолированно друг от друга. Данные полезны, только если их можно обработать. На порядок выполнения команд влияют входные или промежуточные (полученные в процессе работы программы) данные. Результатом выполнения команд также являются данные (на этот раз выходные).
Данные описывают предметы в исследуемой области. Поэтому эта область называется предметной. Однако говорить об алгоритмах из определенной предметной области, по мнению авторов, не корректно. Любая исследуемая область харак-
теризуется двумя классами ее составляющих: предметами, которые в ней существуют, и проблемами, которые в ней необходимо решать. Поэтому если больший интерес представляют алгоритмы, а не данные, то стоит говорить о проблемной области. Таким образом, любая исследуемая область в зависимости от аспекта рассмотрения может рассматриваться или как предметная область, или как проблемная область.
Объектом предметной области является сущность, описываемая набором данных. Например, сущность «Статья» характеризуется названием, выходными данными, тематикой, ключевыми словами, объемом и другими. Объект проблемной области — это команда, которую необходимо выполнить, для приближения к решению проблемы. Тогда решение проблемы можно представить как последовательность выполнения команд. Поток решения (command flow) может иметь несколько ветвлений. Какая ветвь будет использована для решения задачи определяется в процессе выполнения команды в зависимости от актуальных значений данных. Поэтому команды должны иметь параметры — значения данных, влияющих на результат их выполнения.
Вышеизложенные рассуждения позволяют нам сформулировать определения основных понятий, необходимых для дальнейшего изложения.
Проблемная область — исследуемая область с точки зрения рассматриваемых в ней проблем (задач).
Проблемно-ориентированный подход — подход, рассматривающий исследуемую область как проблемную, и, следовательно, ориентированный на разработку, описание и исследование алгоритмов решения проблем этой области.
Объекты проблемной области — команды, являющиеся этапами решения проблемы.
3. Понятие проблемно-ориентированного объектного программирования
Изложим предлагаемую концепцию программирования.
Как правило, для решения конкретных задач пользователи используют 5-10 различных команд. Используя базовые операции языков программирования высокого уровня, можно сгруппировать атомарные операторы в блоки, из которых пользователь сможет составить решение задачи. В результате пользователю предоставляется язык с ограниченным числом команд для решения данной задачи. Это позволит пользователю быстро решать проблемы в конкретной предметной области. Такая концепция к решению задач получил название «проблемно-ориентированное объектное программирование» (ПООП) [6].
Cloud of Science. 2016. Т. 3. № 1
Согласно этой концепции, любое действие описывается объектом, который состоит из двух основных частей: скрытой и открытой. Скрытая часть реализует действия и проверку условий передачи управления следующему объекту и недоступна пользователю. Открытая включает следующие секции:
- поля (параметры, использующиеся при выполнении действий объектом);
- секцию инициализации, содержащую команды, выполняемые при получении объектом управления;
- секцию условий, содержащую команды передачи глобальных данных и управления другим объектам в зависимости от исходных условий.
Пользователь может задавать различные параметры в этих секциях, которые необходимы для решения задачи.
Объекты обмениваются глобальными данными через особую область памяти, которая может быть организована как стек, очередь или память с прямым доступом (массив). Обращения к ней осуществляются из секции инициализации или секции условий.
Таким образом, программа на языке ПООП представляет собой разветвляющуюся структуру и сводится к совокупности объектов, передающих друг другу глобальные данные и управление.
Объект ПООП можно описать с помощью правил формальной грамматики:
объект = идентификатор «=» тип «{» {параметр} условие_перехода {условие_перехода} «}». параметр = идентификатор «:» (символ | цифра {символ | цифра})«;». условие_перехода = if(параметр | «_nocondition») «call» идентификатор «;».
Полное изложение формальной грамматики языка ПООП приведено в [7].
Действие, выполняемое объектом, его параметры и количество выходов для передачи управления определяются типом объекта.
4. Применение проблемно-ориентированного объектного программирования для решение задач в проблемных областях
В качестве примера приведем описание некоторых объектов для описания теста: Q — показать вопрос (рис. 1); T — показать пояснение (рис. 2); R — показать результат (рис. 3).
Объект Q1 показывает вопрос и варианты ответов. В случае правильного ответа передача управления переходит объекту Q2, иначе управление переходит в T1 —
показать пояснение. После того, как были даны ответы на все вопросы, управление передается объекту R1 — показать итоговый результат.
Q1 = Question
{
// секция данных Question: "Текст вопроса
1"
Optionl: "Вариант 1" Option2: "Вариант 2" Option3: "Вариант 3" Option4: "Вариант 4" Correct: Optionl // секция условий if yes
call Q2;
if no
call Tl;
}
Рисунок 1. Пример объектов для описания текста: Q — показать вопрос
Tl = Tip
{
Text: "Текст пояснения"; ifnocondition call Q2;
}
Рисунок 2. Пример объектов для описания текста: Т — показать пояснение
R1 = Result
{
ifnocondition end;
}
Q1
Question = "Текст вопроса 1"
Optionl = ' 'Вариант 1"
Option2 = ' 'Вариант 2"
Option3 = ' 'Вариант 3"
Option4 = ' 'Вариант 4"
Correct = Optionl
True False
NoCondition
R1
End
Рисунок 3. Пример объектов для описания текста: Я — показать результат
С1оий о/Баеисе. 2016. Т. 3. № 1
Объекты программы ПООП можно представить и графически. Поэтому решение задач можно программировать в визуальном редакторе. Описанные программы на языке ПООП можно графически представить рис. 4.
Рисунок 4. Графическое представление ПООП
Для сокращения избыточности кода в ПООП реализован подход, основанный на самоподобии объектов. Самоподобие заключается в том, что любую последовательность объектов пользователь может представить одним составным объектом.
Одной из предметных областей, в которой возможно использование ПООП, является область «Проверка знаний как один из этапов обучения», в которой необходимо описание сценариев автоматизированного обучения [6]. Пусть существует несколько простых действий: «показать текстовый материал», «показать изображение», «показать ролик» и т. д. Они являются однотипными, и из них можно реализовать объект «провести обучающий урок». Для проверки знаний необходима реализация объектов «задать вопрос», «показать подсказку», «показать правильный ответ», «показать результат». Из них можно составить сценарий более высокого уровня «провести тестирование». Использование самоподобия позволяет избежать дублирования кода и повторно использовать уже существующие элементы в соста-
ве объектов более высокого уровня, что значительно сокращает время разработки программы. Более того, специалисту нет необходимости вникать в механизм реализации объекта, ему достаточно лишь знать, какую функцию он выполняет и структуру его секций. Например, в [8] показано, как с помощью ПООП можно описать элементы структурного программирования. Комбинируя их, можно получить объекты, выполняющие операции, аналогичные таким операциям, как условие, цикл с предусловием, цикл с постусловием, цикл с параметром. Это позволяет создавать сценарии, подобные методам в языках ООП и функциям структурного программирования. Применение данных объектов дает возможность использовать ПООП в различных сферах и предметных областях, где требуются сложные алгоритмы работы.
5. Порядок разработки типов объектов для программ на языке проблемно-ориентированного объектного программирования
Как и разработка любой программной системы, разработка объектов для программ ПООП заключается в выявлении вместе с заказчиком следующих характеристик:
- цели программной системы;
- основные решаемые задачи с помощью системы;
- построение алгоритмов решения этих задач;
- составление списка атомарных (первичных, неделимых) команд, используемых в алгоритмах.
После этого разрабатывают программно-атомарные команды, оформляют их в объекты, продумывают и реализуют обмен данными между объектами.
После тестирования и пробной эксплуатации, программная система, позволяющая составлять программы с использованием разработанных объектов, передается заказчику.
6. Заключение
Несмотря на широкую функциональность механизма ООП, работа с этой парадигмой не всегда легка и удобна, особенно для неподготовленного пользователя, не имеющего специальных навыков программирования.
Предложена концепция ПООП, которая позволяет обычному пользователю сосредоточиться на командах, необходимых для решения основной задачи, а не углубляться в изучение особенностей этой концепции и основанного на ней языка программирования. Обоснована необходимость разработки данного подхода.
Cloud of Science. 2016. Т. 3. № 1
Литература
[1] Камаев В. А., Костерин. В. В. Технологии программирования : учебник. — 2-е изд., пе-рераб. и доп. — М. : Высш. шк., 2006.
[2] Лядова Л. Н. Многоуровневые модели и языки DSL как основа создания интеллектуальных CASE-систем // Труды Междунар. науч.-техн. конф. «Интеллектуальные системы» (AIS'08) и «Интеллектуальные САПР» (CAD-2008). 2008. Т. 2. C. 37-41.
[3] Городняя Л. В. Основы функционального программирования. Курс лекций. — М. : Интернет-университет информационных технологий, 2004.
[4] Цуканова Н. И., Дмитриева Т. А. Логическое программирование на языке Visual Prolog : учеб. пособ. для вузов. — 2-е изд., стереотип. — М. : Горячая линия-Телеком, 2014.
[5] Лаврищева Е. М. Современные методы программирования: возможности и инструменты // Проблеми програмування. 2006. № 2-3. С. 60-74.
[6] Пруцков А. В., Цыбулько Д. М. Проблемно-ориентированное объектное программирование // ВестникРГРТУ. 2013. № 3 (45). С. 57-62.
[7] Цыбулько Д. М. Формальная грамматика языка проблемно-ориентированного объектного программирования // Студенческое научное сообщество: исследования и инновации — 2015: материалы международного академического форума. — Семей : Казахский гуманитарно-юридический инновационный ун-т, 2015. C. 117-119.
[8] Пруцков А. В., Цыбулько Д. М. Применение проблемно-ориентированного объектного программирования для описания порядка работы интеллектуальных и информационных систем // Вестник РГРТУ. 2014. № 47. С. 92-96.
Авторы:
Александр Викторович Пруцков — кандидат технических наук, доцент, доцент кафедры вычислительной и прикладной математики, Рязанский государственный радиотехнический
университет
Дмитрий Михайлович Цыбулько — аспирант кафедры вычислительной и прикладной математики, Рязанский государственный радиотехнический университет
Problem-Oriented Approach to the End-user Programming
A.V. Prutzkow, D.M. Tsybulko
**Ryazan State Radio Engineering University Gagarin Str., 59/1, Ryazan, Russian Federation, 390005
e-mail: [email protected]
Abstract. Widespread microprocessor device using requires a new programming approach. The programming approach should be simple for an ordinary device user and problem-driven. So we propose a new programming concept for easy code writing by any non-programmer. We named it the Problem-Driven Object Programming or PDOP. According to the concept, program is a control flow by program objects. Every object is an action for a problem solvation and has the same structure. The object structure is defined by formal grammar rules. During code writing, the user programs a control flow and sets type and parameters of the object. The PDOP is also a simplified programming language with user-friendly graphical representation. Keywords: programming, programming approaches, problem-driven object programming.
Referenses
[1] Kamaev V. A., Kosterin. V. V. (2006) Tehnologii programmirovanija: uchebnik. Vyssh. shk. [In Rus]
[2] Lyadova L. N. (2008) Mnogourovnevye modeli i jazyki DSL kak osnova sozdanija intellektual'nyh CASE-sistem. In Inern conf. AIS'08 and CAD-2008), vol. 2, pp. 37-41. [In Rus]
[3] Gorodnjaja L. V.(2004) Osnovy funkcional'nogo programmirovanija. Internet-universitet infor-macionnyh tehnologij. [In Rus]
[4] Cukanova N. I., Dmitrieva T. A. (2014) Logicheskoe programmirovanie na jazyke Visual Prolog. Gor-jachaja linija-Telekom. [In Rus]
[5] Lavrishheva E. M. (2006) Problemiprogramuvannja, 2-3:60-74. [In Rus]
[6] Prutzkow A. V., Tsybulko D. M. (2013) VestnikRGRTU, 45:57-62. [In Rus]
[7] Tsybulko D. M. (2015) Formal'naja grammatika jazyka problemno-orientirovannogo ob#ektnogo programmirovanija. Intern. Conf. Studencheskoe nauchnoe soobshhestvo: issledovanija i innovacii — 2015. Semej, pp. 117-119. [In Rus]
[8] Prutzkow A. V., Tsybulko D. M. (2014) Vestnik RGRTU, 47:92-96. [In Rus]