Я искал в Интернете поиски определения декларативного и императивного программирования, которое бы пролило свет на меня. Тем не менее, язык, используемый на некоторых ресурсах, которые я нашел, устарел - например, в Википедии . У кого-нибудь есть реальный пример того, что они могли бы показать мне, что может дать некоторую перспективу к этому вопросу (возможно, в C #)?
541
Ответы:
Отличным примером декларативного и императивного программирования на C # является LINQ.
С императивным программированием, вы сообщаете компилятору, что вы хотите, шаг за шагом.
Например, давайте начнем с этой коллекции и выберем нечетные числа:
С императивным программированием мы должны были пройти через это и решить, чего мы хотим:
Здесь мы говорим:
С другой стороны, при декларативном программировании вы пишете код, который описывает, что вы хотите, но не обязательно, как его получить (объявляйте желаемые результаты, но не пошагово):
Здесь мы говорим «Дайте нам все, где это странно», а не «Пошаговое выполнение коллекции. Проверьте этот элемент, если он нечетный, добавьте его в коллекцию результатов».
Во многих случаях код будет смесью обоих дизайнов, поэтому он не всегда черно-белый.
источник
collection.Where
не использует декларативный синтаксис, который предоставляет Linq - см. msdn.microsoft.com/en-us/library/bb397906.aspx для примеров,from item in collection where item%2 != 0 select item
будет декларативная форма. Вызов функции не становится декларативным программированием только потому, что эта функция находится в пространстве имен System.Linq.Декларативное программирование - это когда вы говорите, что хотите, а императивный язык - это когда вы говорите, как получить то, что вы хотите.
Простой пример в Python:
Первый пример является декларативным, потому что мы не указываем никаких «деталей реализации» построения списка.
Чтобы связать пример C #, обычно использование LINQ приводит к декларативному стилю, потому что вы не говорите, как получить то, что вы хотите; ты говоришь только то, что хочешь. То же самое можно сказать и о SQL.
Одним из преимуществ декларативного программирования является то, что оно позволяет компилятору принимать решения, которые могут привести к лучшему коду, чем то, что вы могли бы сделать вручную. Запуск с примером SQL, если у вас был такой запрос
«Компилятор» SQL может «оптимизировать» этот запрос, потому что он знает, что
id
это индексированное поле - или, может быть, оно не проиндексировано, и в этом случае ему все равно придется перебирать весь набор данных. Или, может быть, движок SQL знает, что сейчас самое время использовать все 8 ядер для быстрого параллельного поиска. Вы , как программист, не заботитесь ни об одном из этих условий, и вам не нужно писать свой код для обработки какого-либо особого случая таким образом.источник
filter(lambda x: x < 5, range(20))
это просто еще один рефакторинг в более короткие обозначения. Это ничем не отличается от выражения понимания списка (которое имеет четкие разделы «карта» и «фильтр»), которое было создано (см. Pep 202 ) с явным намерением создать более краткую запись. И это понимание списка было бы более ясным / идиоматическим в этом случае.Декларативный и императивный
Парадигма программирования является фундаментальным стилем программирования. Существует четыре основных парадигмы: императивная, декларативная, функциональная (которая считается подмножеством декларативной парадигмы) и объектно-ориентированная.
Декларативное программирование : это парадигма программирования, которая выражает логику вычислений (что делать) без описания потока управления (как это делается). Некоторые хорошо известные примеры декларативных доменных языков (DSL) включают CSS, регулярные выражения и подмножество SQL (например, запросы SELECT). Многие языки разметки, такие как HTML, MXML, XAML, XSLT ... часто являются декларативными. Декларативное программирование пытается стереть различие между программой как набором команд и программой как утверждением о желаемом ответе.
Императивное программирование : это парадигма программирования, которая описывает вычисления в терминах операторов, которые изменяют состояние программы. Декларативные программы можно рассматривать как команды программирования или математические утверждения.
Функциональное программирование: это парадигма программирования, которая рассматривает вычисления как оценку математических функций и избегает состояния и изменчивых данных. Он подчеркивает применение функций, в отличие от императивного стиля программирования, который подчеркивает изменения в состоянии. В чистом функциональном языке, таком как Haskell, все функции не имеют побочных эффектов, а изменения состояния представлены только как функции, которые преобразуют состояние.
В следующем примере императивного программирования в MSDN циклы по числам от 1 до 10 и поиск четных чисел.
Оба примера дают одинаковый результат, и один не лучше и не хуже другого. В первом примере требуется больше кода, но код тестируемый, а императивный подход дает вам полный контроль над деталями реализации. Во втором примере код, возможно, более читабелен; однако LINQ не дает вам контроля над тем, что происходит за кулисами. Вы должны верить, что LINQ предоставит запрошенный результат.
источник
Все вышеперечисленные ответы и другие посты онлайн упоминают следующее:
Чего они не сказали нам, так это как этого добиться . Чтобы часть программы была более декларативной, другие части должны предоставлять абстракцию, чтобы скрыть детали реализации (которые являются императивными кодами).
list.Where()
для получения нового отфильтрованного списка. Чтобы это работало, Microsoft сделала всю тяжелую работу за абстракцией LINQ.Фактически, одна из причин, по которой функциональное программирование и функциональные библиотеки являются более декларативными, заключается в том, что они абстрагировали циклы и создания списков, скрывая все детали реализации (наиболее вероятные императивные коды с циклами) за сценой.
В любой программе вы всегда будете иметь как императивные, так и декларативные коды, к чему вы должны стремиться, чтобы скрыть все императивные коды за абстракциями, чтобы другие части программы могли использовать их декларативно .
Наконец, хотя функциональное программирование и LINQ могут сделать вашу программу более декларативной, вы всегда можете сделать ее еще более декларативной, предоставляя больше абстракций. Например:
PS крайность декларативного программирования состоит в том, чтобы изобрести новые языки, специфичные для предметной области (DSL):
источник
debit
,deposit
и т. Д. Вместо повторения беспристрастного кодаaccount.balance += depositAmount
Я добавлю еще один пример, который редко появляется при обсуждении декларативного / императивного программирования: пользовательский интерфейс!
В C # вы можете создать пользовательский интерфейс, используя различные технологии.
В конце концов, вы можете использовать DirectX или OpenGL, чтобы очень настоятельно рисовать ваши кнопки, флажки и т. Д. Построчно (или действительно, треугольник за треугольником). Вам решать, как нарисовать пользовательский интерфейс.
В декларативном конце у вас есть WPF. Вы в основном пишете какой-то XML (да, да, технически «XAML»), и фреймворк делает всю работу за вас. Вы говорите, как выглядит пользовательский интерфейс. Это зависит от системы, чтобы выяснить, как это сделать.
Во всяком случае, просто еще одна вещь, чтобы думать. Тот факт, что один язык является декларативным или обязательным, не означает, что он не обладает определенными чертами другого.
Кроме того, одним из преимуществ декларативного программирования является то, что цель обычно легче понять при чтении кода, тогда как императив дает вам более точный контроль над выполнением.
Суть всего этого:
Декларативный ->
what
Вы хотите сделатьИмператив ->
how
Вы хотите, чтобы это было сделаноисточник
Мне понравилось объяснение из кембриджского курса + их примеры:
int x;
- что (декларативно)x=x+1;
- какисточник
CSS
это императив тогда?Разница главным образом связана с общим уровнем абстракции. С декларативным, в какой-то момент, вы настолько далеко от отдельных шагов, что программа имеет много возможностей для получения вашего результата.
Вы можете посмотреть на каждую часть инструкции как где-то в континууме:
Степень абстракции:
Пример декларативного реального мира:
Императивный пример реального мира:
источник
Calvert, C Kulkarni, D (2009). Essential LINQ. Аддисон Уэсли. 48.
источник
Императивное программирование явно говорит компьютеру, что и как делать, например, указание порядка и т. Д.
C #:
Декларативный - это когда вы говорите компьютеру, что делать, но не совсем, как это сделать. Datalog / Prolog - первый язык, который приходит на ум в этом отношении. В основном все декларативно. Вы не можете действительно гарантировать заказ.
C # является гораздо более императивным языком программирования, но некоторые функции C # являются более декларативными, как Linq
То же самое можно написать императивно:
(пример из википедии Linq)
источник
С http://en.wikipedia.org/wiki/Declarative_programming
Короче говоря, декларативный язык проще, потому что ему не хватает сложности потока управления (циклы, операторы if и т. д.)
Хорошее сравнение - модель «code-behind» ASP.Net. У вас есть декларативные файлы «.ASPX», а затем императивные файлы кода «ASPX.CS». Я часто обнаруживаю, что если я смогу сделать все, что мне нужно, в декларативной половине сценария, гораздо больше людей смогут следить за тем, что делается.
источник
Кража у Филиппа Робертса здесь :
Два примера:
1. Удвоение всех чисел в массиве
Обязательно следует:
Декларативно:
2. Суммирование всех элементов в списке
настоятельно
Декларативно
Обратите внимание, что императивные примеры включают создание новой переменной, изменение ее и возвращение этого нового значения (т. Е. Как заставить что-то произойти), тогда как декларативные примеры выполняются для заданного ввода и возвращают новое значение на основе начального ввода (т. Е. , что мы хотим, чтобы произошло).
источник
Императивное программирование
Язык программирования, требующий такой дисциплины, как C / C ++, Java, COBOL, FORTRAN, Perl и JavaScript. Программисты, пишущие на таких языках, должны разработать правильный порядок действий для решения проблемы, основанный на знании обработки данных и программирования.
Декларативное программирование
Компьютерный язык, который не требует написания традиционной логики программирования; Пользователи концентрируются на определении ввода и вывода, а не шагов программы, требуемых в процедурном языке программирования, таком как C ++ или Java.
Примеры декларативного программирования: CSS, HTML, XML, XSLT, RegX.
источник
декларативная программа - это просто данные для ее более или менее «универсальной» императивной реализации / vm.
плюсы: указание только данных в жестко заданном (и проверенном) формате проще и менее подвержено ошибкам, чем непосредственное указание варианта какого-либо императивного алгоритма. некоторые сложные спецификации просто не могут быть написаны напрямую, только в некоторой форме DSL. best и freq, используемые в структурах данных DSL - это наборы и таблицы. потому что у вас нет зависимостей между элементами / строками. и когда у вас нет зависимостей, у вас есть свобода изменения и простота поддержки. (сравните, например, модули с классами - с модулями, которые вам нравятся, и с классами, у которых проблема хрупкого базового класса) все товары декларативности и DSL немедленно вытекают из преимуществ этих структур данных (таблиц и наборов). еще один плюс - вы можете изменить реализацию декларативного языка vm, если DSL более-менее абстрактен (хорошо спроектирован). сделать параллельную реализацию, например.
Минусы: ты угадаешь правильно. реализация универсального (и параметризованного DSL) императивного алгоритма / виртуальной машины может быть медленнее и / или потреблять больше памяти, чем конкретная. в некоторых случаях. если такие случаи редки - просто забудь об этом, пусть будет медленно. если это часто встречается - вы всегда можете расширить свой DSL / vm для этого случая. где-то тормозит все остальные случаи, конечно ...
PS Frameworks находится на полпути между DSL и императивом. и как все промежуточные решения ... они сочетают в себе недостатки, а не выгоды. они не такие безопасные и не такие быстрые :) посмотрите на хаскель мастера на все руки - он на полпути между сильным простым ML и гибким метапрограммой Пролог и ... каким монстром он является. Вы можете смотреть на Пролог как на Haskell с булевыми функциями / предикатами. и как просто его гибкость против Haskell ...
источник
Мне просто интересно, почему никто не упомянул классы атрибутов как инструмент декларативного программирования в C #. Популярный ответ на этой странице только что говорил о LINQ как инструменте декларативного программирования.
Согласно Википедии
Таким образом, LINQ, как функциональный синтаксис, безусловно, является декларативным методом, но классы атрибутов в C #, как инструмент конфигурации, также декларативны. Вот хорошая отправная точка, чтобы узнать больше об этом: Краткий обзор программирования атрибутов C #
источник
Просто чтобы добавить еще один пример с точки зрения разработки мобильных приложений. В iOS и Android у нас есть Interface Builders, где мы можем определить интерфейс приложений.
Пользовательский интерфейс, созданный с использованием этих построителей, носит декларативный характер, где мы перетаскиваем компоненты. Фактический рисунок происходит внизу и выполняется каркасом и системой.
Но мы также можем нарисовать все компоненты в коде, и это обязательно по своей природе.
Кроме того, некоторые новые языки, такие как Angular JS, фокусируются на декларативном проектировании пользовательских интерфейсов, и мы можем увидеть множество других языков, предлагающих такую же поддержку. Например, у Java нет хорошего декларативного способа рисовать нативные настольные приложения в Java Swing или Java FX, но в ближайшем будущем они могут.
источник
Насколько я понимаю, оба термина имеют корни в философии, существуют декларативные и императивные виды знаний. Декларативные знания - это утверждения истины, утверждения о фактах, подобные математическим аксиомам. Это говорит вам кое-что. Императивное или процедурное знание шаг за шагом говорит вам, как прийти к чему-то. Вот что такое определение алгоритма по сути. Если хотите, сравните язык программирования с английским. Декларативные предложения что-то утверждают. Скучный пример, но вот декларативный способ показать, равны ли два числа друг другу в Java:
С другой стороны, императивные предложения на английском языке дают команду или делают какой-то запрос. Таким образом, императивное программирование - это просто список команд (сделайте это, сделайте это). Вот обязательный способ показать, равны ли два числа друг другу или нет при принятии пользовательского ввода, в Java:
По сути, декларативные знания пропускают определенные элементы, образуя уровень абстракции над этими элементами. Декларативное программирование делает то же самое.
источник