Меню Рубрики

Декларативный с точки зрения парадигмы язык рассматривает программу как

Изначально вычислительная техника возникла для решения именно вычислительных задач. Первые языки программирования, относящиеся к императивной парадигме, в основном были нацелены на их решение. Однако скоро круг задач начал значительно расширяться. Возникла необходимость решения логических, интеллектуальных задач, а также задач, связанных с обработкой не только числовой информации, но и информации различных типов. Тогда стали возникать языки, реализующие принципиально новые подходы и определившие появление принципиально новой, декларативной парадигмы.

Главное различие между императивным и декларативным программированием заключается в том, что декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели, а императивная предписывает, как ее достичь.

Поясним это на следующем примере. Предположим, вам надо пройти в городе из пункта А в пункт Б. Декларативная программа – это план города, в котором указаны оба пункта, плюс правила уличного движения. Руководствуясь этими правилами и планом города, курьер сам найдет путь от пункта А к пункту Б. Императивная программа – это список команд примерно такого рода: от пункта А по ул. Садовой на север до площади Славы, оттуда по ул. Пушкина два квартала, потом повернуть направо и идти до Театрального переулка, по этому переулку налево по правой стороне до дома 20, который и есть пункт Б.

В императивной программе действия задаются явными командами, подготовленными ее составителем. Исполнитель же (компьютер) просто им следует. Хотя команды в различных языках императивного программирования и выглядят по-разному, все они сводятся либо к присваиванию какой-нибудь переменной некоторого значения, либо к выбору следующей команды, которая должна будет выполняться. Присваиванию может предшествовать выполнение ряда арифметических и иных операций, вычисляющих требуемое значение, а команды выбора реализуются в виде условных операторов и операторов повторения (циклов).

Декларативные программы не предписывают выполнять определенную последовательность действий, в них лишь дается разрешение совершать их. Исполнитель должен сам найти способ достижения поставленной перед ним составителем программы (программистом) цели, причем зачастую это можно сделать различными способами.

Наиболее существенными классами декларативных языков являются функциональные(functional) языки, например, Lisp (Лисп), илогические(logic) языки, например, Prolog (Пролог).

Дата добавления: 2015-12-16 ; просмотров: 401 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Существуют две парадигмы программирования: императивная и декларативная. Основной (традиционной) парадигмой программирования является императивное (процедурное) программирование. В рамках императивной парадигмы рассматривается класс языков программирования, в которых программа явно указывает способ получения результата, не определяя ожидаемых свойств результата. Процедура получения результата имеет вид последовательности операций. Отсюда следуют характерные черты императивной программы:

• указание логики управления в программе;

• определение порядка выполнения операций;

• наличие операторов присваивания, выполняющих разрушающее присваивание.

Императивная парадигма основана на «фон-неймановской» вычислительной модели, основными параметрами которой являются:

• программа состоит из набора команд, которые выполняются последовательно;

• поименованные области памяти (концепция переменных как областей памяти, к которым можно обращаться по имени).

Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании.

Реализация программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.

Императивные языки программирования характеризуются следующими особенностями:

• необходимостью явного управления памятью, в частности описанием переменных;

• малой пригодностью для символьных вычислений;

• отсутствием строгой математической основы;

• высокой эффективностью реализации на традиционных ЭВМ.

Одним из важнейших классификационных признаков процедурного языка является его уровень. Уровень языка программирования определяется семантической (смысловой) емкостью его конструкций и степенью его ориентации на программиста. Язык программирования частично ликвидирует разрыв между методами решения различного рода задач человеком и вычислительной машиной. Чем более язык ориентирован на человека, тем выше его уровень. К императивным языкам программирования относятся ассемблеры и хорошо распространенные языки программирования высокого уровня, например такие, как Фортран, Паскаль, Си.

Принципиально иную вычислительную модель предполагает декларативная парадигма программирования. При использовании декларативного языка в программе в явном виде указывается, какими свойствами должен обладать результат, но не определяется порядок его получения. В идеальном случае декларативная программа будет состоять из предложений, описывающих необходимый результат. Характерно, что в этом случае порядок предложений, определяющих конкретные свойства результата, не имеет значения. В декларативной парадигме отсутствует концепция переменной, как поименованной области памяти, и явное управление. Декларативные языки не привязаны жестко к традиционной фон-неймановской модели вычислений. В большинстве случаев алгоритм достижения необходимого результата может иметь высокую степень параллелизма.

Декларативная парадигма программирования реализуется с помощью одного из двух стилей программирования: функционального или логического программирования.

Не нашли то, что искали? Воспользуйтесь поиском:

Основные принципы программирования: императивное и декларативное программирование

Рассказывает Тайлер МакГиннис, Google Developer Expert

Вы наверняка слышали о таких понятиях, как императивное и декларативное программирование, и скорее всего гуглили определения. И поэтому вы наверняка видели что-то подобное: “Императивное программирование — это описание того, как ты делаешь что-то, а декларативное — того, что ты делаешь. Это объяснение отлично подходит тем, кто уже разобрался в этом вопросе — но не новичкам.

Самым сложным является тот факт, что разница между декларативным и императивным подходами часто понятна интуитивно, но её сложно задать определением. Я общался со многими программистами и пришёл к заключению, что лучшее объяснение — это сочетание метафор и примеров кода. Итак, начнём.

Допустим, вы поняли, что слишком много времени уделяли работе, и решили пригласить свою половинку на свидание. Вы пришли в ресторан, подошли к администратору и сказали…

Императивный подход (как): Я вижу, что тот угловой столик свободен. Мы пойдём туда и сядем там.

Декларативный подход (что): Столик для двоих, пожалуйста.

Императивный подход означает то, как вы займёте место. Вы должны перечислить все шаги этого процесса. Декларативный же подход заявляет, что вам нужен столик на двоих.

Я задам вам вопрос и хочу, чтобы вы придумали и императивный, и декларативный подход.

“Я у Ашана. Как мне пройти до твоего дома?”

“Пройди через северный выход парковки и поверни налево. Сядь на автобус 678 и выйди на остановке “Улица Победы”. Поверни направо, как если бы ты шёл в Икею. Иди прямо и поверни направо у первого светофора. На следующем светофоре поверни налево. Номер моего дома — 134.”

Мой адрес: Энск, улица Победы, дом 134.

Неважно, как я попаду к твоему дому, важно, на какой машине я приеду. У неё будет или императивная механическая КПП, или декларативная автоматическая КПП. Достаточно метафор?

Прежде чем мы обратимся к коду, важно понять, что многие декларативные подходы имеют определённый слой императивных абстракций. Вернёмся к нашим примерам. Декларативное обращение к сотруднику ресторана подразумевает, что он знает все императивные шаги по предоставлению вам столика. Знание адреса подразумевает, что у вас есть GPS-навигатор, который знает императивные шаги по составлению маршрута. У автомобиля с автоматической КПП есть определённый слой абстракций над передключением передач.

