В компьютерном программировании , функция-ориентированное программирование ( ФЛП ) или разработки программного обеспечения функционально ориентированный ( FOSD ) является парадигмой программирования для создания программ в линии программных продуктов (SPLS) и дополнительные программы развития.
История
FOSD возникла из многоуровневых конструкций и уровней абстракции в сетевых протоколах и расширяемых системах баз данных в конце 1980-х годов. [1] Программа представляет собой стопку слоев. Каждый слой добавлял функциональность к ранее составленным слоям, а различные композиции слоев создавали разные программы. Неудивительно, что для выражения таких замыслов требовался компактный язык. Элементарная алгебра соответствовала всем требованиям: каждый слой представлял собой функцию ( преобразование программы ), которая добавляла новый код к существующей программе для создания новой программы, а дизайн программы моделировался выражением, т. Е. Композицией преобразований (слоев). На рисунке слева показано наложение слоев i, j и h (где h находится внизу, а i - вверху). Алгебраические обозначения i (j (h)), i • j • h и i + j + h использовались для выражения этих планов.
Со временем слои были приравнены к функциям, где функция - это приращение функциональности программы. Было признано, что парадигма проектирования и генерации программ является результатом оптимизации реляционных запросов, где программы оценки запросов были определены как выражения реляционной алгебры, а оптимизация запросов - это оптимизация выражений. [2] Линия программных продуктов - это семейство программ, в которых каждая программа определяется уникальным набором функций. С тех пор FOSD превратился в изучение модульности функций, инструментов, анализа и методов проектирования для поддержки создания программ на основе функций.
Второе поколение исследований FOSD было посвящено взаимодействию функций, которое зародилось в телекоммуникациях. Позже появился термин функционально-ориентированное программирование ; [3] эта работа раскрыла взаимодействие между слоями. Взаимодействия требуют адаптации функций при объединении с другими функциями.
Третье поколение исследований было сосредоточено на том факте, что каждая программа имеет несколько представлений (например, исходный код, файлы сборки, документация и т. Д.), И добавление функции в программу должно проработать каждое из ее представлений так, чтобы все они были согласованными. Кроме того, некоторые представления могут быть сгенерированы (или получены) из других. В нижеследующих разделах описывается математика трех последних поколений FOSD, а именно GenVoca , [1] AHEAD , [4] и FOMDD [5] [6] , а также ссылки на линейки продуктов, которые были разработаны с использованием инструментов FOSD. предоставлены. Кроме того , четыре дополнительных результатов , которые применяются ко всем поколениям FOSD являются: FOSD метамоделей , программа кубов FOSD и FOSD особенность взаимодействия.
GenVoca
GenVoca (а контаминация имен Бытия и Авок) [1] является композиционной парадигмой для определения программ продуктовых линеек. Базовые программы - это 0-арные функции или преобразования, называемые значениями :
f - базовая программа с функцией f h - базовая программа с функцией h
а функции - это унарные функции / преобразования, которые уточняют (модифицируют, расширяют, уточняют) программу:
i + x - добавляет функцию i в программу x j + x - добавляет функцию j в программу x
где + обозначает композицию функций. Дизайн программы является именованным выражение, например:
p 1 = j + f - программа p 1 имеет функции j и f p 2 = j + h - программа p 2 имеет функции j и h p 3 = i + j + h - программа p 3 имеет функции i, j и h
Модель GenVoca предметной области или линейки программных продуктов представляет собой набор базовых программ и функций (см. Мета-модели и программные кубы ). Программы (выражения), которые могут быть созданы, определяют линейку продуктов. Оптимизация выражений - это оптимизация разработки программы , а оценка выражений - это создание программы .
- Примечание: GenVoca основана на поэтапной разработке программ: процессе, который подчеркивает простоту дизайна и понятность, которые являются ключом к пониманию программ и автоматизированному построению программ. Рассмотрим программу p 3 выше: она начинается с базовой программы h, затем добавляется функция j (читайте: функциональность функции j добавляется к кодовой базе h), и, наконец, добавляется функция i (читайте: функциональность функции i равна добавлен в кодовую базу j • h).
- Примечание: не все комбинации функций имеют смысл. Модели характеристик (которые могут быть переведены в формулы высказываний) - это графические представления, которые определяют допустимые комбинации функций. [7]
- Примечание: более поздняя формулировка GenVoca симметрична : есть только одна базовая программа, 0 (пустая программа), и все функции являются унарными функциями. Это предполагает интерпретацию, что GenVoca составляет программные структуры путем наложения , идея о том, что сложные структуры составляются путем наложения более простых структур. [8] [9] Еще одна переформулировка GenVoca - это моноид : модель GenVoca - это набор функций с операцией композиции (•); композиция ассоциативна и есть элемент идентичности (а именно 1, функция идентичности). Хотя возможны все композиции, не все они имеют смысл. В этом причина появления функциональных моделей .
Особенности GenVoca первоначально были реализованы с использованием С препроцессором ( #ifdef feature ... #endif
методов). Более продвинутая техника, называемая слоями миксинов , показала связь функций с объектно-ориентированными проектами, основанными на сотрудничестве.
ПРЕДСТОЯЩИЙ
Алгебраические иерархические уравнения для проектирования приложений ( AHEAD ) [4] обобщили GenVoca двумя способами. Сначала он раскрыл внутреннюю структуру значений GenVoca в виде кортежей. Каждая программа имеет несколько представлений, таких как исходный код, документация, байт-код и make-файлы. Значение GenVoca - это кортеж программных представлений. Например, в линейке продуктов синтаксического анализатора базовый синтаксический анализатор f определяется его грамматикой g f , исходным кодом Java s f и документацией d f . Парсер f моделируется кортежем f = [g f , s f , d f ]. Каждое представление программы может иметь подпредставления, и они тоже могут иметь подпредставления рекурсивно. В общем, значение GenVoca - это кортеж вложенных кортежей, которые определяют иерархию представлений для конкретной программы.
Пример. Предположим, что терминальные представления - это файлы. В AHEAD грамматика g f соответствует одному файлу BNF, источник s f соответствует кортежу файлов Java [c 1 … c n ], а документация d f представляет собой кортеж файлов HTML [h 1 … h k ]. Значение GenVoca (вложенные кортежи) можно изобразить в виде ориентированного графа: график для парсера f показан на рисунке справа. Стрелки обозначают проекции, т. Е. Отображения кортежа на один из его компонентов. AHEAD реализует кортежи как файловые каталоги, поэтому f - это каталог, содержащий файл g f и подкаталоги s f и d f . Аналогично, каталог s f содержит файлы c 1 … c n , а каталог df содержит файлы h 1 … h k .
- Примечание. Файлы можно иерархически разложить дальше. Каждый класс Java можно разложить на кортеж из членов и других объявлений классов (например, блоки инициализации и т. Д.). Важная идея здесь в том, что математика AHEAD рекурсивна.
Во-вторых, AHEAD выражает функции в виде вложенных кортежей унарных функций, называемых дельтами . Дельты могут быть уточнениями программы (преобразования, сохраняющими семантику), расширениями ( преобразованиями, расширяющими семантику) или взаимодействиями (преобразованиями, изменяющими семантику). Мы используем нейтральный термин «дельта» для обозначения всех этих возможностей, поскольку каждая из них встречается в FOSD.
Для иллюстрации предположим, что функция j расширяет грамматику на g j (добавлены новые правила и токены), расширяет исходный код наs j (добавляются новые классы и члены, а существующие методы изменяются) и расширяет документацию за счетd j . Набор дельт для признака j моделируется следующим образом: j = [г дж ,s j ,d j ], который мы называем дельта-кортежем . Элементы дельта-кортежей сами могут быть дельта-кортежами. Пример:s j представляет изменения, которые вносятся в каждый класс в s f функцией j, т. е.s j = [c 1 …c n ]. Представления программы вычисляются рекурсивно путем сложения вложенных векторов. Представления для синтаксического анализатора p 2 (чье выражение GenVoca - j + f):
p 2 = j + f - выражение GenVoca знак равног дж , s j , d j ] + [g f , s f , d f ] - подстановка знак равно g j + g f , s j + s f , d j + d f ] - поэлементно составлять кортежи
То есть грамматика p 2 - это базовая грамматика, составленная с его расширением (g j + g f ), источником p 2 является базовый источник, составленный с его расширением (s j + s f ) и т. д. Поскольку элементы дельта-кортежей сами могут быть дельта-кортежами, композиционные рекурсии, например,s j + s f = [c 1 …c n ] + [c 1 … c n ] = [c 1 + c 1 …c n + c n ]. Подводя итог, значения GenVoca - это вложенные кортежи программных артефактов, а функции - это вложенные дельта-кортежи, где + рекурсивно составляет их путем сложения векторов. В этом суть AHEAD.
Представленные выше идеи конкретно раскрывают два принципа FOSD. Принцип единообразия гласит , что все программные артефакты обработаны и изменены таким же образом. (Об этом свидетельствуют приведенные выше дельты для разных типов артефактов). Принцип Масштабируемость утверждает все уровни абстракции обрабатываются равномерно. (Это приводит к иерархическому вложению кортежей выше).
Первоначальной реализацией AHEAD является набор инструментов AHEAD и язык Jak, который демонстрирует как принципы единообразия, так и масштабируемости. К инструментам следующего поколения относятся CIDE [10] и FeatureHouse. [11]
FOMDD
Функционально-ориентированное модельно-ориентированное проектирование ( FOMDD ) [5] [6] объединяет идеи AHEAD с модельно-ориентированным проектированием ( MDD ) (также известным как модельно-ориентированная архитектура ( MDA )). Функции AHEAD фиксируют локальное обновление программных артефактов, когда в программу добавляется функция. Но есть и другие функциональные отношения между программными артефактами, которые выражают производные. Например, связь между грамматикой g f и ее источником s f синтаксического анализатора определяется инструментом компилятора-компилятора, например javacc. Точно так же связь между исходным кодом Java s f и его байт-кодом b f определяется компилятором javac. Коммутирующая диаграмма выражает эти отношения. Объекты - это программные представления, стрелки вниз - это производные, а горизонтальные стрелки - это дельты. На рисунке справа показана диаграмма коммутации для программы p 3 = i + j + h = [g 3 , s 3 , b 3 ].
Фундаментальным свойством диаграммы коммутации является то, что все пути между двумя объектами эквивалентны. Например, один из способов получить байт-код b 3 синтаксического анализатора p 3 (нижний правый объект на рисунке справа) из грамматики g h синтаксического анализатора h (верхний левый объект) состоит в том, чтобы получить байт-код b h и уточнить до b 3. , в то время как другой способ уточняет g h до g 3 , а затем выводит b 3 , где + представляет собой дельта-композицию, а () - функция или приложение инструмента:
b 3 =б j + б я + javacc (javac (g h )) = javac (javacc ( г я + g j + g h ))
Есть возможные пути получения байт-кода b 3 синтаксического анализатора p 3 из грамматики g h синтаксического анализатора h. Каждый путь представляет собой метапрограмму , выполнение которой генерирует целевой объект (b 3 ) из начального объекта (g f ). Существует потенциальная оптимизация: обход каждой стрелки на диаграмме поездок имеет определенную стоимость. Самый дешевый (т. Е. Самый короткий) путь между двумя объектами на диаграмме коммутации - это геодезическая , которая представляет наиболее эффективную метапрограмму, которая производит целевой объект из данного объекта.
- Примечание. «Показатель стоимости» не обязательно должен быть денежным значением; Стоимость может быть измерена во времени производства, пиковых или общих требованиях к памяти, потребляемой мощности или некоторой неформальной метрике, такой как «простота объяснения», или их комбинации (например, многоцелевой оптимизации ). Идея геодезической является общей, и ее следует понимать и ценить в этом более общем контексте.
- Примечание. В геодезической может быть m начальных объектов и n конечных объектов; когда m = 1 и n> 1, это проблема направленного дерева Штейнера , которая является NP-трудной.
Диаграммы коммутации важны по крайней мере по двум причинам: (1) существует возможность оптимизации генерации артефактов (например, геодезических) и (2) они определяют различные способы построения целевого объекта из начального объекта. [5] [12] Путь через диаграмму соответствует цепочке инструментов: для согласованности модели FOMDD необходимо доказать (или продемонстрировать посредством тестирования), что все цепочки инструментов, которые сопоставляют один объект с другим, на самом деле дают эквивалентные результаты. . Если это не так, то либо есть ошибка в одном или нескольких инструментах, либо модель FOMDD неверна.
- Примечание: приведенные выше идеи были вдохновлены теорией категорий . [5] [6]
Приложения
- Сетевые протоколы
- Расширяемые системы баз данных
- Структуры данных
- Распределенный симулятор огневой поддержки армии
- Компилятор производственной системы
- Линия продуктов Graph
- Расширяемые препроцессоры Java
- Веб-портлеты
- Приложения SVG
Смотрите также
- FOSD MetaModels - продуктовые линейки продуктовых линеек.
- FOSD оригами
- Кубики программы FOSD - многомерные продуктовые линейки
- Язык программирования очень высокого уровня
Рекомендации
- ^ a b c «Проектирование и реализация иерархических программных систем с повторно используемыми компонентами» (PDF) .
- ^ «Выбор пути доступа в реляционных базах данных» .
- ^ «Функционально-ориентированное программирование: свежий взгляд на объекты» . Архивировано из оригинала на 2003-08-03 . Проверено 16 декабря 2015 .
- ^ а б «Масштабирование пошагового уточнения» (PDF) .
- ^ а б в г «Разработка на основе модели, ориентированной на функции: пример портлетов» (PDF) .
- ^ а б в Трухильо, Сальвадор; Азанза, Майдер; Диас, Оскар (октябрь 2007 г.). «Генеративное метапрограммирование» . GPCE '07: Материалы 6-й международной конференции по генеративному программированию и компонентной инженерии : 105–114. DOI : 10.1145 / 1289971.1289990 .
- ^ «Модели характеристик, грамматики и формулы высказываний» (PDF) .
- ^ «Алгебра функций и композиции функций» (PDF) .
- ^ «Наложение: независимый от языка подход к составлению программного обеспечения» (PDF) .
- ^ «Гарантия синтаксической корректности для всех вариантов линейки продуктов: независимый от языка подход» (PDF) .
- ^ «FeatureHouse: автоматизированная композиция программного обеспечения, не зависящая от языка» (PDF) .
- ^ «Тестирование программных продуктов с использованием генерации инкрементальных тестов» (PDF) .