На технологію розробки програмного забезпечення (software engineering) зазвичай покладаються великі надії. Вважається, що вона повинна вирішувати задачі високої складності, давати високу продуктивність і якість, забезпечувати ефективність супроводу та розвитку програм. Нажаль, у сучасному вигляді технологія розробки програмного забезпечення не виправдовує ці надії. Вона відстає більш ніж на сторіччя від машинобудування. Це більше схоже на споруду котеджів за поодинокими замовленнями, ніж на зрілу інженерію.
Породжуюче програмування (Generative programming) - Це автоматизоване виробництво програмних продуктів з окремих компонентів, подібне триваючому десятиліттями виробництва машин, електроніки та інших товарів. Перехід до автоматичного виробництва програмного забезпечення вимагає двох кроків. По-перше, необхідно перейти від розробки одиночних систем до розробки сімейства систем. Це дозволить підготувати «правильні» компоненти реалізації. По-друге, потрібно автоматизувати зборку компонентів реалізації за допомогою генераторів [8].
Загальною тенденцією є ускладнення програмних продуктів, пов'язане як зі збільшенням функціональності програм, так і c різними і часто змінюючимися умовами їх експлуатації. У результаті на розробку програми йде істотна частина загальних зусиль. Тому дослідження в області породжуючого програмування, спрямовані на зменшення трудомісткості розробки і супроводу є актуальними [1].
Застосування інтуїтивно зрозумілої, простої і масштабованої технології специфікації SADT дозволить просто створювати або модернізувати програмний продукт.
Застосування шаблонів у програмуванні - звичайна практика, і безліч мов програмування (Наприклад с, с# та інші) мають функції для робіт з шаблонами. Але коли змінні, пiдставляємi у шаблони мають різну структуру (масиви, списки, файли та інші) звичайні шаблони стають безсилими, тому що обробка кожної зі структур даних індивідуальна. Для масиву, наприклад, можна використовувати звичайний перебір у циклі, для матриці вже необхідні вкладені цикли, для дерева - обхід в глибину або в ширину.
Для вирішення цієї проблеми застосовується кілька контейнерів для одного шаблону. Відповідний контейнер вибирається відповідно до типу і структурі вхідних даних, після чого вміст контейнера використовується як звичайний шаблон [4].
Отриманий програмний продукт можна використовувати в навчальних цілях, для демонстрації студентам як міняється алгоритм залежно від типу і структури вхідних даних. Створивши нові блоки діаграм, можна застосувати программу в інших галузях. Наприклад якщо створити блоки, які будуть випадковим чином генерувати дані, можна створити генератор завдань з математики та інших предметів.
Отримані методи дають базу для подальшого розвитку в даному напрямку
Тема генерації коду стає все більш актуальною, оскільки програмні системи стають все більше і програміст просто не в силах написати таку кількість рядків коду. Тоді на допомогу приходять розробнику механізми генерації коду.
У Донецькому національному технічному університеті дослідження і розробки в області генерації програмного коду представлені працями викладачів і їх школи:
Крім ДонНТУ, дослідженнями в області генерації програмного коду займаються в Донецькому державному університеті інформатики і штучного інтелекту.
Породжує програмування для України в цілому є розвиваючимся напрямком наукової діяльності, на відміну від Росії, де дослідженням в області генерації коду присвячено безліч робіт Акімова С.В., Наганова М.В., Галочкина М.П., Падалки Д.В. і їх шкіл. У якості огляду напрямків застосування генерації коду можна вказати результати пошуку за ключевими фразами на сайті http://www.lib.ua-ru.net - електронному каталозі російських і українських дисертацій.
У світовій практиці активно проводяться дослідження та розробки в галузі генерації програмного коду для вирішення різних завдань. У якості огляду можна вказати результати пошуку за ключовою фразою "generative programming" на наступних сайтах-каталогах наукових публікацій:
Мова специфікацій - формальна мова, призначена для декларативного опису структури, зв'язків, властивостей даних і способів їх перетворень, (на відміну від активних мов) без явного згадування порядку виконуваних дій і використання конкретних значень даних.
На відміну від мов програмування, використовуваних при реалізації комп'ютерних програм, мови специфікацій застосовуються для проведення системного аналізу, аналізу вимог і розробки архітектури створюваних програмних систем.
Різні мови специфікацій використовуються для опису структури інформаційної системи, моделей предметної області та інших завдань, пов'язаних з розробкою ПЗ та БД і можуть мати як текстовий, так і бінарний формат, а також графічне представлення конструкцій мови. Застосовуються вони також для опису інтерфейсу, шаблонів звітів, перетворення документів, а також в якості форматів передачі даних між додатками в розподілених інформаційних системах. Ще одне застосування мов специфікації - опис структур баз даних, а саме - декларативна частина SQL звичайно називається Data Definition Language (DDL).
Результатом магістерської роботи повинна бути методологія, що дає інструкції для генерації коду за специфікацією SADT і методи оцінки ефективності отриманих алгоритмів.
Методологія генерації коду полягає у виділенні інваріантів алгоритмів і побудові шаблонів на базі отриманих інваріантів. Інваріант або інваріантність - термін, що позначає щось незмінне. Властивість симетрії тісно пов'язано з поняттям інваріантності. Згідно Г. Вейлю об'єкт є симетричним, якщо після застосування до нього певної операції він залишається таким же, як до операції. Такий об'єкт вважається інваріантним щодо даної операції, а сама операція називається операцією симетрії об'єкта. Легко показати, що багато всіх операцій симетрії утворюють групу, тому до дослідження симетрії залучається апарат теорії груп. Основним об'єктом тут є група перетворень G = {g} - множина всих перетворень g, замкнутий щодо композиції перетворень, що включає зворотні g-1 і тотожне перетворення e.
Розглянемо виділення інваріантів і подальшу генерацію нових алгоритмів на їх основі. Спробуємо виділити інваріанти для базового алгоритму пошуку максимуму серед негативних. Для цього розглянемо реалізацію даного алгоритму для різних типів і структур вхідних даних, а саме для масиву, текстового файлу та списку (рисунок 1). Проаналізувавши алгоритми можна помітити що деякі частини є однаковими для всіх типів і структур даних. На початку кожного алгоритму прапорець f скидається в 0; при знаходженні першого числа, яке задовольняє умові відбору, піднімається прапорець і результат визначається поточним значенням і т.д.
Рисунок 1 — Виділення інваріантів алгоритмів
Тепер розглянемо алгоритми знаходження максимуму серед негативних, знаходження мінімуму і обнулення позитивних елементів для однієї і тієї ж вхідної структури даних і виділимо інваріант щодо методу обробки.
Рисунок 2 — Виділення інваріантів алгоритму щодо методу обробки
Тепер на базі отриманих інваріантів можна отримати новий алгоритм, поєднавши інверсії інваріантів для різних алгоритмів як показано на малюнку 3. Отриману методику можна використовувати для формування контейнерів діаграм SADT.
Рисунок 3 — Отримання нового алгоритму
Отримані алгоритми надалі будуть використовуватися як шаблони для генерації результуючого коду. Шаблони будуть прикріплятися до блоків діаграми. Після зв'язування діаграм, шаблони, що не задовольняють вхідним структурам даних, будуть відкидатися, а з решти шаблонів буде генерувати код програми (анімація 1).
Методика генерація коду з SADT спеціфкаціі
(анімація : обсяг — 106.7 КБ, кількість кадрів — 7, розмір — 605x454)
Отримане рішення дозволяє генерувати код програми з її опису за допомогою SADT діаграм.
У ході вирішення поставлених завдань були розглянуті наступні мови специфікацій:
Складена порівняльна таблиця характеристик розглянутих мов специфікації.
Отримано методи генерації коду з інваріантів алгоритмів. Отримана методика дозволяє генерувати код для вхідних даних різної структури і типу. Методи застосовані в програмному продукті, генеруючому код за специфікацією SADT.
Надалі планується отримати формальний опис методу генерації коду за SADT специфікації.
При написанні даного автореферату, магістерська робота ще не завершена. Остаточне завершення планується на грудень 2010 року. Повний текст роботи може бути отриманий у автора або його керівника після зазначеної дати.