Итак, я повторюсь: многие (если не все) декларативные подходы имеют слой неких императивных абстракций.

Теперь мы перейдём от приятных метафор к реальному коду. Сперва посмотрим, какие языки являются декларативными, а какие — императивными:

  • Императивные: C, C++, Java.
  • Декларативные: SQL, HTML.
  • Смешанные (могут быть таковыми): JavaScript, C#, Python.

Вот типичные примеры на SQL и HTML:

Достаточно взглянуть на них, чтобы понять, что происходит. Они декларативны, заявляя, что должно быть сделано, а не как. Вы описываете желаемый результат, не углубляясь в инструкции. Неважно, как будут выбраны пользователи из Мексики. Неважно, как браузер распарсит ваш article . Важно, что вы получите мексиканских пользователей и новый header и paragraph на сайте.

Пока неплохо. Давайте рассмотрим примеры на JavaScript.

Представьте, что вы на собеседовании. Откройте консоль и ответьте на следующие вопросы.

  1. Напишите функцию, называющуюся double , которая принимает массив чисел и возвращает новый массив, каждый элемент которого в два раза больше входного: double([1,2,3]) -> [2,4,6] .
  2. Напишите функцию, называющуюся add , которая принимает массив и возвращает сумму всех его элементов: add([1,2,3]) -> 6 .
  3. Используя jQuery (или чистый JavaScript), добавьте обработчик события click к элементу с id , равным btn . По нажатию переключите класс highlight и смените текст на Add Highlight или Remove Highlight , в зависимости от текущего состояния элемента.

Давайте взглянем на самые распространённые подходы к решению этих задач, которые являются императивными.

Разобравшись, что общего у этих императивных примеров, мы поймём, что именно делает их императивными.

  1. Очевидно, что все они описывают, как решить проблему: мы явно указываем все шаги.
  2. Это уже не так очевидно для тех, кто не привык думать декларативно, или даже функционально. В каждом примере происходит изменение какого-либо состояния. В первых двух примерах происходило изменение переменной results , а в третьей состояние было в самой DOM – и его мы тоже изменяли.
  3. Это уже субъективно, но я считаю, что код выше нечитаем. Я не могу с первого взгляда понять, что происходит — вместо этого мне приходится читать код построчно.

А теперь взглянем на декларативные примеры. Их цель — решить все проблемы, описанные выше. Поэтому каждый пример должен описывать, что происходит, быть неизменяемым и читаемым.

Заметьте, что в первых двух примерах я использовал встроенные методы JavaScript, map и reduce . Как видите, декларативные решения вновь оказались абстракциями над императивными реализациями. Но нас не интересует, как реализованы эти методы. Мы также не изменяем состояния, да и читается этот код лучше.

Ну а третий? В нём я немного схитрил, использовав React — но обратите внимание, что все три императивные ошибки исправлены. React замечателен тем, что в нём вы можете создавать декларативные пользовательские интерфейсы. Смотря на компонент Btn, сразу понятно, как будет выглядеть интерфейс. Кроме того, состояния “живут” не в DOM, а в самомReact-компоненте.

Ещё одним преимуществом является то, что декларативный код является контекстно-независимым. Это значит, что его можно использовать в любой программе без изменений.

ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ ЯЗЫКИ ПРОГРАММИРОВАНИЯ

ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ. ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Парадигма программирования — это некоторый цельный набор идей и рекомендаций, определяющих стиль написания программ. Парадигма программирования представляет (и определяет) то, как программист видит выполнение программы. Например, в объектно-ориентированном программировании программист рассматривает программу как набор взаимодействующих объектов, тогда как в функциональном программировании программа представляется в виде цепочки вычисления функций.

Язык программирования (Programming Language) — это алфавит, грамматика и синтаксис, используемые для построения набора инструкций, заставляющих компьютер выполнять те или иные действия.

Можно выделить две большие группы языков программирования, отражающих разные парадигмы программирования:

директивные (directive), называемые также процедурными (procedural) или императивными (imperative),

декларативные (declarative) языки.

Главное различие между этими группами языков заключается в следующем: декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели, а директивная предписывает , как ее достичь.

Поясним это на следующем примере. Предположим, вам надо пройти в городе из пункта А в пункт Б. Декларативная программа — это план города, в котором указаны оба пункта, плюс правила уличного движения. Руководствуясь этими правилами и планом города, курьер сам найдет путь от пункта А к пункту Б.

Директивная программа — это список команд примерно такого рода: от пункта А по ул. Садовой на север до площади Славы, оттуда по ул. Пушкина два квартала, потом повернуть направо и идти до Театрального переулка, по этому переулку налево по правой стороне до дома 20, который и есть пункт Б.

В директивной программе действия задаются явными командами, подготовленными ее составителем. Исполнитель же (компьютер) просто им следует. Хотя команды в различных языках директивного программирования и выглядят по-разному, все они сводятся либо к присваиванию какой-нибудь переменной некоторого значения, либо к выбору следующей команды, которая должна будет выполняться. Присваиванию может предшествовать выполнение ряда арифметических и иных операций, вычисляющих требуемое значение, а команды выбора реализуются в виде условных операторов и операторов повторения (циклов).

Декларативные программы не предписывают выполнять определенную последовательность действий, в них лишь дается разрешение совершать их. Исполнитель должен сам найти способ достижения поставленной перед ним составителем программы (программистом) цели, причем зачастую это можно сделать различными способами.

На практике языки программирования не являются чисто императивными или декларативными, а содержат в себе черты языков различных парадигм. На процедурном языке часто можно написать функциональную программу или ее часть и наоборот.

Декларативное программирование

Наиболее существенными классами декларативных языков являются функциональные (functional) языки, например, Lisp (Лисп), и логические (logic) языки, например, Prolog (Пролог).

Функциональная программа состоит из совокупности определений функций, которые в свою очередь представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. При этом функции часто либо прямо, либо опосредованно вызывают сами себя (рекурсия). Каждая функция возвращает некоторое значение в вызвавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор, пока начавшая процесс вычислений функция не вернет конечный результат пользователю.

«Чистое» функциональное программирование не содержит оператора присваивания, в нем вычисление любой функции не приводит ни к каким побочным эффектам, отличным от собственно вычисления ее значения. Отсутствие оператора присваивания делает переменные, используемые в функциональных языках программирования, очень похожими на переменные в математике — получив однажды свои значения, они больше никогда их не меняют.

