Что такое императивный стиль
Перейти к содержимому

Что такое императивный стиль

  • автор:

СУЭБ ИВТ СО РАН

Словарь терминов в коллекции: Thesaurus of Information Technology (zthes_cat)

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

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

(NT) Императивное программирование (add ) [ru]

Головные термины: [BT] Модель вычислений фон Неймана [ru] [BT] Парадигма программирования [ru] [BT] Парадигмы программирования [ru] Дочерние термины: [NT] Ассемблер [ru] [NT] Императивные языки программирования [ru] [NT] Программирование структурное [ru] [NT] Процедурное программирование [ru] [NT] Процедурный язык Ключевые термины, связанные с термином [RT] Машина Тьюринга-Поста [ru]

© 2013-2023, Евразийский национальный университет им. Л.Н.Гумилева, Астана
© 2007-2023, Новосибирский государственный университет, Новосибирск
© 1998-2023, Институт вычислительных технологий СО РАН, Новосибирск
© 1998-2023, Федотов А.М.

ФИТ НГУ НГУ
ЕНУ им.Гумилева
ИВТ СО РАН
Дата последней модификации: 01.06.2015

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример на JS

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

function double (arr) < let results = []; for (let i = 0; i < arr.length; i++)< results.push(arr[i] * 2); >return results; > 
function double (arr) < return arr.map((item) =>item * 2); > 

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

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

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

Что такое Декларативный и Императивный подход?

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

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

Так же и в программировании. Декларативный подход позволяет вам получить необходимый результат, не углубляясь в детали используемых функций. Например в React-e используется именно такой подход. Благодаря этому вы записываете, как должна выглядеть ваша страница, а не как ее отобразить:

Ну ладно, возможно слишком громко сказано, но согласитесь: код выглядит почти как фраза на английском. В предыдущем примере вам пришлось самому разобраться, что number % 2 === 0 будет true только если — чётное число. Определить, что тут number * 2 — полученное число умножаем на два. И последнее, что acc + next означает, что мы складываем текущее число с предыдущим.

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

Ну вот мы довольно неплохо сократили наш код. А как известно, чем меньше кода, тем меньше ошибок, верно?

И вот я уже слышу недоумение: — Но декларативное программирование по-прежнему использует императивное программирование под капотом, поэтому невозможно писать только декларативный код!

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

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

Идём дальше

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

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

И так, давайте разберёмся что это такое:

  • Композиция функций (function composition) — это процесс использования результата функции в качестве входных данных другой функции, например: let foo = bar(baz(x));
  • Чистые функции (pure funtions) — функция при вызове которой, выполняются два условия: она возвращает один и тот же результат при одном и том же вводе и не имеет побочных эффектов.
  • Побочные эффекты (side-effects) — это любое действие внутри функции, которое воздействует на внешнее состояние (вне функции).
  • Неизменяемые данные (immutable) — это любые объекты, которые не могут быть изменены после их создания.

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

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

Если хотите ещё сильнее погрузиться в функциональное программирование, прочтите вот эти статьи:

  • Что такое функциональное программирование?
  • Руководство по функциональному программированию

Важно видеть разницу

Декларативное программирование противоположно императивному программированию и только ему. То есть вы обычно можете комбинировать их со всеми другими парадигмами программирования, такими как те, которые я упомянул. Главное не думать, что вам необходимо выбирать между “императивным и функциональным программированием” или “декларативным и объектно-ориентированным программированием”, потому что это все равно что сравнивать яблоки и апельсины.

Заключение

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

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

Нисходящий и восходящий метод программирования: особенности и отличия

Как структурное программирование помогает создавать эффективный и надежный код

Асинхронное программирование: что это такое и его особенности

Методологии Agile: SCRUM, Kanban и другие с точки зрения руководителя и разработчика

Парное программирование: принципы, преимущества, недостатки и рекомендации

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

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

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

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

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

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

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

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

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

  • SQL (Structured Query Language) — используется для работы с базами данных;
  • Prolog — для решения логических задач;
  • Haskell — для функционального программирования;
  • XSLT (Extensible Stylesheet Language Transformations) — для преобразования XML-документов;
  • R — язык программирования для статистического анализа данных и многие другие.

Различия между императивным и декларативным программированием

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

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

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

Преимущества и недостатки каждого подхода

Императивный метод Декларативный метод
Преимущества — Позволяет более точный контроль над состоянием программы- Легко понимаемый для начинающих программистов- Универсальный подход- Более эффективен для некоторых типов задач, включая манипуляцию со структурами данных — Позволяет описывать, что нужно получить, а не как это сделать- Облегчает параллельное и распределенное программирование- Более легкий для оптимизации и анализа программы- Не требует явного управления состоянием программы
Недостатки — Не так легко масштабируется на больших проектах- Сложнее отлаживать из-за большей склонности к ошибкам — Требует более высокого уровня абстракции и знаний языка программирования- Менее эффективен для задач, связанных с манипуляцией структурами данных и производительностью

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

Как выбрать подход к программированию

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

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

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

Заключение

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

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

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