Парадигмы программирования
Паради́гмы программи́рования, системы базовых понятий, определяющие способ написания компьютерных программ. Возникновение парадигм программирования связано с развитием языков программирования. Парадигмы программирования затрагивают различные аспекты языков программирования: абстракции, используемые для представления данных, подходы к декомпозиции процесса вычислений и т. п. Многие языки программирования реализуют одновременно несколько парадигм программирования. Выделяют два основных класса – императивные и декларативные, которые различаются способом задания правил обработки данных.
Императивные парадигмы программирования представляют программу как последовательность действий (операторов), которые преобразуют состояние программы. Допустимые виды операторов, а также типы обрабатываемых данных определяются конкретным языком программирования. К императивным парадигмам относится процедурная парадигма программирования, в которой отдельные группы часто повторяемых операторов выделяются в процедуры (называемые также подпрограммами), описывающие действия по переводу одних данных в другие. В число операторов таких языков входит оператор обращения к процедуре. К процедурным языкам программирования относятся, например, C, Fortran, Pascal.
В декларативных парадигмах программирования описывается смысл изменений в состоянии программы без явного указания конкретной последовательности выполняемых действий над состоянием. В языках, относящихся к декларативным парадигмам программирования, эта последовательность формируется интерпретатором или компилятором. Одна из разновидностей декларативных парадигм программирования – функциональная парадигма программирования, основанная на математическом аппарате функций высшего порядка, в качестве аргументов и результатов которых могут также выступать функции. Функциональная парадигма программирования представляется в виде композиции таких функций. В частности, благодаря отсутствию побочных эффектов из двух применений функции с одинаковыми аргументами может потребоваться лишь одно. К функциональным языкам программирования относят, например, Haskell, Lisp, OCaml, Scheme, однако данные языки содержат и элементы императивных парадигм программирования. К декларативным парадигмам программирования относится также логическая парадигма программирования, базирующаяся на математической логике и связанная с методами автоматического доказательства теорем. В данной парадигме программирования программа представляет собой набор формул логики, описывающих взаимосвязь между фактами и утверждениями. Логическая программа на входе получает запрос в виде формулы логики, а на выходе либо осуществляет подстановку значений свободных переменных во входной формуле, при которой она обращается в истину, либо выдаёт ответ «нет», если такая подстановка не существует. В логических языках программирования на формулы, как правило, накладываются определённые ограничения. Например, в языке Prolog формулы представляют собой дизъюнкты Хорна – объединённые операцией дизъюнкции переменные, из которых все, кроме одной, входят в формулу с отрицанием (см. Алгебра логики, Логические операции). Единственная переменная без отрицания называется положительным литералом и соответствует истинности логического утверждения в целом, в то время как остальные переменные описывают условия его истинности. Факты (аксиомы) при этом описываются в виде одного положительного литерала. Выполнение логической программы сводится к поиску искомой подстановки. Для формул логики произвольного вида данная задача является переборной.
Парадигмы программирования подразделяют также на структурные и неструктурные. Структурные парадигмы программирования нацелены на сокращение времени разработки и упрощение поддержки программ за счёт использования блочных операторов и подпрограмм. Отличительной чертой структурных программ является отказ от оператора перехода (goto). К структурным парадигмам программирования относится, в частности, процедурная парадигма программирования. В неструктурных парадигмах программирования для каждого типа вычислительной машины должен быть написан свой вариант внутреннего кода и используется оператор goto.
Большое распространение имеет объектно ориентированное программирование, относящееся к структурным парадигмам программирования. В данной парадигме программирования программа разбивается на объекты – структуры данных, состоящие из полей, описывающих состояние, и методов – подпрограмм, применяемых к объектам для изменения или запроса их состояния. В большей части объектно ориентированных парадигм программирования для описания объектов используются классы, объекты более высокого порядка, описывающие структуру и операции, связанные с объектами. В качестве более частной парадигмы программирования по отношению к объектно ориентированной выделяют прототипно ориентированную парадигму программирования. В отличие от основанных на классах объектно ориентированных систем, в прототипно ориентированных системах понятие классов не используется, а новые переменные объекты создаются путём копирования существующих прототипов. К языкам, поддерживающим объектно ориентированную парадигму программирования, относятся C++, Common Lisp (также содержит элементы функциональной парадигмы программирования), Java, JavaScript (прототипно ориентированная модель), Smalltalk.