Еще одной реализацией декларативного стиля является логическое программирование , основанное на логике предикатов. В логическом программировании основное внимание уделяется описанию структуры прикладной задачи, а не выработке предписаний компьютеру, что ему следует делать. Программа рассматривается как набор логических фактов и правил вывода, а выполнение программы состоит в вычислении истинности (попытке доказательства) некоторого утверждения. Prolog (от французского PROgrammation LOGique, по-русски — Пролог) — это наиболее известный язык логического программирования. Этот язык (наряду с функциональным языком Lisp) часто называют языком искусственного интеллекта — с его помощью решаются задачи создания экспертных систем и систем обработки естественных языков.

Читайте также:  Жизнь с точки зрения кота жизнь понятна и проста

На входе программы:

все люди смертны (отношение: если человек, то он смертен)

На выходе : Сократ смертен.

Директивное программирование

К директивным языкам относятся такие классические языки программирования, как Fortran, Basic, Pascal, C.

Директивное программирование — один из наиболее естественных для человека подходов к написанию программ. При написании подобной программы необходимо найти такую цепочку команд, которая приведет в конце концов к вычислению одной или нескольких искомых величин.

Директивное программирование стали называть процедурным , когда в процессе увеличения сложности моделируемых систем и размера получаемых программ возникла концепция подпрограмм , называемых также процедурами (procedure), функциями (function) или методами (method). Подпрограмма позволяет локализовать в ней процесс выполнения определенного действия, которое может быть повторено многократно с помощью механизма вызова . При этом исходная программа превращается из одной большой цепочки команд в значительно более короткую и понятную последовательность вызовов подпрограмм, решающих более простые подзадачи. При вызове подпрограммы ей часто передают так называемые параметры, а она после завершения своей работы обычно возвращает некоторый результат.

Те из директивных языков программирования, которые не обладают хорошо развитымым механизмом организации подпрограмм, принято называть операциональными языками (например, первые версии языка BASIC).

Одним из направлений процедурного программирования является структурное программирование.

Структурное программирование — методология разработки программного обеспечения, предложенная в 70-х года XX века.

В соответствии с данной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

последовательного исполнение (следование) — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла.

В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.

НЕДОПУСТИМ оператор безусловной передачи управления в любую точку программы.

Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде так называемых подпрограмм ( процедур или функций ). В этом случае в тексте основной программы вместо помещённого в подпрограмму фрагмента вставляется инструкция вызова подпрограммы . При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается со следующей за командой вызова подпрограммы инструкции.

Разработка программы ведётся пошагово, методом «сверху вниз». Сначала пишется текст основной программы, в котором вместо каждого связного логического фрагмента текста вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются «заглушки», которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы — «заглушки» последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «заглушки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов и может быть уверен, что общая структура всех более высоких уровней программы верна.

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что «интуитивная» разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики.

Наиболее сильной критике со стороны разработчиков структурного подхода к программирования подвергся оператор GOTO (оператор безусловного перехода), имеющийся почти во всех языках программирования. Использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ, по тексту которых практически невозможно понять порядок исполнения и взаимозависимость фрагментов.

Следование принципам структурного программирования сделало тексты программ, даже довольно крупных, нормально читаемыми. Серьёзно облегчилось понимание программ, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты.

Объектно-ориентированное программирование

Что главное в программе: алгоритм или данные, которые он обрабатывает? Вначале, когда компьютер умел работать только с числами, главным был алгоритм. Однако, по мере роста абстрактности данных (символы, строки, массивы, множества, звук, изображение) ошибки стали возникать из-за того, что правильный алгоритм применяли к неправильным (несоответствующим) данным. Стало ясно, что данные должны как-то храниться вместе с правильными алгоритмами для их обработки. Так возникло понятие объекта .

Объект – это комбинация из данных и процедур для работы с этими данными. Данные в этом случае называются полями или свойствами , а процедуры – методами объекта. Метод является процедурой или функцией, объявленной внутри объекта и жестко ограниченной этим объектом.

Допустим, что объект – светящаяся точка на экране, которую можно перемещать, а также включать и выключать. Описание в Паскаль — программе может быть таким:

Point = object

Методы, входящие в объект, должны быть описаны. Например,

Обращение к объекту:

Объединение данных с процедурами и функциями, которые с ними работают, называется инкапсуляцией . Это своего рода защита данных, т.к. к ним теперь можно применить только те методы, которые описаны в самом объекте или методы родительских объектов.

Вторым важным принципом ООП является наследование — возможность создания иерархии объектов («родитель» и «потомок»), причем «потомок» наследует все методы и свойства родителя плюс может иметь еще и свои собственные .

Пример: Например, нужно иметь возможность изменять размер точки на экране. Создадим объект NewPoint , являющийся потомком объекта Point :

NewPoint = object ( point )

Поскольку NewPoint является потомком объекта Point , несмотря на то, что у него самого описано только два метода, к нему можно обращаться, используя как собственные, так и родительские методы:

Наследник не может удалить родительские методы, но можно их перекрыть , т.е. выполнять каким-либо иным способом (т.е. можно заново описать какой-то из родительских методов).

Наследование как раз и позволяет выполнить какие-то стандартные процедуры немного по-другому, например, рисовать похожие, но разные окна, наследуя их от одного окна.

Третий принцип ООП – полиморфизм – возможность для каждого объекта иерархии выполнить одно и то же действие по-своему. Можно записать в программе: Point . Show , Window.Show , и т.д. Один и тот же метод в этом случае будет реализовываться разными способами и приводить к разным результатам.

Итак, в основе ООП лежат три основных понятия:

инкапсуляция (сокрытие данных в классе или методе);

Инкапсуляцию можно представить, как защитную оболочку вокруг кода данных, с которыми этот код работает. Оболочка задает поведение и защищает код от произвольного доступа извне.

Наследование — это процесс, в результате которого один тип наследует свойства другого типа.

Полиморфизм — это концепция, позволяющая иметь различные реализации для одного и того же метода, которые будут выбираться в зависимости от типа объекта, переданного методу при вызове

ООП – очень мощный метод при разработке больших программ, резко возрастает КПД работы программиста и снижается количество ошибок. Для большинства языков были созданы большие библиотеки готовых объектов. Практически все современные языки программирования, независимо от принадлежности к тому или иному стилю (директивному или декларативному), поддерживают концепцию ООП. Среди них C++, Java, Ruby и Haskell. Существуют и версии объектно-ориентированного Пролога.

В языках С++, Delphi сменилась терминология: иерархии объектов называются классами , а сами объекты – экземплярами классов .

Классификацию рассмотренных выше парадигм программирования можно представить в виде следующей схемы:

Визуально-ориентированное программирование

Основано на ООП. Основополагающая идея: если программа строится в основном из стандартных объектов, то нельзя ли их не описывать в программы, а просто перетаскивать из какого-то хранилища в нужное место мышкой? А система сама должна написать нужный для этого код. Так работают Delphi, C++ Builder, Visual C, Visual Basic и т. д.

