В информатике , декларативное программирование является парадигма программирования -a стиль построения структуры и элементов компьютерных программ-, выражающей логика вычисления без описания его потока управления . [1]
Многие языки, которые применяют этот стиль, пытаются минимизировать или устранить побочные эффекты , описывая то, что программа должна выполнить в терминах проблемной области , а не описывать, как это сделать, как последовательность примитивов языка программирования [2] ( как оставить до этого языка реализации ). Это контрастирует с императивным программированием , которое реализует алгоритмы явными шагами. [3]
Декларативное программирование часто рассматривает программы как теории формальной логики и вычисления в качестве вычетов в этом логическом пространстве. Декларативное программирование может значительно упростить написание параллельных программ . [4]
Общие декларативные языки включают языки запросов к базам данных (например, SQL , XQuery ), регулярные выражения , логическое программирование , функциональное программирование и системы управления конфигурацией .
Определение
Декларативное программирование часто определяется как любой стиль программирования, который не является обязательным . Ряд других общих определений пытается дать ему определение, просто противопоставляя его императивному программированию. Например:
- Программа высокого уровня, описывающая, что должны выполнять вычисления.
- Любой язык программирования, в котором отсутствуют побочные эффекты (или, более конкретно, он прозрачен по ссылкам )
- Язык с четким соответствием математической логике . [5]
Эти определения существенно пересекаются.
Декларативное программирование - это не императивный стиль программирования, в котором программы описывают желаемые результаты без явного перечисления команд или шагов, которые должны быть выполнены. Функциональные и логические языки программирования характеризуются декларативным стилем программирования. В языках логического программирования программы состоят из логических операторов, и программа выполняется путем поиска доказательств этих операторов.
В чисто функциональном языке , таком как Haskell , все функции не имеют побочных эффектов , а изменения состояния представлены только как функции, которые преобразуют состояние, которое явно представлено в программе как объект первого класса . Хотя чистые функциональные языки не являются императивными, они часто предоставляют возможность описать действие функции в виде серии шагов. Другие функциональные языки, такие как Lisp , OCaml и Erlang , поддерживают сочетание процедурного и функционального программирования.
Некоторые языки логического программирования, такие как Prolog , и языки запросов к базам данных, такие как SQL, хотя и декларативны в принципе, также поддерживают процедурный стиль программирования.
Подпарадигмы
Декларативное программирование - это общий термин, который включает ряд наиболее известных парадигм программирования .
Ограниченное программирование
Программирование ограничений устанавливает отношения между переменными в форме ограничений, которые определяют свойства целевого решения. Набор ограничений решается путем присвоения значения каждой переменной, чтобы решение соответствовало максимальному количеству ограничений. Программирование с ограничениями часто дополняет другие парадигмы: функциональное, логическое или даже императивное программирование.
Доменные языки
Хорошо известные примеры декларативных предметно-ориентированных языков (DSL) включают язык ввода генератора синтаксического анализатора yacc , QML , язык спецификации сборки Make, язык управления конфигурацией Puppet , регулярные выражения и подмножество SQL (например, запросы SELECT ). Преимущество DSL состоит в том, что они полезны, но при этом не обязательно должны быть полными по Тьюрингу , что упрощает использование чисто декларативного языка.
Многие языки разметки, такие как HTML , MXML , XAML , XSLT или другие языки разметки пользовательского интерфейса , часто являются декларативными. HTML, например, описывает только то, что должно отображаться на веб-странице - он не определяет ни поток управления для визуализации страницы, ни возможные взаимодействия страницы с пользователем.
По состоянию на 2013 год[Обновить]некоторые программные системы [ какие? ] объединяют традиционные языки разметки пользовательского интерфейса (например, HTML) с декларативной разметкой, которая определяет, что (но не как) системы внутреннего сервера должны делать для поддержки объявленного интерфейса. Такие системы, обычно использующие доменное пространство имен XML , могут включать в себя абстракции синтаксиса базы данных SQL или параметризованные вызовы веб-служб с использованием передачи репрезентативного состояния (REST) и SOAP . [ необходима цитата ]
Функциональное программирование
Функциональные языки программирования, такие как Haskell , Scheme и ML, оценивают выражения через приложение-функцию. В отличие от родственной, но более императивной парадигмы процедурного программирования , функциональное программирование уделяет мало внимания явной последовательности. Например, в Scheme порядок оценки многих видов подвыражений не определен или неявен. [6] Напротив, вычисления характеризуются различными видами рекурсивного приложения и композиции функций высшего порядка с явными ссылками на ввод-вывод и данные, появляющиеся редко , а мутации состояний избегаются или инкапсулируются везде, где это возможно.
Гибридные языки
Make-файлы, например, декларативно определяют зависимости [7], но также включают обязательный список действий, которые необходимо предпринять. Точно так же yacc декларативно определяет контекстно-свободную грамматику, но включает фрагменты кода с основного языка, что обычно является обязательным (например, C ).
Логическое программирование
Языки логического программирования, такие как состояние Prolog и отношения запросов. Специфика как эти запросы отвечают до реализации и ее доказательство теорем, но , как правило , принимает форму своего рода объединения . Как и функциональное программирование, многие языки логического программирования допускают побочные эффекты и, как следствие, не являются строго декларативными.
Моделирование
Модели или математические представления физических систем могут быть реализованы в компьютерном коде, который является декларативным. Код содержит ряд уравнений, а не императивных присваиваний, которые описывают («декларируют») поведенческие отношения. Когда модель выражается в этом формализме, компьютер может выполнять алгебраические манипуляции, чтобы наилучшим образом сформулировать алгоритм решения. Математическая причинность обычно накладывается на границы физической системы, в то время как описание поведения самой системы является декларативным или акаузальным. Языки и среды декларативного моделирования включают Analytica , Modelica и Simile . [8]
Смотрите также
- Сравнение парадигм программирования
- Индуктивное программирование
- Список декларативных языков программирования
Рекомендации
- ^ Ллойд, Дж. У., Практические преимущества декларативного программирования
- ^ «декларативный язык» . FOLDOC . 17 мая 2004 . Проверено 26 января 2020 года .
- ^ Себеста, Роберт (2016). Понятия языков программирования . Бостон: Пирсон. ISBN 978-0-13-394302-3. OCLC 896687896 .
- ^ «DAMP 2009: Практикум по декларативным аспектам многоядерного программирования» . Cse.unsw.edu.au. 20 января 2009 . Проверено 15 августа 2013 года .
- ^ Чакраварти, Мануэль MT (14 февраля 1997 г.). О массовом параллельном выполнении декларативных программ (докторская диссертация). Технический университет Берлина . Проверено 26 февраля 2015 года .
В этом контексте критерием для объявления языка программирования является наличие четкого, математически установленного соответствия между языком и математической логикой, так что декларативная семантика языка может быть основана на модели или теории доказательства (или на обоих) логики.
- ^ «Пересмотренный отчет 7 по алгоритмической языковой схеме» (PDF) . Схема рабочей группы 1 . Проверено 5 декабря 2020 .
- ^ [1] Архивировано 23 октября 2007 года в Wayback Machine.
- ^ «Декларативное моделирование» . Симулистика . Проверено 15 августа 2013 года .
Внешние ссылки
- Франс Коенен. Характеристики декларативных языков программирования . 1999 г.
- Роберт Харпер .
- Что, если что, является декларативным языком? . 2013.
- Есть такая вещь, как декларативный язык, и это лучший в мире DSL . 2013.
- Улоф Торгерссон. Заметка о парадигмах декларативного программирования и будущем определяющего программирования . 1996 г.