Программирование – задача по созданию компьютерных программ и приложений. Включает в себя алгоритмы и структуры данных. Такое определение программированию дал один из основателей ЯП – Никлаус Вирт.
Программирование базируется на языках программирования. С их помощью пишется программный код для решения той или иной задачи. При обработке получившейся записи на выходе получается готовое приложение.
Существует еще одно понятие, которое применяется относительно написания программ – разработка. Это процедура создания приложения «с нуля». Алгоритм, характеризующийся полноценным написанием ТЗ, а также тестирование и формирование кода. Более широкое понятие. Программист создает решение для конкретной задачи, узконаправленно, разработчик – для всего проекта. Далее предложенные термины будем использовать в значении «написание кода».
Программирование и разработка бывают разными: динамическими, функциональными, объектно-ориентированными. Данная статья расскажет о первом варианте. Алгоритм динамического программирования тесно связан с решением математических задач. Он широко применяется в разработке программного обеспечения.
Определение
Динамическое программирование – способ решения сложных алгоритмов путем их разбиения на более простые подзадачи. Метод или своеобразная техника, позволяющие разобраться с проблемами комбинаторики, оптимизации и им подобными.
Алгоритмы динамического программирования – методики компьютерной разработки, помогающие эффективно решать класс задач, имеющих перекрывающие подзадачи и оптимальные свойства подструктуры.
Предложенные проблемы подразумевают многократное вычисление значений одних и тех же подзадач. Это необходимо для того, чтобы подобрать оптимальное для выдвинутой проблемы решение.
Историческая справка
Термин «динамическое программирование» (ДП) появилось в 1940-х годах. Оно было использовано Ричардом Беллманом. Так он описывал процесс нахождения решения задачи, где ответ на один вопрос может быть получен только после предыдущего.
К 1953 году Ричард изменил определение, приведя его к современному толкованию. С тех самых пор термин применим не только к математике, но и к разработке. Здесь «программирование» к непосредственному написанию кода не имеет никакого отношения. Это понятие обозначает оптимальную последовательность действий для получения результирующей по тому или иному вопросу. Пример – определенное расписание событий на выставке.
Какие задачи решает
При помощи ДП можно решать разные вопросы – не только в обыденной жизни, но и в непосредственной разработке ПО:
- Задачи комбинаторики. Они отвечают на вопрос о том, сколько существует объектов с теми или иными свойствами, или сколько элементов существует с заданными параметрами.
- Задачи оптимизации. Они связаны с максимизацией или минимизацией целевой функции. Пример – максимизировать вероятность того, что имеющаяся система не выйдет из строя, максимизировать математическое ожидание получения доходов.
Получаемые решения можно использовать в обыденной жизни и в разработке ПО. Примеры из реальной жизни:
- Построение маршрута. Алгоритм позволяет построить путь через несколько заданных точек. Такая концепция встречается в онлайн-картах и программах вызова такси.
- Компьютерные сети. Если нужно получить решение о выборе пути доставки пакета информации по нескольким адресам. При использовании ДП производятся необходимые расчеты, а на выходе получается последовательность передачи.
- Сжатие изображений. Суть данного процесса заключается в уменьшении изначального размера файла за счет выделения схожих областей картинки. Это означает, что при реализации задачи содержимое изображения будет меняться, но ее внешний вид должен оставаться неизменным. Подобного результата добиться проблематично.
При помощи динамического программирования можно значительно ускорить решение алгоритмических задач. Объем используемой памяти в соответствующем вопросе не является константой. Для решения больших задач придется увеличить соответствующий параметр.
Ключевые идеи
Для того, чтобы решить поставленную задачу, обычно нужно разделить ее на отдельные части – подзадачи. Далее – объединить их решения в одно общее. Некоторые подзадачи оказываются одинаковыми. Алгоритмы в динамическом программировании заключаются в том, чтобы решить каждую подзадачу только один раз и сократить за счет этого количество вычислений. Существуют ключевые понятия, помогающие усвоить рассматриваемый термин:
- Метод динамического программирования сверху – это простое запоминание результатов решения подзадач, которые могут повторно встретиться.
- Метод ДМ снизу. Это преобразование сложной задачи в рекурсивную последовательность более простых решений.
- Оптимальная подструктура – указывает на то, что оптимальное решение подзадач меньшего объема может быть использовано для первоначально поставленной цели.
- Перекрывающие подзадачи – подзадачи, которые используются для решения некоторого количества задач (более одной) большего размера. Яркий пример – вычисление чисел Фибоначчи.
- Мемоизация – сохранение решений ранее известных подзадач и их извлечение из памяти в случае обнаружения аналогичных алгоритмов для вычислений.
При помощи ДП можно решить множество разнообразных задач – не только в математике, но и в разработке ПО. Оно обладает несколькими свойствами, а также подходами к достижению обозначенных изначально целей.
Свойства и концепции
На основании изученной информации можно сделать вывод о том, что динамическое программирование пользуется следующими свойствами задачи:
- перекрывающиеся подзадачи;
- оптимальная подструктура;
- возможность сохранения решения часто встречающихся подзадач.
Подходов к разработке решений несколько:
- Нисходящее ДП. В данном случае «цель» разбивается на задачи меньшего размера. Они решаются, после чего комбинируются для получения итогового решения. Здесь используется запоминание алгоритмов уже решенных подзадач.
- Восходящее ДП. При нем все подзадачи, которые позже пригодятся для решения исходной задачи, просчитываются заранее.
Вторая схема является более совершенной. Соответствующий принцип целесообразен в плане объема стека и необходимого количества функций. Стоит обратить внимание на то, что иногда бывает проблематично определиться со спектром необходимые подзадач для получения желаемого итогового результата.
Что нужно для формирования решения
Основные концепции в динамическом программировании задач рассмотрены. Данная «схема» в разработке позволяет дробить задание на более мелкие (два и более) компоненты. Соответствующий принцип можно применять повсеместно, особенно при решении сложных вопросов.
Для того, чтобы использовать ДП при разработке алгоритмов, потребуется:
- Идея или цель. То, что будет разделяться на несколько маленьких шагов.
- Исходные данные.
- Таблица, в которую будут вноситься промежуточные результаты. Один из них станет результирующим.
- Правила по заполнению пустых ячеек таблицы. Они опираются на значение в уже заполненных блоках. Для каждой цели применяется свой подход по поиску оптимального решения.
- Принцип выбора алгоритма, который нужно применять для достижения изначально обозначенной цели.
Данная схема позволяет понять, без чего невозможно решить обозначенный вопрос. Если нет хотя бы одного компонента, применить алгоритмы ДП нельзя. Результат может оказаться непредвиденным.
Преимущества и недостатки
Перед тем как учить основные языки для задач по динамическому программированию, требуется понять, какие преимущества и недостатки имеет такой подход. В реальной жизни он просто может оказаться запутанным и сложным. В случае с разработкой ситуация немного меняется.
Плюсы
Основные преимущества:
- Скорость. ДП выступает весьма эффективным подходом при решении самых разных вопросов. Вычислительная способность остается на достойном уровне даже в сложных задачах.
- Универсальность. Для любого сложного вопроса обязательно можно найти более мелкие и простые подзадачи, способные помочь в получении желаемого результата.
- Точность. Это главное преимущество, которым обладает динамическое программирование. Оно позволяет охватить все возможные варианты развития событий. Такая схема дает возможность обозначить наиболее оптимальное решение без погрешностей и неоднозначностей.
Динамическое программирование, несмотря на свои преимущества, все равно остается неидеальным. Иногда его применение оказывается нецелесообразным из-за ряда недостатков соответствующей концепции.
Минусы
Рассматриваемый алгоритм широкой распространен в реальной жизни и создании программного обеспечения. При динамическом программировании задач необходимо учиты��ать следующие минусы схемы:
- Когнитивная нагрузка. Компактная система правил, позволяющая обнаружить наиболее оптимальную работающую схему для достижения поставленной цели привлекает, но она часто увеличивает нагрузку. Требуется обладать соответствующим навыком мышления (математическим, логическим), чтобы сопоставлять системы таблиц и разбираться в них.
- Память. Особо актуальная проблема для каждого старого аппарата. Все устройства обладают определенной памятью, за счет которой обеспечивается скорость его работы. Если вычислительная способность компьютера небольшая, а обозначенная проблема выражена крупным приложением, результат окажется печальным. Программа начнет потреблять много памяти, тормозить, а иногда – работать с ошибками.
Теперь можно сделать простой вывод – нельзя использовать ДП при разработке особо крупных проектов, если для запуска используется маломощный аппарат. Чем выше вычислительная способность, тем лучше и быстрее будет работать запущенный алгоритм.
Реализации и языки
С ДП удалось разобраться должным образом, поэтому теперь можно рассмотреть примеры реализации и языки, использующие соответствующую концепцию.
Языками динамической разработки (программирования) тех или иных задач (ДЯ) называется класс языков разработки высокого уровня. Они при запуске выполняют большинство общих программных алгоритмов.
ДЯ – это язык разработки, позволяющий определять типы данных и производить синтаксический анализ, а также компиляцию сразу, непосредственно при выполнении написанной программы. Используется для быстрого формирования готового к функционированию кода проекта.
Методы динамической разработки (программирования) используются в языках:
- Ruby;
- Smalltalk;
- TCL;
- Perl;
- PHP;
- Python;
- JavaScript.
Некоторые черты рассмотренной концепции имеет Visual Basic. Разработчики иногда характеризуют ДП как классический подход создания скриптов.
Реализации
Во время изучения ДП и ДЯ нужно обратить внимание на то, какие реализации можно использовать:
- Функция eval. Она встречается в некоторых языках. Принимает строки и выполняет их. Если принятый код включает в себя выражение, будет рассчитан результат, после чего он вернется в качестве результирующего значения. Eval может использоваться для замены функций высшего порядка.
- Изменение среды выполнения объекта. Во время выполнения кода тип или объект можно изменять. Данный момент применим относительно деревьев типов, а также к наследованию. Вследствие этого меняется поведение изначально заданных элементов кода.
- Переменное распределение памяти. Статические языки разработки требуют заблаговременного выделения памяти перед компиляцией. При использовании ДП нельзя сделать это заранее. Память должна быть посчитана и выделена в соответствие с непосредственно выполняемыми операциями (в динамике по ходу работы кода).
- Отражение. Присутствует во многих ДЯ. Подразумевает анализ типов и метаданных общей или полиморфной информации. Может включать в себя полную оценку и изменение кода в виде функции для анализа S-выражений.
- Макросы. Некоторые ДЯ предоставляют функции, сочетающие интроспекцию и eval-функции. Они называются макросами. В C++ и C макросы являются статическими функциями, которые поддерживают исключительно строковые подстановки в тексте программы. Задачи динамического программирования требуют от них обеспечения доступа ко внутренней работе аппарата (компилятора), а также полный доступ к интерпретатору, виртуальной мине или среде выполнения.
На основе предложенного материала можно сделать вывод о том, что макросы в ДЯ – это алгоритм, состоящий из языковых конструкций, позволяющих оптимизировать исходный код программы, а также корректировать синтаксис и грамматику языка.
Классические примеры
Чтобы лучше разобраться в изучаемой теме, рекомендуется рассмотреть примеры задач по динамической разработке (программированию). Далее будут представлены несколько классических проблем, а также коды для их решения. За основу будет взята последовательность Фибоначчи.
Нахождение чисел Фибоначчи – это классическая задача ДП. Она задается формулой:
Fn = Fn-1 + Fn-2, где n>1, F1 = 1, F2 = 1.
Fn необходимо найти по заданному программисту номеру. Самый логичный и эффективный прием – это использование ре курсии. Выглядит данный подход так:
int F(int n) {
if (n < 2) return 1;
else return F(n - 1) + F(n - 2);
}
При использовании соответствующей функции происходит «расчет с конца». Шаг за шагом значение n уменьшается до известных параметров.
Недостаток подхода – сложность. Если n = 50 или 40, приложение будет работать достаточно долго. Связано это с тем, что одни и те же промежуточные данные вычисляются несколько раз.
Избавиться от данного недостатки можно за счет сохранения уже найденных промежуточных значений для повторного использования. В виде кода это выглядит так:
int F(int n) {
if (A[n] != -1) return A[n];
if (n < 2) return 1;
else {
A[n] = F(n - 1) + F(n - 2);
return A[n];
}
}
Последняя схема является корректной и эффективной, но для обнаружения последовательности Фибоначчи есть и другой алгоритм. Он выглядит так:
F[0] = 1;
F[1] = 1;
for (i = 2; i < n; i++) F[i] = F[i - 1] + F[i - 2];
Это – пример расчетов «с начала». Изначально происходит заполнение известными значениями, а затем производится первое неизвестное, второй и так далее. Делается это до тех пор, пока приложение не достигнет нужного компонента.
Секрет быстрого изучения
Динамическое программирование самостоятельно бывает весьма проблематично, особенно на первых порах. Для того, чтобы быстрее разобраться с ним, а также подобрать оптимальный язык разработки на нем, рекомендуется посетить дистанционные онлайн курсы. Пример – от образовательного центра OTUS.
Здесь:
- занятия проводятся через интернет, благодаря чему их можно совмещать с работой, семьей и иными делами;
- курсы делятся на направления в зависимости от первоначального спектра знаний пользователя;
- можно выбрать сразу несколько областей IT для изучения;
- сжатые сроки обучения – некоторые курсы длятся всего несколько месяцев;
- постоянное кураторство;
- интересные домашние задания и богатая практика;
- помощь в формировании первого портфолио, а также в трудоустройстве;
- материал подается понятным языком – разберется даже новичок.
По завершении курсов пользователи получают электронные сертификаты установленного образца. С их помощью удастся подтвердить приобретенный спектр навыков и знаний в выбранном направлении.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Динамическая разработка: особенности и языки OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Программирование – задача по созданию компьютерных программ и приложений. Включает в себя алгоритмы и структуры данных. Такое определение программированию дал один из основателей ЯП – Никлаус Вирт. Программирование базируется на языках программирования. С их помощью пишется программный код для решения той или иной задачи. При обработке получившейся записи на выходе получается готовое приложение. Существует еще" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/dinamicheskaya-razrabotka-osobennosti-i-yazyki/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#article","name":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u044f\u0437\u044b\u043a\u0438 OTUS","headline":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u044f\u0437\u044b\u043a\u0438","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/02\/oj-1080x720-25.jpg","width":2245,"height":1587},"datePublished":"2023-02-05T15:42:14+00:00","dateModified":"2023-02-05T15:45:57+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#listItem","position":2,"name":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u044f\u0437\u044b\u043a\u0438","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#webpage","url":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/","name":"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u044f\u0437\u044b\u043a\u0438 OTUS","description":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2013 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0434\u0430\u043b \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u042f\u041f \u2013 \u041d\u0438\u043a\u043b\u0430\u0443\u0441 \u0412\u0438\u0440\u0442. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0435","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/02\/oj-1080x720-25.jpg","@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/#mainImage"},"datePublished":"2023-02-05T15:42:14+00:00","dateModified":"2023-02-05T15:45:57+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/5471" /><link rel='shortlink' href='https://otus.ru/journal/?p=5471' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-5471 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-5471" class="the-post post-5471 post type-post status-publish format-standard has-post-thumbnail category-polza tag-programmirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Динамическая разработка: особенности и языки
</h1>
<a href="https://otus.ru/journal/dinamicheskaya-razrabotka-osobennosti-i-yazyki/" class="date-link" data-wpel-link="internal"><time class="post-date">5 февраля, 2023</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-25.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Динамическая разработка: особенности и языки" title="Динамическая разработка: особенности и языки" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-25-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-25-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-25-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0" title="Историческая справка">Историческая справка</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9A%D0%B0%D0%BA%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D1%80%D0%B5%D1%88%D0%B0%D0%B5%D1%82" title="Какие задачи решает">Какие задачи решает</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%B8%D0%B4%D0%B5%D0%B8" title="Ключевые идеи">Ключевые идеи</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8" title="Свойства и концепции">Свойства и концепции</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%A7%D1%82%D0%BE_%D0%BD%D1%83%D0%B6%D0%BD%D0%BE_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F" title="Что нужно для формирования решения">Что нужно для формирования решения</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8" title="Преимущества и недостатки">Преимущества и недостатки</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9F%D0%BB%D1%8E%D1%81%D1%8B" title="Плюсы">Плюсы</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9C%D0%B8%D0%BD%D1%83%D1%81%D1%8B" title="Минусы">Минусы</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8" title="Реализации и языки">Реализации и языки</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8" title="Реализации">Реализации</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B" title="Классические примеры">Классические примеры</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%A1%D0%B5%D0%BA%D1%80%D0%B5%D1%82_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B8%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F" title="Секрет быстрого изучения">Секрет быстрого изучения</a></li></ul></nav></div>
<p>Программирование – задача по созданию компьютерных программ и приложений. Включает в себя алгоритмы и структуры данных. Такое определение программированию дал один из основателей ЯП – Никлаус Вирт.</p>
<p>Программирование базируется на языках программирования. С их помощью пишется программный код для решения той или иной задачи. При обработке получившейся записи на выходе получается готовое приложение.</p>
<p>Существует еще одно понятие, которое применяется относительно написания программ – разработка. Это процедура создания приложения «с нуля». Алгоритм, характеризующийся полноценным написанием ТЗ, а также тестирование и формирование кода. Более широкое понятие. Программист создает решение для конкретной задачи, узконаправленно, разработчик – для всего проекта. Далее предложенные термины будем использовать в значении «написание кода».</p>
<p>Программирование и разработка бывают разными: динамическими, функциональными, объектно-ориентированными. Данная статья расскажет о первом варианте. Алгоритм динамического программирования тесно связан с решением математических задач. Он широко применяется в разработке программного обеспечения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p>Динамическое программирование – способ решения сложных алгоритмов путем их разбиения на более простые подзадачи. Метод или своеобразная техника, позволяющие разобраться с проблемами комбинаторики, оптимизации и им подобными.</p>
<p>Алгоритмы динамического программирования – методики компьютерной разработки, помогающие эффективно решать класс задач, имеющих перекрывающие подзадачи и оптимальные свойства подструктуры.</p>
<p>Предложенные проблемы подразумевают многократное вычисление значений одних и тех же подзадач. Это необходимо для того, чтобы подобрать оптимальное для выдвинутой проблемы решение.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0"></span>Историческая справка<span class="ez-toc-section-end"></span></h2>
<p>Термин «динамическое программирование» (ДП) появилось в 1940-х годах. Оно было использовано Ричардом Беллманом. Так он описывал процесс нахождения решения задачи, где ответ на один вопрос может быть получен только после предыдущего.</p>
<p>К 1953 году Ричард изменил определение, приведя его к современному толкованию. С тех самых пор термин применим не только к математике, но и к разработке. Здесь «программирование» к непосредственному написанию кода не имеет никакого отношения. Это понятие обозначает оптимальную последовательность действий для получения результирующей по тому или иному вопросу. Пример – определенное расписание событий на выставке.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D1%80%D0%B5%D1%88%D0%B0%D0%B5%D1%82"></span>Какие задачи решает<span class="ez-toc-section-end"></span></h2>
<p>При помощи ДП можно решать разные вопросы – не только в обыденной жизни, но и в непосредственной разработке ПО:</p>
<ol>
<li>Задачи комбинаторики. Они отвечают на вопрос о том, сколько существует объектов с теми или иными свойствами, или сколько элементов существует с заданными параметрами.</li>
<li>Задачи оптимизации. Они связаны с максимизацией или минимизацией целевой функции. Пример – максимизировать вероятность того, что имеющаяся система не выйдет из строя, максимизировать математическое ожидание получения доходов.</li>
</ol>
<p>Получаемые решения можно использовать в обыденной жизни и в разработке ПО. Примеры из реальной жизни:</p>
<ol>
<li>Построение маршрута. Алгоритм позволяет построить путь через несколько заданных точек. Такая концепция встречается в онлайн-картах и программах вызова такси.</li>
<li>Компьютерные сети. Если нужно получить решение о выборе пути доставки пакета информации по нескольким адресам. При использовании ДП производятся необходимые расчеты, а на выходе получается последовательность передачи.</li>
<li>Сжатие изображений. Суть данного процесса заключается в уменьшении изначального размера файла за счет выделения схожих областей картинки. Это означает, что при реализации задачи содержимое изображения будет меняться, но ее внешний вид должен оставаться неизменным. Подобного результата добиться проблематично.</li>
</ol>
<p>При помощи динамического программирования можно значительно ускорить решение алгоритмических задач. Объем используемой памяти в соответствующем вопросе не является константой. Для решения больших задач придется увеличить соответствующий параметр.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%B8%D0%B4%D0%B5%D0%B8"></span>Ключевые идеи<span class="ez-toc-section-end"></span></h2>
<p>Для того, чтобы решить поставленную задачу, обычно нужно разделить ее на отдельные части – подзадачи. Далее – объединить их решения в одно общее. Некоторые подзадачи оказываются одинаковыми. Алгоритмы в динамическом программировании заключаются в том, чтобы решить каждую подзадачу только один раз и сократить за счет этого количество вычислений. Существуют ключевые понятия, помогающие усвоить рассматриваемый термин:</p>
<ol>
<li>Метод динамического программирования сверху – это простое запоминание результатов решения подзадач, которые могут повторно встретиться.</li>
<li>Метод ДМ снизу. Это преобразование сложной задачи в рекурсивную последовательность более простых решений.</li>
<li>Оптимальная подструктура – указывает на то, что оптимальное решение подзадач меньшего объема может быть использовано для первоначально поставленной цели.</li>
<li>Перекрывающие подзадачи – подзадачи, которые используются для решения некоторого количества задач (более одной) большего размера. Яркий пример – вычисление чисел Фибоначчи.</li>
<li>Мемоизация – сохранение решений ранее известных подзадач и их извлечение из памяти в случае обнаружения аналогичных алгоритмов для вычислений.</li>
</ol>
<p>При помощи ДП можно решить множество разнообразных задач – не только в математике, но и в разработке ПО. Оно обладает несколькими свойствами, а также подходами к достижению обозначенных изначально целей.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8"></span>Свойства и концепции<span class="ez-toc-section-end"></span></h3>
<p>На основании изученной информации можно сделать вывод о том, что динамическое программирование пользуется следующими свойствами задачи:</p>
<ul>
<li>перекрывающиеся подзадачи;</li>
<li>оптимальная подструктура;</li>
<li>возможность сохранения решения часто встречающихся подзадач.</li>
</ul>
<p>Подходов к разработке решений несколько:</p>
<ol>
<li>Нисходящее ДП. В данном случае «цель» разбивается на задачи меньшего размера. Они решаются, после чего комбинируются для получения итогового решения. Здесь используется запоминание алгоритмов уже решенных подзадач.</li>
<li>Восходящее ДП. При нем все подзадачи, которые позже пригодятся для решения исходной задачи, просчитываются заранее.</li>
</ol>
<p>Вторая схема является более совершенной. Соответствующий принцип целесообразен в плане объема стека и необходимого количества функций. Стоит обратить внимание на то, что иногда бывает проблематично определиться со спектром необходимые подзадач для получения желаемого итогового результата.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A7%D1%82%D0%BE_%D0%BD%D1%83%D0%B6%D0%BD%D0%BE_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F"></span>Что нужно для формирования решения<span class="ez-toc-section-end"></span></h2>
<p> Основные концепции в динамическом программировании задач рассмотрены. Данная «схема» в разработке позволяет дробить задание на более мелкие (два и более) компоненты. Соответствующий принцип можно применять повсеместно, особенно при решении сложных вопросов.</p>
<p>Для того, чтобы использовать ДП при разработке алгоритмов, потребуется:</p>
<ol>
<li>Идея или цель. То, что будет разделяться на несколько маленьких шагов.</li>
<li>Исходные данные.</li>
<li>Таблица, в которую будут вноситься промежуточные результаты. Один из них станет результирующим.</li>
<li>Правила по заполнению пустых ячеек таблицы. Они опираются на значение в уже заполненных блоках. Для каждой цели применяется свой подход по поиску оптимального решения.</li>
<li>Принцип выбора алгоритма, который нужно применять для достижения изначально обозначенной цели.</li>
</ol>
<p>Данная схема позволяет понять, без чего невозможно решить обозначенный вопрос. Если нет хотя бы одного компонента, применить алгоритмы ДП нельзя. Результат может оказаться непредвиденным.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8"></span>Преимущества и недостатки<span class="ez-toc-section-end"></span></h2>
<p>Перед тем как учить основные языки для задач по динамическому программированию, требуется понять, какие преимущества и недостатки имеет такой подход. В реальной жизни он просто может оказаться запутанным и сложным. В случае с разработкой ситуация немного меняется.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BB%D1%8E%D1%81%D1%8B"></span>Плюсы<span class="ez-toc-section-end"></span></h3>
<p>Основные преимущества:</p>
<ol>
<li>Скорость. ДП выступает весьма эффективным подходом при решении самых разных вопросов. Вычислительная способность остается на достойном уровне даже в сложных задачах.</li>
<li>Универсальность. Для любого сложного вопроса обязательно можно найти более мелкие и простые подзадачи, способные помочь в получении желаемого результата.</li>
<li>Точность. Это главное преимущество, которым обладает динамическое программирование. Оно позволяет охватить все возможные варианты развития событий. Такая схема дает возможность обозначить наиболее оптимальное решение без погрешностей и неоднозначностей.</li>
</ol>
<p>Динамическое программирование, несмотря на свои преимущества, все равно остается неидеальным. Иногда его применение оказывается нецелесообразным из-за ряда недостатков соответствующей концепции.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%B8%D0%BD%D1%83%D1%81%D1%8B"></span>Минусы<span class="ez-toc-section-end"></span></h3>
<p>Рассматриваемый алгоритм широкой распространен в реальной жизни и создании программного обеспечения. При динамическом программировании задач необходимо учитывать следующие минусы схемы:</p>
<ol>
<li>Когнитивная нагрузка. Компактная система правил, позволяющая обнаружить наиболее оптимальную работающую схему для достижения поставленной цели привлекает, но она часто увеличивает нагрузку. Требуется обладать соответствующим навыком мышления (математическим, логическим), чтобы сопоставлять системы таблиц и разбираться в них.</li>
<li>Память. Особо актуальная проблема для каждого старого аппарата. Все устройства обладают определенной памятью, за счет которой обеспечивается скорость его работы. Если вычислительная способность компьютера небольшая, а обозначенная проблема выражена крупным приложением, результат окажется печальным. Программа начнет потреблять много памяти, тормозить, а иногда – работать с ошибками.</li>
</ol>
<p>Теперь можно сделать простой вывод – нельзя использовать ДП при разработке особо крупных проектов, если для запуска используется маломощный аппарат. Чем выше вычислительная способность, тем лучше и быстрее будет работать запущенный алгоритм.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8"></span>Реализации и языки<span class="ez-toc-section-end"></span></h2>
<p>С ДП удалось разобраться должным образом, поэтому теперь можно рассмотреть примеры реализации и языки, использующие соответствующую концепцию.</p>
<p>Языками динамической разработки (программирования) тех или иных задач (ДЯ) называется класс языков разработки высокого уровня. Они при запуске выполняют большинство общих программных алгоритмов.</p>
<p>ДЯ – это язык разработки, позволяющий определять типы данных и производить синтаксический анализ, а также компиляцию сразу, непосредственно при выполнении написанной программы. Используется для быстрого формирования готового к функционированию кода проекта.</p>
<p>Методы динамической разработки (программирования) используются в языках:</p>
<ul>
<li>Ruby;</li>
<li>Smalltalk;</li>
<li>TCL;</li>
<li>Perl;</li>
<li>PHP;</li>
<li>Python;</li>
<li>JavaScript.</li>
</ul>
<p>Некоторые черты рассмотренной концепции имеет Visual Basic. Разработчики иногда характеризуют ДП как классический подход создания скриптов.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"></span>Реализации<span class="ez-toc-section-end"></span></h3>
<p>Во время изучения ДП и ДЯ нужно обратить внимание на то, какие реализации можно использовать:</p>
<ol>
<li>Функция eval. Она встречается в некоторых языках. Принимает строки и выполняет их. Если принятый код включает в себя выражение, будет рассчитан результат, после чего он вернется в качестве результирующего значения. Eval может использоваться для замены функций высшего порядка.</li>
<li>Изменение среды выполнения объекта. Во время выполнения кода тип или объект можно изменять. Данный момент применим относительно деревьев типов, а также к наследованию. Вследствие этого меняется поведение изначально заданных элементов кода.</li>
<li>Переменное распределение памяти. Статические языки разработки требуют заблаговременного выделения памяти перед компиляцией. При использовании ДП нельзя сделать это заранее. Память должна быть посчитана и выделена в соответствие с непосредственно выполняемыми операциями (в динамике по ходу работы кода).</li>
<li>Отражение. Присутствует во многих ДЯ. Подразумевает анализ типов и метаданных общей или полиморфной информации. Может включать в себя полную оценку и изменение кода в виде функции для анализа S-выражений.</li>
<li>Макросы. Некоторые ДЯ предоставляют функции, сочетающие интроспекцию и eval-функции. Они называются макросами. В C++ и C макросы являются статическими функциями, которые поддерживают исключительно строковые подстановки в тексте программы. Задачи динамического программирования требуют от них обеспечения доступа ко внутренней работе аппарата (компилятора), а также полный доступ к интерпретатору, виртуальной мине или среде выполнения.</li>
</ol>
<p>На основе предложенного материала можно сделать вывод о том, что макросы в ДЯ – это алгоритм, состоящий из языковых конструкций, позволяющих оптимизировать исходный код программы, а также корректировать синтаксис и грамматику языка.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B"></span>Классические примеры<span class="ez-toc-section-end"></span></h2>
<p>Чтобы лучше разобраться в изучаемой теме, рекомендуется рассмотреть <a href="https://habr.com/ru/post/113108/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">примеры<span class="wpel-icon wpel-image wpel-icon-6"></span></a> задач по динамической разработке (программированию). Далее будут представлены несколько классических проблем, а также коды для их решения. За основу будет взята последовательность Фибоначчи.</p>
<p>Нахождение чисел Фибоначчи – это классическая задача ДП. Она задается формулой:</p>
<p><code>F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub>, где n>1, F<sub>1</sub> = 1, F<sub>2</sub> = 1.</code></p>
<p>F<sub>n</sub> необходимо найти по заданному программисту номеру. Самый логичный и эффективный прием – это использование ре курсии. Выглядит данный подход так:</p>
<pre class="wp-block-code"><code>int F(int n) {
if (n < 2) return 1;
else return F(n - 1) + F(n - 2);
}</code></pre>
<p>При использовании соответствующей функции происходит «расчет с конца». Шаг за шагом значение n уменьшается до известных параметров.</p>
<p>Недостаток подхода – сложность. Если n = 50 или 40, приложение будет работать достаточно долго. Связано это с тем, что одни и те же промежуточные данные вычисляются несколько раз.</p>
<p>Избавиться от данного недостатки можно за счет сохранения уже найденных промежуточных значений для повторного использования. В виде кода это выглядит так:</p>
<pre class="wp-block-code"><code>int F(int n) {
if (A[n] != -1) return A[n];
if (n < 2) return 1;
else {
A[n] = F(n - 1) + F(n - 2);
return A[n];
}
}</code></pre>
<p>Последняя схема является корректной и эффективной, но для обнаружения последовательности Фибоначчи есть и другой алгоритм. Он выглядит так:</p>
<pre class="wp-block-code"><code>F[0] = 1;
F[1] = 1;
for (i = 2; i < n; i++) F[i] = F[i - 1] + F[i - 2];</code></pre>
<p>Это – пример расчетов «с начала». Изначально происходит заполнение известными значениями, а затем производится первое неизвестное, второй и так далее. Делается это до тех пор, пока приложение не достигнет нужного компонента.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B5%D0%BA%D1%80%D0%B5%D1%82_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B8%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"></span>Секрет быстрого изучения<span class="ez-toc-section-end"></span></h2>
<p>Динамическое программирование самостоятельно бывает весьма проблематично, особенно на первых порах. Для того, чтобы быстрее разобраться с ним, а также подобрать оптимальный язык разработки на нем, рекомендуется посетить дистанционные онлайн курсы. Пример – от образовательного центра OTUS.</p>
<p>Здесь:</p>
<ul>
<li>занятия проводятся через интернет, благодаря чему их можно совмещать с работой, семьей и иными делами;</li>
<li>курсы делятся на направления в зависимости от первоначального спектра знаний пользователя;</li>
<li>можно выбрать сразу несколько областей IT для изучения;</li>
<li>сжатые сроки обучения – некоторые курсы длятся всего несколько месяцев;</li>
<li>постоянное кураторство;</li>
<li>интересные домашние задания и богатая практика;</li>
<li>помощь в формировании первого портфолио, а также в трудоустройстве;</li>
<li>материал подается понятным языком – разберется даже новичок.</li>
</ul>
<p>По завершении курсов пользователи получают электронные сертификаты установленного образца. С их помощью удастся подтвердить приобретенный спектр навыков и знаний в выбранном направлении.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em> </p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F&text=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%3A%20%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%B8%20%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdinamicheskaya-razrabotka-osobennosti-i-yazyki%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2023%2F02%2Foj-1080x720-25.jpg&description=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%3A%20%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%B8%20%D1%8F%D0%B7%D1%8B%D0%BA%D0%B8" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/kakimi-byvajut-versii-programm-zhiznennyj-cikl/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kakimi-byvajut-versii-programm-zhiznennyj-cikl/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Какими бывают версии программ. Жизненный цикл" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/02/oj-1080x720-24-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Какими бывают версии программ. Жизненный цикл" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kakimi-byvajut-versii-programm-zhiznennyj-cikl/" data-wpel-link="internal">Какими бывают версии программ. Жизненный цикл</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kakimi-byvajut-versii-programm-zhiznennyj-cikl/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-02-05T15:27:19+00:00">5 февраля, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">4 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/kak-najti-rabotu-za-rubezhom-6-prakticheskih-sovetov/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kak-najti-rabotu-za-rubezhom-6-prakticheskih-sovetov/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Как найти работу за рубежом? 6 практических советов" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/02/Screen-Shot-2023-02-06-at-11.14.20-AM-150x106.png 150w, https://otus.ru/journal/wp-content/uploads/2023/02/Screen-Shot-2023-02-06-at-11.14.20-AM-300x213.png 300w, https://otus.ru/journal/wp-content/uploads/2023/02/Screen-Shot-2023-02-06-at-11.14.20-AM-768x544.png 768w, https://otus.ru/journal/wp-content/uploads/2023/02/Screen-Shot-2023-02-06-at-11.14.20-AM.png 1022w" data-src="https://otus.ru/journal/wp-content/uploads/2023/02/Screen-Shot-2023-02-06-at-11.14.20-AM-150x106.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Как найти работу за рубежом? 6 практических советов" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kak-najti-rabotu-za-rubezhom-6-prakticheskih-sovetov/" data-wpel-link="internal">Как найти работу за рубежом? 6 практических советов</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kak-najti-rabotu-za-rubezhom-6-prakticheskih-sovetov/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-02-06T08:15:13+00:00">6 февраля, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">5 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/dinamicheskaya-razrabotka-osobennosti-i-yazyki\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 23:29:47 GMT -->