Естественно, каждый объект для этого должен иметь какое-то визуальное представление (иконку), чтобы его можно было перетаскивать мышкой. В результате иногда можно сделать нужную программу, вообще не написав на строчки программного кода. Метод особенно эффективен при создании интерфейсной части приложения (диалоговых окон, командных кнопок и т.п.)

Уровни языков программирования

Существуют такие языки, которые отражают структуру данного класса машин, и поэтому их называют машинно-ориентированными языками или языками низкого уровня . Особенностью этих языков является жесткая ориентация на определенный тип аппаратуры. В стремлении приспособить эти языки к человеку, был разработан язык символического кодирования – язык АССЕМБЛЕР.

Для облегчения труда программистов были созданы языки программирования, которые строились на основе определенного алфавита и строгих правил построения предложений. Отличительной особенностью этих языков является их ориентация не на систему команд той или иной ЭВМ, а на систему операторов, характерных для записи определенного класса алгоритмов . Такие языки принято называть языками программирования высокого уровня . К ним относятся: Бейсик, Фортран, Паскаль, Алгол, Си и многие другие.

Так как текст, записанной программы на языках высокого уровня не понятен ПК, требуется перевести его на машинный язык. Такой перевод на язык машинных кодов называется трансляцией , а выполняется он специальными программами – трансляторами .

Существует два основных вида трансляторов : интерпретаторы и компиляторы .

Интерпретаторы анализируют и выполняют (интерпретируют) программу последовательно (покомандно или построчно). Синтаксические ошибки обнаруживаются такими интерпретаторами только тогда, когда интерпретатор приступает к выполнению команды (строки), содержащей ошибку.

Компиляторы преобразуют всю программу в модуль на машинном языке (после предварительного исправления всех синтаксических ошибок). Только потом программа может быть выполнена.

Этапы разработки программы

Компьютерный этап разработки программы на языке высокого уровня включает в себя следующие действия:

ввод и редактирование текста на языке программирования,

отладка и тестирование программы.

Полный цикл разработки и эксплуатации программного продукта (программы), называемый жизненным циклом программы, включает в себя следующие этапы:

анализ требований к программе;
проектирование программы;
программирование;
тестирование и отладка;
эксплуатация и сопровождение;
завершение эксплуатации.

Анализ требований — этап жизненного цикла программы, во время которого требования заказчика уточняются, формализуются и документируются.

Постановка задачи в программировании — точная формулировка решения задачи на компьютере с описанием входной и выходной информации.

Проектирование программы — этап жизненного цикла, во время которого исследуется структура и взаимосвязи элементов разрабатываемого программного продукта.

Программирование — итерационный процесс составления программы для решения поставленной задачи.

Отладка программы — этап разработки компьютерной программы, в процессе которого происходят обнаружение, локализация и устранение явных ошибок в программе. Обычно отладка выполняется на контрольных примерах с известными результатами.

Тестирование программы — этап разработки компьютерной программы, в процессе которого проверяется работоспособность программы, не содержащей явных ошибок. Тестирование — процесс выполнения программ с целью обнаружения факта наличия ошибок.

Альфа-тестирование — тестирование готового программного продукта разработчиками этого продукта на специально созданных задачах.

Бета-тестирование — опробование программного продукта, бесплатно разосланного потенциальным пользователям, на реальных задачах. О найденных ошибках и замечаниях пользователь сообщают разработчику.

Ручное тестирование — тестирование, которое проводится без исполнения тестируемой программы на компьютере.

Стохастическое тестирование — тестирование программ, при котором исходные тестовые данные берутся случайным образом (с использованием статистического распределения).

Тестирование программы как прозрачного (белого) ящика — тестирование, подразумевающее знание исходного кода программы и полный доступ к нему.

Тестирование программы как черного ящика — тестирование, при котором программа рассматривается как объект, внутренняя структура которого неизвестна.

Сопровождение программы — процесс модификации существующей программы, обусловленный необходимостью устранения выявленных в ней ошибок или изменения ее функциональных возможностей.
Блиц-обзор языков программирования

Существует несколько сотен языков программирования. Вот некоторые из них:

ADA — язык, разработанный с целью обеспечить создание программных систем с многолетним сроком службы и высокой степенью надежности. Создан по заказу министерства обороны США.

ALGOL — язык, ставший важной вехой в развитии языков программирования. Логичный и математически строгий, до сих пор применяется для записи алгоритмов.

BASIC — язык и среда, разработаны в 1964 г. в Дартмутском колледже. BASIC создавался как очень простой в изучении язык, который было бы легко компилировать. Авторы отводили ему роль первого шага на пути к изучению других языков .

VISUAL BASIC – объектно-ориентированная среда визуального программирования, внутренний язык приложений Microsoft Windows. Использует базовые конструкции языка Basic.

C — третья буква английского алфавита, название языка программирования, разработанного Деннисом Ричи в начале 70-х годов в Bell Laboratories. Использован для реализации OS Unix. Часто характеризуется как «переносимый ассемблер».

C++ -расширение языка С. В частности, С++ поддерживает объектно-ориентированное программирование . Разработан в Bell Laboratories Бьерном Страустрапом.

COBOL — один из первых языков программирования. Ориентирован на разработку программ для обработки экономических данных и управления бизнесом . Широко используется до сих пор.

DELPHI — продукт Borland International. Высокопроизводительный инструмент построения приложений к базам данных в архитектуре клиент-сервер, а также для локальных машин и файл-серверной архитектуры. Это инструментарий, который включает компилятор кода, работающий в Windows, и предоставляет средства визуального программирования. В основе лежит язык — Object Pascal, который является расширением объектно-ориентированного языка Pascal.

FORTH — язык среднего уровня и интерактивная среда разработки. Нашел широкое применение в науке, робототехнике, управлении оборудованием, обработке образов и искусственном интеллекте. Позволяет создавать очень компактные и быстрые программы.

Читайте также:  Видимо у вас проблемы со зрением

FORTRAN — первый язык программирования высокого уровня. Главное применение — числовые расчеты с использованием сложных математических формул. Употребляется до сих пор.

HASKELL — «чистый» функциональный язык. Программы на HASKELL состоят исключительно из функций. Язык назван в честь логика Хаскела Кэрри, чьи работы были положены в основу языка.

JAVA — объектно-ориентированный язык, созданный в 1991 году группой разработчиков из Sun Microsystems. Основной целью этой корпорации служило создание языка независимого то платформы. Машинная независимость программ обеспечивается тем, что компилятор языка Java не генерирует родной код процессора, а создает промежуточный код, или байт-код для некой абстрактной виртуальной машины Java (Java Virtual Machine — JVM). Значит, чтобы обеспечить работу Java-программ на желаемой платформе, достаточно реализовать JVM для данной платформы. Виртуальная машина Java является ИНТЕРПРЕТАТОРОМ для байт-кода.

