Функционально-ориентированное программирование или функционально-ориентированная разработка программного обеспечения (FOSD) - это общая парадигма синтеза программ в линейках программных продуктов. Прочтите страницу «Функционально- ориентированное программирование», на которой объясняется, как модель FOSD домена представляет собой кортеж из 0-арных функций (называемых значениями) и набор одномерных (унарных) функций, называемых функциями. На этой странице обсуждаются многомерные обобщения моделей FOSD, которые важны для компактных спецификаций сложных программ.
Оригами
Фундаментальное обобщение метамоделей - оригами . Основная идея состоит в том, что дизайн программы не обязательно должен быть представлен одним выражением; можно использовать несколько выражений. [1] [2] [3] Это предполагает использование нескольких ортогональных моделей GenVoca.
- Пример: пусть T будет моделью инструмента, которая имеет функции P (синтаксический анализ), H (сбор урожая), D (доклет) и J (перевод на Java). P - это значение, а остальные - унарные функции. Инструмент T1, который анализирует файл, написанный на языке диалекта Java, и переводит его в чистую Java, моделируется следующим образом: T1 = J • P. И инструмент, подобный javadoc, T2 анализирует файл на диалекте Java, собирает комментарии и переводит собранные комментарии на страницу HTML: T2 = D • H • P. Таким образом, инструменты T1 и T2 входят в линейку продуктов T.
- Языковая модель L описывает семейство (линейку продуктов) диалектов Java. Он включает в себя функции: B (Java 1.4), G (дженерики), S (конечные автоматы). B - это значение, а остальные - унарные функции. Итак, диалект языка Java L1, который имеет обобщенные шаблоны (например, Java 1.5), выглядит так: L1 = G • B. И диалект Java L2, который имеет языковую поддержку для конечных автоматов: L2 = S • B. Таким образом, диалекты L1 и L2 входят в линейку продуктов L.
- Для описания инструмента, подобного javadoc (E) для диалекта Java с конечными автоматами, требуются два выражения: одно, которое определяет функциональность инструмента для E (с использованием модели T) и его диалект Java (с использованием модели L):
E = D • H • P - уравнение инструмента E = S • B - языковое уравнение
- Модели L и T являются ортогональными моделями GenVoca: одна выражает функциональную структуру инструмента E, а другая - функциональную структуру его входного языка. Обратите внимание, что модели T и L действительно абстрактны в следующем смысле: реализация любой функции T действительно зависит от диалекта инструмента (выраженного L), и (симметрично) реализация любой функции L действительно зависит от функциональности инструмента. (выражено T). Таким образом, единственный способ реализовать E - это знать уравнения T и L.
Пусть U = [U 1 , U 2 , ..., U n ] будет моделью GenVoca из n функций, а W = [W 1 , ... W m ] будет моделью GenVoca из m функций. Связь между двумя ортогональными моделями U и W представляет собой матрицу UW, называемую матрицей Оригами , где каждая строка соответствует функции в U, а каждый столбец соответствует функции в W. Запись UW ij - это функция, которая реализует комбинацию функций. U i и W j .
- Примечание: UW - это тензорное произведение U и W (т. Е. UW = U × W).
- Пример. Напомним модели T = [P, H, D, J] и L = [B, G, S]. Оригами матрица TL - это:
- где PB - это значение, реализующее синтаксический анализатор для Java, PG - это унарная функция, которая расширяет синтаксический анализатор Java для синтаксического анализа обобщений, а PS - это унарная функция, которая расширяет синтаксический анализатор Java для анализа спецификаций конечного автомата. HB - это унарная функция, которая реализует сборщик комментариев к Java-коду. HG - это унарная функция, которая реализует сборщик комментариев к общему коду, а HS - это унарная функция, которая реализует сборщик комментариев к спецификациям конечного автомата и так далее.
Чтобы увидеть, как несколько уравнений используются для синтеза программы, снова рассмотрим модели U и W. Программа F описывается двумя уравнениями, по одному на модель. Мы можем написать уравнение для F двумя разными способами: ссылаться на объекты по имени или по их позиции в индексе, например:
—U выражение F —W выражение F
Модель UW определяет, как реализуются модели U и W. Синтезирующая программа F включает в себя проектирование UW ненужных столбцов и строк и агрегирование (также известное как тензорное сжатие ):
Фундаментальное свойство матриц оригами, называемое ортогональностью , заключается в том, что порядок сокращения размеров не имеет значения. В приведенном выше уравнении суммирование сначала по измерению U (индекс i) или по измерению W (индекс j) не имеет значения. Конечно, ортогональность - это свойство, которое необходимо проверить. Были разработаны эффективные (линейные) алгоритмы для проверки ортогональности матриц оригами (или тензоров / n-мерных массивов). [4] Значение ортогональности - это согласованность взглядов. Агрегирование (заключение контрактов) по определенному измерению предлагает «обзор» программы. Различные представления должны быть согласованными: если кто-то исправляет код программы в одном представлении (или доказывает свойства программы в одном представлении), правильность этих исправлений или свойств должна сохраняться во всех представлениях.
В общем, продукт линейки продуктов может быть представлен n выражениями из n ортогональных и абстрактных моделей GenVoca G 1 ... G n . Матрица оригами (куб или тензор) представляет собой n-мерный массив A:
Продукт H этой линейки продуктов формируется путем удаления ненужных строк, столбцов и т. Д. Из A и агрегирования (сжатия) n-куба в скаляр:
- Пример. Вспомните программу E и модель T = [P, H, D, J]. E = D • H • P = T 2 • T 1 • T 0 . Аналогично, представление E в модели L = [B, G, S] выглядит следующим образом: E = S • B = L 2 • L 0 . Синтез E для данной модели Оригами TL вычисляет следующее выражение: .
Приложения
Есть несколько приложений линейки продуктов, разработанных с использованием Origami. Среди них:
- Набор инструментов AHEAD и расширяемые препроцессоры Java
- Проблема выражения или проблема расширяемости
- Уточнения и многомерное разделение проблем
Будет предоставлено больше приложений.
Смотрите также
- Функционально-ориентированное программирование
- Метамодели FOSD
- Взаимодействие с функциями FOSD