Нажмите, чтобы перейти на главную страницу Софт 54

Императивные и декларативные языки программирования

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

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

  • C,
  • C++,
  • Java.

Декларативные языки:

  • SQL;
  • HTML.

Также выделяют смешанные языки:

  • JavaScript,
  • C#,
  • Python.

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

Примеры программ на императивных языках

Например, нам поставлены следующие задачи:

  • написать функцию с названием double, принимающую массив чисел и возвращающую новый массив, причем каждый элемент нового массива больше исходного в 2 раза;
  • написать функцию с названием summa, принимающую массив и возвращающую сумму всех элементов массива.

Язык JavaScript:

function double(arr) { let arr_new = [] for (let i = 0;i < arr.length; i++) { arr_new.push(arr[i] * 2) } return arr_new } function summa(arr) { let sum = 0 for (let i = 0;i < arr.length; i++) { sum += arr[i] } return sum }

Что общего у этих примеров на JavaScript?

  • Во всех случаях описывается, как именно решить проблему, то есть явно указываются все шаги по решению поставленной задачи.
  • В каждом из примеров осуществляется изменение какого-нибудь состояния (изменение состояния массива arr_new и переменной sum).
  • Если говорить субъективно, то код можно считать, по сути, нечитаемым. А все потому, что с первого раза вы вряд ли поймете, что конкретно происходит, — вместо этого вам придется внимательно читать программный код построчно.

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

Декларативный язык SQL:

SELECT * FROM customer WHERE country = 'Russia';

Язык HTML:

<article> <header> <h1> Декларотивное программирование </h1> <p> Дать указание браузеру (компьютеру), что делать. </p> </header> </article>

Нам достаточно просто взглянуть на код, чтобы понять суть происходящего. Языки программирования в данном случае заявляют, не как что-то надо сделать, а что именно должно быть сделано, поэтому можно говорит о декларативности. То есть мы описываем желаемый результат и не углубляемся в инструкции. И для нас абсолютно не имеет значения, как будет сделана выборка клиентов из России и как web-браузер распарсит article. Главное, что мы получим только клиентов из России, в первом случае, а во втором — новый зраздел на веб-странице.

Смешанные языки

У многих современных языков программирования существует определенный слой императивных абстракций, что позволяет применять их как декларативные языки, напримеp язык JavaScript

Решим те же задачи:

  • написать функцию с названием double, принимающую массив чисел и возвращающую новый массив, причем каждый элемент нового массива больше исходного в 2 раза;
  • написать функцию с названием summa, принимающую массив и возвращающую сумму всех элементов массива.
function double(arr) { return arr.map((item) => item * 2) } function summa(arr) { return arr.reduce((prev,current) => prev + current, 0) }

Обратите внимание, что в примерах применяются встроенные в язык JavaScript методы: map и reduce. То есть в нашем случае декларативное программирование — это абстракции над императивными реализациями, но нас не интересует, как реализованы эти методы. Мы также, как в примере с SQL, не изменяем состояния, да и читается этот программный код лучше.

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

Выводы

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

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

Примечание

К подвидам декларативного программирования часто относят и функциональное программирование.

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

Функциональное программирование — это парадигма (метод) программирования, в которой задаётся особое требование к функции или методу. Функция обязана подчиняться правилам для математической функции.

Функциональное программирование — это программирование с математическими функциями.

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

z= MF(x,y).

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

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

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

Этим объясняется спрос на функциональное программирование!

Рекомендуемая литература

  1. Брукшир Дж. Гленн, Брилов Деннис Компьютерные науки. Базовый курс М: Вильямс, 2019.
  2. Леонтьев В.П. Новейшая энциклопедия. Компьютер и Интернет. М.: ОЛМА Медиа Групп.
© Soft54, 2024. All rights reserved.