LISP — язык обработки списков. Родной язык искусственного интеллекта . Разработан в конце 50-х Джоном Мак-Карти. В основу языка положена идея списков переменной длины и деревьев в роли основных типов данных, а также возможность интерпретации кода программы как данных и наоборот.

LOGO — язык, призванный служить средством обучения программированию не только взрослых, но и детей. Он сконструирован так, чтобы новичок мог сразу начать писать первые программы, получая от этого удовольствие. Не менее важно, что язык в то же время достаточно мощный, чтобы отвечать потребностям уже искушенного программиста.

PASCAL — язык, разработанный Виртом для целей обучения программированию . PASCAL включает в себя элементы, общие для большинства языков программирования. Жесткие правила языка делают написание программ с ошибками довольно трудным делом. Поддерживает ООП.

PERL — язык, оптимизированный для просмотра текстовых файлов, извлечения из них информации и генерации соответствующих отчетов. Широко применяется для системного администрирования среды Unix.

PL/1 — язык общего назначения, который по замыслу IBM должен был вытеснить специализированные языки программирования. PL/1 предназначался не только для программирования в сферах коммерции, науки и инженерного дела, но даже для системного программирования. Попытка не удалась.

PROLOG — язык искусственного интеллекта. Реализует концепцию логического программирования . На PROLOG написаны многие экспертные системы, позволяющие делать выводы на основе имеющихся фактов и обширной базы правил, представленных в виде «если — то».
PYTHON — интерпретирующий объектно-ориентированный язык программирования . По своему назначению принадлежит к группе языков Perl, Scheme и Java. Поддерживает модули, классы, исключения и динамические типы данных.

Языки разметки гипертекста

HTML и XML – являются языками разметки гипертекста, используются для создания WEB-страниц. Не являются языками программирования . Язык разметки документов — это набор специальных инструкций, называемых тэгами, предназначенных для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Тэги языка, или, как их иногда называют, управляющие дескрипторы, в таких документах каким-то образом кодируются, выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. Самый популярный на сегодняшний день язык гипертекстовой разметки – HTML , был создан специально для организации информации, распределенной в сети Интернет, и является одной из ключевых составляющих технологии WWW. HTML уже сегодня не удовлетворяет в полной мере требованиям, предъявляемым современными разработчиками к языкам подобного рода. И ему на смену был предложен новый язык гипертекстовой разметки, мощный, гибкий, и, одновременно с этим, удобный язык XML.

XML (Extensible Markup Language) — это язык разметки, описывающий целый класс объектов данных, называемых XML — документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он только определяет порядок их создания. У разработчиков появляется возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа.

При разработке программного продукта сравнение результатов работы программы с результатами наблюдений или результатами, полученными экспериментальным путем относится к этапу

a) отладки и тестирования программы

b) сопровождения программы

c) анализа полученных результатов

d) анализа и формализованного описания задачи

20. После анализа результатов моделирования может произойти ___________ параметров модели.

21. При разработке программного продукта устранение недостатков, замеченных пользователем, осуществляется на этапе _____________.

a) анализа полученных результатов

b) сопровождения программного продукта

c) отладки и тестирования

d) кодирования программы

Эволюция и классификация языков программирования. Основные понятия языков программирования.

Кто является создателем языка Pascal?

c) Бьерн Страуструп

К какому типу языков относится ассемблер

d) высокого уровня

3. Языки программирования высокого уровня характеризует:

a) наличие понятия типа данных и близость к естественному языку

b) зависимость от архитектуры конкретного компьютера

c) близость к машинному языку

4. Скриптовыми языками являются.

5. Объектно-ориентированными языками являются.

6. В языке программирования С используются подпрограммы.

7. Декларативный (с точки зрения парадигмы) язык рассматривает программу как.

a) совокупность описания входных данных и описания искомого результата

b) совокупность определений функций, которые обмениваются между собой данными без использования промежуточных переменных и присваиваний.

c) описание задачи в терминах фактов и логических формул, а решение задачи выполняет система с помощью механизмов логического вывода

d) совокупность описаний процедур

8. Объектно-ориентированным языком, в котором имеется возможность множественного наследования, является.

9. Для системного программирования максимально подходит язык.

10. Язык Lisp относится к языкам.

a) функционального программирования

b) неопределенного программирования

c) системного программирования

d) структурного программирования

11. Языками декларативного программирования являются.

a) логические языки

c) языки сценариев

Способ записи программ, допускающий их непосредственное выполнение на ЭВМ, называется

a) машинным языком программирования

b) процедурным языком программирования

c) логическим языком программирования

d) функциональным языком программирования

13. Стиль, вычисление в котором представляет собой вывод некоторого целевого утверждения называется _____________ программированием.

Языком логического программирования является

Представленный фрагмент кода

for j:=1 to n-i do

a) Сортирует массив A

b) Определяет максимальный элемент массива A

c) Определяет минимальный элемент массива A

d) Вычисляет сумму элементов массива A

Из перечисленных

для системного программирования наиболее подходят языки …

Из перечисленных

5)ADA
языками разметки данных являются…

Ассемблер, является

a) языком низкого уровня

b) языком высокого уровня

c) двоичным кодом

d) инструкцией по использованию машинного кода

Командный язык, может считаться

c) управляющей структурой

d) средством отладки программы

20. Подпрограммой является…

a) ранее разработанный, синтаксически выделенный и целиком используемый в составе других программ блок операторов

b) часть операторов основной программы, выполняющихся как повторение цикла

c) скомпилированный исполняемый файл основной программы

d) рекурсивный вызов в функции

21. Подпрограммам не свойственно…

a) усложнение понимания работы программы

b) упрощение читабельности программы

c) уменьшение общего объема программы

d) структурирование программы

22. Языком программирования низкого уровня является.

Структуры и типы данных языка программирования.

1. Типы входных и выходных данных определяются на этапе…

a) постановки задачи

c) разработки алгоритма

d) тестирования и отладки

2. Массивом называется …

a) последовательность фиксированного числа однотипных переменных, имеющихобщее имя

b) ограниченная апострофами последовательность любых символов

c) самый простой оператор языка программирования

d) набор переменных, начинающихся с одной буквы

Элементы массива упорядочены

a) по возрастанию индексов элементов

b) по возрастанию значений элементов

d) по частотным характеристикам

4. Целочисленный тип является __________ типом данных

5. Верным является высказывание, утверждающее…

a) доступ к элементу массива осуществляется по имени массива и номеру элемента

b) элементы массива могут иметь разные типы

c) к элементу массива невозможно получить доступ по номеру

d) элементы массива автоматически упорядочиваются по возрастанию

6. Массив относится к ___________ типам данных

a) составным (конструируемым)

7. Динамической структурой данных является…

Если задан тип данных, то известной является информация о

a) диапазоне возможных значений

b) начальном значении

