Что такое императивное управление процессами

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

Предыстория

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

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

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

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

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

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

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

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

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

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

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

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

Пример на JS

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

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

Источник

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

Или насколько неверным было мое представление о React

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

Feb 11, 2018 · 4 min read

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

Если вы читали документацию React, вы, вероятно, заметили, что React является декларативным. Обычно я пропускаю такого рода инфорамцию— согласен, не очень хорошая привычка. (Дайте мне скорее примеры кода!) Но как и всякий, кто начал изучать React сразу после колледжа, я часто думал о задачах неправильно.

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

Что такое декларативное и императивное программирование?

Согласно этой и этой информации:

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

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

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

Хорошо, вот метафора.

Декларативное программирование — это как попросить вашего друга нарисовать пейзаж. Тебе все равно, как он рисует, это зависит от него.

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

Продемонстрируй в коде

Ладно, ладно, вот несколько примеров кода. У нас есть кнопка, которая меняет цвет при нажатии. Я начну с императивного примера:

И пример нашего декларатвного React:

Возможно, различия незначительны. У нас по-прежнему есть логика, которая говорит: если красный, значит синий, но есть одна огромная разница. Пример c React никогда не затрагивает элемент. Он просто объявляет, что элемент должен отображаться с учетом нашего текущего состояния (далее — state). Он фактически не манипулирует самим DOM.

Использование прямого манипулирования DOM является ошибкой, которую я часто делал, когда впервые начал работать с React. Я заметил, что это тоже является проблемой для разработчиков, у которых большой опыт в jQuery.

При написании React зачастую нужно думать не о том, как вы хотите достичь результата, а об внешнем виде компонента с его новым state. Это заставляет нас хорошо контролировать поток, где state проходит через серию предсказуемых и воспроизводимых мутаций. Это относится не только к компонентам, но и к state самого приложения. Библиотеки, такие как Redux, могут помочь реализовать этот архитектурный подход, но они не обязательны для достижения этой цели.

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

Чего следует избегать

Я либо допустил, либо позволил допустить все эти ошибки в коде, над которым работал. Это всего лишь советы.

Источник

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

Авторизуйтесь

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

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Императивное и декларативное программирование простым языком — объясняют эксперты

Авторизуйтесь

Императивное и декларативное программирование простым языком — объясняют эксперты

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

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

технический директор центра инновационных технологий и решений «Инфосистемы Джет»

Императивные языки, такие, как Java, Python, JavaScript, C, C++ занимают доминирующее положение в индустрии ПО, соответственно императивное программирование — самое распространённое. Смысл его в том, что императивная программа содержит прямые указания, что должен сделать компьютер и в каком порядке должны выполняться инструкции. Этот подход легко понять программисту, а компилятору — легко породить достаточно эффективный код.

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

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

Вообще в декларативных языках обычно отсутствует изменение переменных или обычно спрятано за каким-либо специальным механизмом.

Самый популярный язык РСУБД SQL так же является декларативным. На нём описывается конечный результат, а способ его получения генерируется сервером СУБД исходя из множества факторов.

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

Конечно, практически все основные языки сочетают в себе элементы и декларативного и императивного программирования. Огромное влияние оказывает функциональное программирование на JavaScript, Java, C++, C# и т.д.

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

ведущий системный программист компании «Аэродиск»

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

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

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

Сейчас широко распространены как узкоспециализированные декларативные языки программирования (HTML + CSS, SVG, VRML, SQL, lex/VACC), в том числе функциональные (Haskell, Erlang, Scala), так и императивные языки (C/C++/C#, Java, Go, Rust, Python). Однако практически все современные языки программирования общего назначения высокого уровня, за исключением некоторых функциональных, относятся к императивным языкам.

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

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

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

руководитель отдела разработки ECM «Техносерв Консалтинг»

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

Рассмотрим ещё один пример. Допустим, мы хотим приготовить обед.

В императивной парадигме это выглядит как-то так:

В декларативной: хочу на обед жареное мясо с овощами (неплохо звучит, правда? :)).

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

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

Источник

Императивное программирование

Что такое императивное управление процессами. Смотреть фото Что такое императивное управление процессами. Смотреть картинку Что такое императивное управление процессами. Картинка про Что такое императивное управление процессами. Фото Что такое императивное управление процессами

В этой статье вы прочитаете что такое «Императивное программирование», зачем нужно, думаю будет очень интересно.

Также посмотрите статью «Что такое метапрограммирование», тоже очень интересно.

Императивное программирование:

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

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

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

Основным методом императивного программирования является процедурное программирование, поэтому эти термины часто путают.

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

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

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

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

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

Первыми императивными языками программирования были машинные языки отдельных компьютеров.

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

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

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

Тогда языки COBOL (1960) и BASIC (1964) были попыткой адаптировать синтаксис программирования к синтаксису естественного языка — английского.

Для нужд Министерства обороны США в 1978 году, после четырех лет обобщения требований, Джин Ичбиа и команда Honeywell приступили к разработке языка Ada. Спецификация была впервые опубликована в 1983 году и пересматривалась в 1995 и 2005/6 гг.

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

Деление:

В конечном итоге императивное программирование можно разделить на три группы.

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

Наивные языки характеризуются своего рода вездесущим хаотизмом, обычно имеют бессистемный синтаксис и семантику.

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

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

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

Основные типы команд:

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

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

Циклы позволяют повторять последовательность команд несколько раз подряд. Затем можно точно определить количество повторений или последовательность может повторяться до тех пор, пока указанное условие не изменится.

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

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

Отличия в противоположном подходе:

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

С другой стороны, при императивном подходе программист может оптимизировать программу так, как ему нужно.

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

Вывод:

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *