Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Декларативный подход Python: Декларативное программирование

Парадигмы программирования

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

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

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

Большинство современных высокоуровневых языков программирования — "мультипарадигмальные", то есть позволяют использовать несколько парадигм одинаково удобно. Языки же низкого уровня, такие как C, не могут себе позволить такую свободу: код на таких языках должен быть эффективным, поэтому решения обычно максимально завязаны на то, как работает компьютер, а не на то, как это видит себе программист. Python — язык мультипарадигмальный.

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

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

Такое описание чёткой последовательности шагов называется императивным программированием.

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

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

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

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

Декларативное программирование — это и есть описание того, что собой представляет конечный результат! Решая задачу в декларативном стиле, мы описываем как результат соотносится со входными данными, при необходимости уточняя детали, пока интерпретатор не получит достаточно информации, чтобы дальше действовать самостоятельно. И, уточняя наши требования, мы всё ещё не говорим машине как делать работу, мы лишь точнее и точнее описываем соотношение "входов" с "выходами".

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

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

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

Серебряная пуля

Если бы мы имели доступ к бесконечно производительным и бесконечно понятливым машинам, то любой код был бы декларативным — если бы вообще требовалось какое-либо кодирование! Человеку вообще свойственно думать в декларативном ключе. Возьмём для примера математику: мы знаем, что "длина гипотенузы, это корень квадратный из суммы квадратов катетов", а никак не "берём первый катет, умножаем на себя, запоминаем..., складываем и запоминаем результат, извлекаем корень из предыдущего результата".

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

На Python можно как реализовывать декларативные предметно-ориентированные языки "под задачу", так и писать "декларативно с элементами" — об этой второй возможности и рассказывает данный курс!

Путаница в терминологии

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

Так же встречается вариация "в функциональном ключе" и другие ей подобные. Здесь тоже нужно обращать внимание на прилагательное.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

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

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

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

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

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