c) количестве обращений к данным

d) способе обработки

Какая информация известна, если задан тип данных

a) диапазон возможных значений

b) начальное значение

c) количество обращений к данным

d) количество записей данных

10. Компонентный подход к программированию предполагает работу с.

a) отдельными компонентами (СОМ — объектами)

b) с методами обработки данных

c) структурированными данными

d) глобальными переменными

11. Вид хранимой информации определяет.

a) тип соответствующего поля данных

b) вложенность структур данных

c) связи между данными

d) устойчивость структур данных

Целые и вещественные числа, символы, булевские значения: true и false

являются.

a) элементами данных программы

b) структурами данных

c) полями данных

d) списками даных

Какая структура данных больше подходит для реализации рекурсии

Основы машинной графики

1. Наименьшим элементом поверхности визуализации, которому могут быть независимым об разом заданы цвет, интенсивность и другие параметры, является .

2. RGB является.

1 форматом графических файлов

2. системой представления цвета в компьютере

3. графическим редактором

4. типом монитора

3. CMYK является.

1. форматом графических файлов

2. системой представления цвета

3. графическим редактором

4. типом монитора

4. Системами кодировки графической информации являются…
а. RGB
б. CMYK
в. HCV
г. BNC
a) а,б
b) б,г
c) в,б
d) а,г

5. JPEG является.

1. системой представления цвета

2. форматом графических файлов .

3. графическим редактором

4. типом монитора

6. Из предложенного списка графическими форматами являются:
а) TIFF
б) MPI
в) JPG
г) TXT
д) BMP
a) а,в,д
b) б,в,д
c) г,д
d) а,б

7. Графический формат, позволяющий при сохранении фотографий получить наименьший объем
a) TIFF
b) BMP
c) JPG
d) PCX

Последнее изменение этой страницы: 2017-03-14; Просмотров: 736; Нарушение авторского права страницы

Чем отличается императивное программирование от декларативного

Предыстория

Не так давно я была в активном поиске работы и просматривала кучу сайтов с вакансиями/проектами. На некоторых из них «проходные» вопросы можно посмотреть еще до подачи отклика.

Большинство было вполне обычными, типа «сколько лет вы пользуетесь фреймворком Х?», но один мне показался интересным (я даже туда откликнулась, но #меняневзяли).

Это собственно и был вопрос из заголовка. И я решила разобраться. А лучший способ понять — это, как известно, объяснить. Так что добро пожаловать под кат.

В чем же отличия?

Для того, чтобы описать отличия, нужно сначала понять, что это в принципе такое. В вольном пересказе.

Императивный стиль

Это такой стиль программирования, при котором вы описываете, как добиться желаемого результата. Например я пишу:

— поставь сковородку на огонь;
— возьми два яйца (куриных);
— нанеси удар ножом по каждому;
— вылей содержимое на сковородку;
— выкинь скорлупу;

Это что ни на есть декларативный стиль, но при этом с примесью императивного.

Декларативный стиль

Такой стиль, в котором вы описываете, какой именно результат вам нужен.

Тут я просто пишу:

И получатель такого сообщения уже сам разбирается, какие шаги для этого надо предпринять.

Почему пример из части про императивность на самом деле с примесью декларативности? Ну хотя бы потому что получатель должен знать, что такое сковорода и яйца.

Пример на JS

Мой любимый пример такой: дан массив чисел, надо написать функцию, которая вернет массив чисел, где каждое число из исходного массива удваивается. Т.е. [1, 2, 3] -> [2, 3, 6]

Все языки программирования высокого уровня позволяют писать в смешанном стиле и, на самом деле, четкого разделения даже эти два примера не показывают.

Наверное, правильно называть один стиль «более декларативным», а другой — «более императивным».

Хардкорная конфа по С++. Мы приглашаем только профи.

Читают сейчас

Похожие публикации

  • 17 июня 2015 в 11:11

Реактивное программирование пользовательского интерфейса в Jancy

Философия программирования — трёхнаправленное программирование

Язык Go: реабилитация императивного программирования

Комментарии 54

Добавлю к комментарию выше: оба ваших примера про яичницу — императивные, просто с разной степенью детализации.

яичница(яйца) = яйца |> чистка |> жарка

Декларативного подхода как такового не существует, это собирательное понятие некоторых особенностей, которые имеются в доменных языках, программировании в ограничениях. Применимо к вашему примеру, когда мы имеем некий список, мы должны иметь декларативный язык описания, который говорит, что в этом месте список возвращается умноженный на два.

Таким языком может быть , но даже в этом случае мы определяем императивную операцию с умножением. В чисто декларативном подходе, мы должны сказать «здесь удвоенный список». Каким образом — не рассматривается в этой парадигме.

Пролог вроде изначально был полностью декларативный, нет?

Разница между декларацией и императивом пролегает не в «что» или «как» (это следствие, просто описание), а в том что в императиве используется информация предыдущего шага. В декларативном подходе шагов вычислений нет.

Операции и отображения (функции) тоже можно описывать декларативно: вместо y = f(x) = 2 * x (пусть x: int) можно сказать, y — четное. Для любой g(x) функции можно можно сказать что её значения — «g’ные». Это позволяет до некоторой степени проворачивать фарш назад — вообще не определяя g, а описывая (декларативно) её свойства, получать ответы на вопросы (путем проверки, выполняется ли свойство для компонент агрегата). Приблизительно так и работает Пролог (несмотря на то что там есть «+»)).

И кстати класс — это пример декларации — он описывает множество объектов со свойствами.

Декларативный подход, как таковой, существует. Это аксиоматика, денотационная семантика, лежащая в основе языка, даже императивного, наконец, просто способ декомпозиции и композиции задачи. Чаще всего, он используется в комплексе с императивными конструкциями, но иногда и сам по себе: HTML, CSS и SVG тому примеры.

Читайте также:  Осветитель таблиц для определения остроты зрения паспорт

Яичница, из яиц, жареных, две штуки, с солью.
Яйца: соленые, пожаренные.

Сковорода: умеет жарить, если горячая. Вмещается 1-4 яйца.
Огонь: умеет нагревать, если включен.
Мраморная плита: умеет жарить, если горячая. Вмещается 1-2 яйца.
Процессор без кулера. Умеет жарить. Вмещается 1 яйцо.

Попробую в виде программы:

Мне надо: Яичница, из яиц, жареных, две штуки, с солью.

Яйца пожареные, соленые.
Яйца сырые: если пожарить, будут пожаренные.
Яйца пожаренные: если добавить соль, будут соленые.
Соль: если добавить к чему-то, это что то станет соленым.
Яблоко. Если пожарить — будет пожареное.
Сковорода: умеет жарить, если горячая. Вмещается 1-4 яйца.
Огонь: умеет нагревать, если включен.
Мраморная плита: умеет жарить, если горячая. Вмещается 1-2 яйца.
Процессор без кулера. Умеет жарить. Вмещается 1 яйцо.

