0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Императивные и декларативные языки программирования</a><ul><li><a>И снова код</a></li>
1
<ul><li><a>Императивные и декларативные языки программирования</a><ul><li><a>И снова код</a></li>
2
</ul></li>
2
</ul></li>
3
</ul><p>Вряд ли вы не слышали о таких понятиях, как<strong>декларативное и императивное программирование</strong>. В этой статье мы рассмотрим императивный и декларативный подход, а также основные<a>языки программирования</a>(programming language), которые эти подходы используют. Давайте начнем.</p>
3
</ul><p>Вряд ли вы не слышали о таких понятиях, как<strong>декларативное и императивное программирование</strong>. В этой статье мы рассмотрим императивный и декларативный подход, а также основные<a>языки программирования</a>(programming language), которые эти подходы используют. Давайте начнем.</p>
4
<p>Если посмотреть определение в англоязычной Википедии, мы увидим приблизительно следующее:</p>
4
<p>Если посмотреть определение в англоязычной Википедии, мы увидим приблизительно следующее:</p>
5
<p><em>При<strong>декларативная подходе</strong></em><em>выражается логика вычисления без отсутствия описания потока управления, тогда как в<strong>императивной</strong>парадигме программирования используются утверждения, изменяющие состояние программы.</em></p>
5
<p><em>При<strong>декларативная подходе</strong></em><em>выражается логика вычисления без отсутствия описания потока управления, тогда как в<strong>императивной</strong>парадигме программирования используются утверждения, изменяющие состояние программы.</em></p>
6
<p>С первого взгляда ничего не понятно, а словосочетания типа "парадигма программирования" и вовсе звучат слишком претенциозно. Такие фразы любят говорить профессоры в университетах, но это не добавляет понимания, если за ними не следуют конкретные примеры.</p>
6
<p>С первого взгляда ничего не понятно, а словосочетания типа "парадигма программирования" и вовсе звучат слишком претенциозно. Такие фразы любят говорить профессоры в университетах, но это не добавляет понимания, если за ними не следуют конкретные примеры.</p>
7
<p>Давайте попробуем объяснить более простыми словами:</p>
7
<p>Давайте попробуем объяснить более простыми словами:</p>
8
<ol><li>Императивный подход описывает<strong>, каким образом</strong>ты что-то делаешь.</li>
8
<ol><li>Императивный подход описывает<strong>, каким образом</strong>ты что-то делаешь.</li>
9
<li>Декларативный описывает,<strong>что именно</strong>ты делаешь.</li>
9
<li>Декларативный описывает,<strong>что именно</strong>ты делаешь.</li>
10
</ol><p>То есть в первом случае у нас стоит вопрос "Как?", а во втором - "Что?" И все равно разница ясна лишь интуитивно, поэтому без практических примеров не обойтись. Но начать лучше стоит с метафор.</p>
10
</ol><p>То есть в первом случае у нас стоит вопрос "Как?", а во втором - "Что?" И все равно разница ясна лишь интуитивно, поэтому без практических примеров не обойтись. Но начать лучше стоит с метафор.</p>
11
<p>Давайте представим, что вы попросили вашего товарища нарисовать пейзаж, а как он это сделает, для вас значения не имеет - это<strong>декларативный</strong>путь, когда дается ответ на вопрос "<strong>Что именно</strong>надо сделать?"</p>
11
<p>Давайте представим, что вы попросили вашего товарища нарисовать пейзаж, а как он это сделает, для вас значения не имеет - это<strong>декларативный</strong>путь, когда дается ответ на вопрос "<strong>Что именно</strong>надо сделать?"</p>
12
<p>В<strong>императивном</strong>случае ситуация следующая:</p>
12
<p>В<strong>императивном</strong>случае ситуация следующая:</p>
13
<p>- вы попросили товарища нарисовать пейзаж;</p>
13
<p>- вы попросили товарища нарисовать пейзаж;</p>
14
<p>- он попросил, к примеру, Никаса Сафронова, рассказать ему, как рисуются пейзажи;</p>
14
<p>- он попросил, к примеру, Никаса Сафронова, рассказать ему, как рисуются пейзажи;</p>
15
<p>- Никас Сафронов как мастер своего дела предоставил пошаговые инструкции -<strong>как именно</strong>нарисовать этот пейзаж.</p>
15
<p>- Никас Сафронов как мастер своего дела предоставил пошаговые инструкции -<strong>как именно</strong>нарисовать этот пейзаж.</p>
16
<h2>Императивные и декларативные языки программирования</h2>
16
<h2>Императивные и декларативные языки программирования</h2>
17
<p>Примеры<strong>декларативных</strong>языков программирования:</p>
17
<p>Примеры<strong>декларативных</strong>языков программирования:</p>
18
<ul><li>SQL;</li>
18
<ul><li>SQL;</li>
19
<li>HTML.</li>
19
<li>HTML.</li>
20
</ul><p><strong>Императивные</strong>языки:</p>
20
</ul><p><strong>Императивные</strong>языки:</p>
21
<ul><li>C,</li>
21
<ul><li>C,</li>
22
<li>C++,</li>
22
<li>C++,</li>
23
<li>Java.</li>
23
<li>Java.</li>
24
</ul><p>Также выделяют<strong>смешанные</strong>языки:</p>
24
</ul><p>Также выделяют<strong>смешанные</strong>языки:</p>
25
<ul><li>JavaScript,</li>
25
<ul><li>JavaScript,</li>
26
<li>C#,</li>
26
<li>C#,</li>
27
<li>Python.</li>
27
<li>Python.</li>
28
</ul><p>Говоря о языках, важно понимать, что у многих декларативных языков программирования существует определенный<strong>слой императивных абстракций</strong>- не забывайте об этом.</p>
28
</ul><p>Говоря о языках, важно понимать, что у многих декларативных языков программирования существует определенный<strong>слой императивных абстракций</strong>- не забывайте об этом.</p>
29
<p>Рассмотрим работу декларативных языков на примерах.</p>
29
<p>Рассмотрим работу декларативных языков на примерах.</p>
30
<p>Декларативный язык<strong>SQL</strong>:</p>
30
<p>Декларативный язык<strong>SQL</strong>:</p>
31
<p>Язык<strong>HTML</strong>:</p>
31
<p>Язык<strong>HTML</strong>:</p>
32
<p>Нам достаточно просто взглянуть на код, чтобы понять суть происходящего. Языки программи рования в данном случае заявляют, не<em>как</em>что-то надо сделать, а <em>что именно</em> должно быть сделано, поэтому можно говорит о декларативности. То есть мы описываем желаемый результат и не углубляемся в инструкции. И для нас абсолютно не имеет значения, как будет сделана выборка пользователей из Мексики и как web-браузер распарсит article. Главное, что мы получим этих самых пользователей, а также новый header и paragraph на веб-сайте.</p>
32
<p>Нам достаточно просто взглянуть на код, чтобы понять суть происходящего. Языки программи рования в данном случае заявляют, не<em>как</em>что-то надо сделать, а <em>что именно</em> должно быть сделано, поэтому можно говорит о декларативности. То есть мы описываем желаемый результат и не углубляемся в инструкции. И для нас абсолютно не имеет значения, как будет сделана выборка пользователей из Мексики и как web-браузер распарсит article. Главное, что мы получим этих самых пользователей, а также новый header и paragraph на веб-сайте.</p>
33
<h3>И снова код</h3>
33
<h3>И снова код</h3>
34
<p>Для следующего примера воспользуемся языком программирования<em>JavaScript</em>. Давайте представим, что мы находимся на собеседовании. Нам поставлены следующие задачи:</p>
34
<p>Для следующего примера воспользуемся языком программирования<em>JavaScript</em>. Давайте представим, что мы находимся на собеседовании. Нам поставлены следующие задачи:</p>
35
<p>- написать функцию с названием <em><a>double</a></em>, принимающую массив чисел и возвращающую новый массив, причем каждый элемент нового<a>массива</a>больше исходного в 2 раза:</p>
35
<p>- написать функцию с названием <em><a>double</a></em>, принимающую массив чисел и возвращающую новый массив, причем каждый элемент нового<a>массива</a>больше исходного в 2 раза:</p>
36
<p>- написать функцию с названием<em>add</em>, принимающую массив и возвращающую сумму всех элементов массива:</p>
36
<p>- написать функцию с названием<em>add</em>, принимающую массив и возвращающую сумму всех элементов массива:</p>
37
<p>- используя библиотеку<em>jQuery</em>(либо чистый язык<em>JavaScript</em>), выполните добавление обработчика событий <em>click </em>к элементу с идентификатором (<em>id</em>), равным <em>btn</em>. При нажатии выполните переключение класса <em>highlight </em>и замените текст на <em>Add Highlight</em> либо <em>Remove Highlight</em>с учетом того, каково текущее состояние элемента.</p>
37
<p>- используя библиотеку<em>jQuery</em>(либо чистый язык<em>JavaScript</em>), выполните добавление обработчика событий <em>click </em>к элементу с идентификатором (<em>id</em>), равным <em>btn</em>. При нажатии выполните переключение класса <em>highlight </em>и замените текст на <em>Add Highlight</em> либо <em>Remove Highlight</em>с учетом того, каково текущее состояние элемента.</p>
38
<p>Задания, есть, давайте попробуем их решить. Начнем с императивной парадигмы и воспользуемся наиболее распространенными подходами.</p>
38
<p>Задания, есть, давайте попробуем их решить. Начнем с императивной парадигмы и воспользуемся наиболее распространенными подходами.</p>
39
<p>Теперь поговорим, что общего у этих примеров, и почему они являются именно императивными, а не декларативными:</p>
39
<p>Теперь поговорим, что общего у этих примеров, и почему они являются именно императивными, а не декларативными:</p>
40
<ol><li>Во всех случаях описывается, <em>как именно</em> решить проблему, то есть явно указываются все шаги по решению поставленной задачи.</li>
40
<ol><li>Во всех случаях описывается, <em>как именно</em> решить проблему, то есть явно указываются все шаги по решению поставленной задачи.</li>
41
<li>Следующий момент не так очевиден для тех, кто имеет привычку думать декларативно либо даже функционально. В каждом из вышеописанных примеров осуществляется<strong>изменение</strong>какого-нибудь состояния. И если в первых 2-х случаях происходит изменение переменной <em>results</em>, то в 3-м случае состояние находится в самой DOM, причем его мы тоже меняем.</li>
41
<li>Следующий момент не так очевиден для тех, кто имеет привычку думать декларативно либо даже функционально. В каждом из вышеописанных примеров осуществляется<strong>изменение</strong>какого-нибудь состояния. И если в первых 2-х случаях происходит изменение переменной <em>results</em>, то в 3-м случае состояние находится в самой DOM, причем его мы тоже меняем.</li>
42
<li>Если говорить субъективно, то код можно считать, по сути,<strong>нечитаемым</strong>. А все потому, что с первого раза вы вряд ли поймете, что конкретно происходит, - вместо этого вам придется внимательно читать программный код построчно.</li>
42
<li>Если говорить субъективно, то код можно считать, по сути,<strong>нечитаемым</strong>. А все потому, что с первого раза вы вряд ли поймете, что конкретно происходит, - вместо этого вам придется внимательно читать программный код построчно.</li>
43
</ol><p>Переходим к<strong>декларативному</strong>подходу. Наша цель, как и прежде, заключается в том, чтобы решить все вышеописанные задачи. Также каждое решение должно описывать, что конкретно происходит, а также быть читаемым и неизменяемым.</p>
43
</ol><p>Переходим к<strong>декларативному</strong>подходу. Наша цель, как и прежде, заключается в том, чтобы решить все вышеописанные задачи. Также каждое решение должно описывать, что конкретно происходит, а также быть читаемым и неизменяемым.</p>
44
<p>Теперь стало гораздо лучше, не находите?</p>
44
<p>Теперь стало гораздо лучше, не находите?</p>
45
<p>Обратите внимание, что в первых 2-х примерах применяются встроенные в язык<em>JavaScript</em>методы: <em>map </em>и <em>reduce</em>. То есть в нашем случае декларати вное программирование - это<strong>абстракции</strong>над императивными реализациями, но на деле нас мало волнует, как эти методы реализованы. Мы тоже не меняем состояния, да и сам программный код стал более читаемым.</p>
45
<p>Обратите внимание, что в первых 2-х примерах применяются встроенные в язык<em>JavaScript</em>методы: <em>map </em>и <em>reduce</em>. То есть в нашем случае декларати вное программирование - это<strong>абстракции</strong>над императивными реализациями, но на деле нас мало волнует, как эти методы реализованы. Мы тоже не меняем состояния, да и сам программный код стал более читаемым.</p>
46
<p>В 3-м примере при написании кода мы пошли на хитрость, так как задействовали библиотеку языка<em>JavaScript</em>под названием<em>React</em>. Но важно не это, а то, что все 3 императивные ошибки нами исправлены. Да и само программи рование на<em>React</em>хорошо еще и тем, что предоставляет возможность создавать декларативные пользовательские интерфейсы. Если посмотреть на тот же компонент<em>Btn</em>, сразу становится понятно, как конкретно станет выглядеть интерфейс. А еще состояния "живут" не в DOM, а непосредственно в React-компоненте.</p>
46
<p>В 3-м примере при написании кода мы пошли на хитрость, так как задействовали библиотеку языка<em>JavaScript</em>под названием<em>React</em>. Но важно не это, а то, что все 3 императивные ошибки нами исправлены. Да и само программи рование на<em>React</em>хорошо еще и тем, что предоставляет возможность создавать декларативные пользовательские интерфейсы. Если посмотреть на тот же компонент<em>Btn</em>, сразу становится понятно, как конкретно станет выглядеть интерфейс. А еще состояния "живут" не в DOM, а непосредственно в React-компоненте.</p>
47
<p>Нельзя не вспомнить и еще одно важное преимущество декларативного кода:<strong>он является контекстно-независимым</strong>. Все это означает, что данный код вы сможете использовать практически в любой программе без каких-либо изменений.</p>
47
<p>Нельзя не вспомнить и еще одно важное преимущество декларативного кода:<strong>он является контекстно-независимым</strong>. Все это означает, что данный код вы сможете использовать практически в любой программе без каких-либо изменений.</p>
48
<p><em>По материалам статей:</em></p>
48
<p><em>По материалам статей:</em></p>
49
<ul><li><em>"Imperative vs Declarative Programming" - https://ui.dev/imperative-vs-declarative-programming/;</em></li>
49
<ul><li><em>"Imperative vs Declarative Programming" - https://ui.dev/imperative-vs-declarative-programming/;</em></li>
50
<li><em>"Declarative vs Imperative Programming" - https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2.</em></li>
50
<li><em>"Declarative vs Imperative Programming" - https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2.</em></li>
51
</ul>
51
</ul>