Прикол в том, что все строки я могу поменять местами.
А ещё могу написать: мне надо соленый жареный процессор.
Или Соленые сырые яйца
Или пожареные несоленые яйца (сковороды нет).
Или пожареные яблоки

Добавьте в ваше описание типы, а к типам свойства, или лучше, аксиоматическую семантику, и абсурдные комбинации отпадут.

Ага, или в ООП стиле на C++:

Как-то давно на Хабре в комментариях разгорелась длинная дискуссия о декларативном программировании с подобными примерами. Никак не могу найти тот пост.

… мне, конечно, очень интересно, где же в этом примере ООП.

Как отличить, являются эти сущности объектами или просто древовидной структурой данных?

Иными словами, я могу с минимальными синтаксическими изменениями переписать это на функциональный язык, и получить все то же самое, разве нет?

В отличие от структуры данных объекты имеют чётко определённое поведение. В данном примере у омлета может быть метод omelette.taste(). Просто они организованы в дерево с помощью композиции.

Да, можете. В таком ООП многие вещи взяты из функционального программирования. К примеру неизменяемость, минимальный интерфейс и композиция over наследование.

В отличие от структуры данных объекты имеют чётко определённое поведение.

Но у вас в коде его нет.

В данном примере у омлета может быть метод omelette.taste()

Как только вы его вызовете, код разве не станет императивным?

Но программа же должна что-то делать?

Предположительно. Но трюк в том, что (императивная) программа, работающая с декларативным участком, и сам этот участок — это, очевидно, не одно и то же.

На более высоком уровне может быть

а на более низком уже более императивный код.

Так вот, пойнт в том, что на этом «более высоком уровне» ООП (в его нормальном понимании) — нет.

Вопрос, однако, состоит в том, что же такое «правильное ООП» и где вы берете его определение.

(с Кеевским определением все понятно, под него этот код не попадает)

Это у вас свободная монада получилась. Поздравляю!

Получается Gherkin — ярчайший пример декларативного программирования?

приготовленная яичница из n яиц :- разбитые на горячую сковородку яйца в количестве n штук и выдержанные в таком состоянии до отвердения белка.
горячая сковородка :- сковородка, поставленная на огонь 4 минуты назад.
разбитое яйцо :- содержимое яйца отделенное от скорлупы

Вы действительно не перепутали заголовки?

Декларативный описывает «что?» — «готовая яичница», и если он чисто декларативный, то не содержит совершенно никакой информации как ее сделать. Пример HTML, XML.

Императивный говорит какие действия будут выполнены, а что из этого получится — не важно, это описание команд. Пример — Си.

А последний пример, это функциональный стиль.

Императивный подход — КАК добиться нужного результата. Например: button.setBackgroundColor(RED) (есть эта строчка кода, которая выполняется до каких-то других и после каких-то других; эта строчка — это команда что-то сделать — «установить цвет фона»)

Декларативный подход — ЧТО собой представляет нужный результат. Например: . (это не команда — мы не говорим «во-первых я хочу кнопку, а во-вторых — давайте ей установим красный цвет фона»; вместо этого мы описываем результат — кнопка с красным фоном)

Ваш пример для декларативного подхода «приготовь яичницу» — это на самом деле императивный подход, т.к. вы описываете не результат, а способ его достижения. Декларативно яичница выглядит вот так: «яичница».

Интересно — если в декларативном стиле утверждения не зависят от порядка следования и почти не зависят от друг друга — то получается, что они обладают свойством почти совершенной модульности: кусок декларативного текста можно вставить из программы «Домик в деревне» в программу «Катастрофа машины времени в Юрском периоде» и он прекрасно заработает, обжаривая яйца динозавров, вместо яиц их далёких пернатых потомков.

Звучит-то красиво, но попробуйте-ка перенести кусок HTML (он же декларативный) из одного веб-документа в другой.

Модульность за бесплатно нигде не раздают, за нее надо еще побороться. Просто в разных стилях программирования эта борьба принимает разные формы.

Считаете — модульность и объектность при программировании пора включать в олимпиадное программирование?

За это мы, махровые декларативщики, и боремся! Практически идеальны в этом отношении конкатенативные языки, такие как Joy или J.

Получится «Шахбокс» или «офицерское многоборье» для программистов — в первом раунде решаешь с выводом математический алгоритм (в т. ч. декларативно) и демонстрируешь вывод в LaTexe.
Во втором — разрабатываешь модульно-объектную структуру программы.
В третьем — набираешь и правишь стиль и успешно компилируешь.
В четвертом — показываешь навыки оптимизации с измерением быстродействия.
Всё, все стадии — на время и на очки.
И тогда мнения — «программист-олимпиадник — это феееее!» — не будет.

Декларативно яичница выглядит вот так: «яичница»

Ну, я бы так:
яичница.жареная = true;

ну и дальше уже, по фантазии 🙂
public bool жареная ; set

Это как раз императивный код.

Во-первых, нет: «ниже уровнем» HTML ничего нет — HTML просто чем-то интерпретируется.

Во-вторых, тот факт, что для работы декларативного подхода нужен написанный где-то императивный код, никак не влияет на то, что приведенный вами код — императивный.

Мне кажется, не очень правильно писать статью с объяснениями, в которых автор сам не уверен и путается (судя по комментариям). Можно кого-то научить чему-то плохому.
В статье действительно приведено два примера имеративного подхода, лишь на разном уровне абстракции.
Имхо, имеративный подход описывает алгоритм через последовательность действий, а декларвтивный использует набор деклараций.

div = docoment.getElementById(«#someid»);
for(var i=0; i

Хорошим примером декларативных подходов являются HTML, XML+XSLT. Различные файлы конфигураций (package.json etc) тоже в своем роде декларативных программы. Jasonette — декларативных фреймворк.
Отличным примером декларативного подхода в императивных языках являются аннотации (декораторы):
Имеративно:

class MyAnalyser extends Analyse …
>

Object.seal(MyAnalyser.constructor);
Object.seal(MyAnalyser.constructor.prototype);

@Sealed
class MyAnalyser extends Analyser …
>

Пока единственный пример декларативного описания яичницы дал @Unrull. В нём хорошо разделены описание и интерпретация.

Декларативное описание состоит из неупорядоченной последовательности определений, позволяющей однозначно редуцировать выражение, определяющее конкретную яичницу к нормальной форме. Саму яичницу будет делать исполнитель, он получит императивный объектный код, в который транслируется нормальная форма, определяющая яичницу. В решении @Unrull дана нормальная форма в виде свободной монады. Её соответствующей F-алгеброй можно интерпретировать в последовательность действий, в том числе, побочных.

Гораздо, впрочем, лучше разницу между декларативным и императивным подходами показывает пример с описанием изображения, скажем, домика:

Эту программу пишет и отлаживает человек. Всю вычислительную работу выполняют конструкторы примитивов square и triangle , а также универсальные комбинаторы: above , below , over и at .

Не удержусь, приведу пример функционального декларативного описания на Haskell.

Начнём с описания омлета:

В этом описании используются стандартные функции для создания и обработки коллекций: repeat , take и foldMap , универсальная функция: fried , полугруппа Scrambled ну, и, собственно, яйца.

Пусть для яйца и его частей будут определены атомарные типы:

Взбалтывать и жарить можно не только яйца. Для взболтанных продуктов определим тип-обёртку Scrambled . Взболтанные продукты образуют полугруппу: смесь двух взболтанных продуктов тоже является взболтанным продуктом, причём их смешивание ассоциативно.

Наконец, опишем универсальный процесс жарки:

Здесь используются универсальные функции из гипотетической библиотеки Reactive.Bananas.Cooking с такими сигнатурами:

Для абстракции времени тут используется реактивное программирование.

Видите ли какая штука. Инструкция «как приготовить яичницу» сама по себе императивна.

… в отличие от описания «яичница — это. «

Императивный функциональный код:

Или то же самое:

Или то же самое:

Декларативный объектный код:

Или то же самое:

Декларативное программирование — это набор верхнеуровневых инструкций, детали реализации которых скрыты за исполнителем этих инструкций.
Императивное программирование позволяет описывать инструкции с использованием «низкоуровневых» (в рамках ЯП) выражений.

Это, всё же, вопрос не парадигмы, а уровня абстракции. На ФЯП можно написать на чистых лямбдах или SKI комбинаторах весьма низкоуровневый код, а императивный FORTH позволяет выйти на любой уровень абстракции, расширяя словарь.

При этом, если подумать, любое выражение — в действтиельности задекларированная ЯП инструкция. Я бы это, своевольно, назвал одним из доказательств того что программа — это конечный автомат.

Программа, это инструкция для автомата, а не сам автомат. Но вы недалеки от истины с точки зрения вычислителя: правда не конечный автомат, а автомат с магазинами, или счётчиками, эквивалентен машине Тьюринга, а ЯП для написания программ для него — полон по Тюрингу. А именно с полными ЯП мы, обычно, и работаем.

Программа, это инструкция для автомата, а не сам автомат

На правах попытки разобраться в сказанном (статье + комментариях к ней). Тоже на днях встретился с вопросом понимания и соотнесения императивного и декларативного программирований.

Есть в русском языке понятие всё — которое как универсум в логике, включает в себя вообще всё. Это понятие можно сделать корнем мысленного дерева (грубо говоря на что взгляд не упадёт, какая мысль в голову не придёт — перечисленное будет частью понятия всё).

Основа процесса мышления — это выявление разнокачественностей, т.е. способность всё разделить на части (простейшая из которых пара из это и все_остальное_не_это).

Сам процесс мышления — это соотнесение между собой выявленных разнокачественностей с выявлением их взаимосвязей, упорядоченности и придание значений/значимости разнокачественностям, связям.

В контексте мышления встаёт вопрос о выявлении первичных различий у частей всего (по которым их можно было бы соотносить). Другими словами, если понятие всё делить на части, то из суммы каких понятий оно будет состоять на первом уровне деления, на первом уровне детализации?
Один из возможных ответов: материя-информация-мера.

С такой точки зрения на что не кинь взгляд, в нём можно выделить образ (цвет например), меру (соотношения частей), носитель (из чего состоит — будь то бумага с текстом, либо электромагнитные поля, хранящие и передающие текст).

Декларация либо утверждение, описание — это отражение информации. И тогда предельной формой утверждения будет картина/фотография. Делая описание чего-либо текстом, нам приходиться выбирать набор понятий которые использовать, широту и детальность описания. Следуя примеру:

  • Яичница состоит из яиц, соли, масла, при этом хорошая яичница — тёплая.
  • Яйца в яичнице жаренные — зачастую по нраву потребителя.

и да, должен быть кто-то/что-то способное её предоставить по требованию.

Выходит, что результатом декларативного программирование есть множество описаний чего-то (HTML+CSS — как должна выглядеть страница и что содержать, SVG — какие геометрические фигуры где и с какими параметрами отражать).

Описывать можно и меру — соотношения, алгоритмы, в частности задавать последовательность действий некоего исполнителя.

Императив либо повеление, команда, приказ. С такой точки зрения это тоже информация (информация направляемая исполнителю). Однако последовательность команд может отражать алгоритм, меру. Отсюда результатом императивного программирования есть набор последовательностей команд исполнителю (следуя которым исполнитель должен получить то, что мы от него хотели — яичницу).

При этом в декларативном программировании мы не задумываемся о том как будет получен результат (т.е. какие действия и на каком исполнители будут выполнены) — главное у нас есть набор описательных примитивов (div, input, span либо rect, path, p) — и нам нужно разбить выражаемую/отражаемую информацию на части и перенести в код (если в рамках примитивов это вообще выразимо), указав какие части и в каких взаимосвязях есть.

Императивное программирования предполагает отражения 2-х вещей: последовательности команд и параметров этих команд (что в сущности есть информация, часть из которой может быть введена декларативно, другая получена на ввод, третья — вычислена/преобразована из имеющейся). Тут мы так-же ограничены множеством возможных для выполнения команд исполнителя.
В js можно предположить, что у нас есть отражение робота повара в систему в виде встроенного объекта (cook), с методами отражающими известные ему команды. Для этого робота мы задаём последовательность действий типа найди сковородку, включи плиту, поставь сковородку на плиту, найди и налей масла… и т.д.

  1. декларативное программирование в общем случае возможно без императивного (исполнителем может быть и человек, способности которого — его данность);
  2. императивное без деклараций (пускай и в скрытом виде) сложно себе представить (только если все данные неким образом вводятся извне, а код только их преобразование описывает);
  3. говоря о декларативном программировании ожидают отражение в код информации (которая потом будет построена либо по которой будет что-то построено — описание цели);
  4. говоря о императивном программировании ожидают создание управляющей программы которая будет давать набор команд исполнителю чего делать что-бы получить требуемый результат (в первом приближении сам набор команд записанный в должной последовательности — поскольку в общем случае возможны разные стартовые ситуации, есть условия/ветвления, то я уточнил — создание управляющей программы, которая выдаст должную для данной ситуации последовательность команд).

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Источники:
  • http://studopedia.ru/2_48068_imperativnaya-i-deklarativnaya-paradigmi-programmirovaniya.html
  • http://tproger.ru/translations/imperative-declarative-programming-concepts/
  • http://textarchive.ru/c-2478371.html
  • http://lektsia.com/7x335f.html
  • http://habr.com/post/324688/