Введение: императивное и декларативное программирование

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

//Imperative programming
total = function(numbers){
  let total = 0
  numbers.forEach(function(number){
    total = total + number
  })
  return total
}
//Declarative programming
average = function(numbers){
  return total(numbers) / numbers.length
}

Из любопытства после единственного онлайн-исследования Google выяснилось, что на самом деле существует более двух парадигм программирования. Позже во второй половине дня в лаборатории, которая требует от нас написания «чистых функций» для JavaScript, я столкнулся с другим термином - «парадигма функционального программирования».

Фактически, согласно Парадигмам программирования для чайников: что должен знать каждый программист, у нас может быть почти 30 полезных парадигм программирования. (Ван Рой, страница 9). Объектно-ориентированный, термин, с которым я очень хорошо знаком, также считается типом парадигм программирования.

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

«Парадигма программирования»: история термина

Согласно Википедии, парадигмы программирования - это способ классификации языков программирования на основе их характеристик. Но я все еще был сбит с толку после прочтения определения Википедии. Поэтому я попытался понять это слово, проследив историю этого термина.

Фактически, когда я впервые услышал Парадигму программирования, это сразу напомнило мне еще один термин, используемый в академических исследованиях по истории науки - Сдвиг парадигмы, термин, введенный Томасом С. Куном в его книге 1962 года Структура научных революций , где Кун определяет парадигмы как достижения, которые были (1) достаточно беспрецедентными, чтобы отвлечь стойкую группу приверженцев от конкурирующих форм научной деятельности . (2) В то же время он был достаточно открытым, чтобы оставлять всевозможные проблемы для решения новой группы практикующих. По словам Куна, парадигмы предоставляют модели, из которых берут начало конкретные последовательные традиции научных исследований. (Кун, стр.10)

В 1979 году, заимствуя понятие Куна, в Парадигмах программирования Роберт У. Флойд официально предложил концепцию Парадигма программирования. Он впервые дал оценку популярной парадигме структурированного программирования в 1960-х и 1970-х годах. По его словам, парадигма структурного программирования адаптировала метод уровней абстракции или связывания информации. (Флойд, стр. 456), в то время как парадигма на еще более высоком уровне абстракции, чем парадигма структурного программирования, представляет собой построение иерархии языков, где программы на языке самого высокого уровня работают с наиболее абстрактными объектами и переводятся в программы на языке следующего более низкого уровня . (Там же, стр. 458) Он также упоминает, что разные языки поддерживают разные парадигмы, либо слабо, либо полностью поддерживают: Когда язык делает парадигму удобной, я скажу, что язык поддерживает парадигму. Когда язык делает парадигму осуществимой, но неудобной, я скажу, что язык слабо поддерживает парадигму . (Там же.)

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

Основные парадигмы

Тогда каковы основные парадигмы? Вообще говоря, императивный и декларативный - два основных типа. Кроме того, существуют и другие парадигмы, которые обычно считаются подтипами этих двух типов, что является упрощенным, вводящим в заблуждение пониманием таксономии. В любом случае, вот несколько основных парадигм программирования:

  • Императивные: структурированные, процедурные, объектно-ориентированные и т. Д.
  • Декларативная: функциональная, логическая и др.

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

Здесь я суммировал значение 5 подтипов императивной и декларативной парадигм, перечисленных выше, согласно их страницам в Википедии:

1. структурное программирование : широкое использование структур структурированного потока управления выбора (if / then / else) и повторения (while и for), блочных структур и подпрограмм.

2. процедурное программирование : структурированное программирование + процедуры (которые также известны как подпрограммы, подпрограммы или функции, просто содержат серию вычислительных шагов, которые необходимо выполнить).

3. объектно-ориентированное программирование: основано на концепции объектов, которые могут содержать данные в виде полей (часто называемых атрибутами) и кода в форме процедур (часто называемых методами). Процедуры объекта, которые могут получать доступ и часто изменять поля данных объекта, с которым они связаны.

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

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

Мультипарадигмальные языки

В настоящее время многие современные языки поддерживают несколько парадигм. Например, JavaScript - это основанный на прототипах, мультипарадигмальный язык сценариев, который является динамическим и поддерживает объектно-ориентированные, императивные и функциональные стили программирования. Согласно официальному определению, JavaScript поддерживает как минимум 3 парадигмы программирования: объектно-ориентированное, императивное и функциональное (подтип декларативного программирования).

Точно так же Ruby также является многопарадигмальным языком. Согласно Wiki , Ruby - это динамический, интерпретируемый, рефлексивный, объектно-ориентированный язык программирования общего назначения… Он поддерживает несколько парадигм программирования, включая функциональное, объектно-ориентированное и императивное. Как и JavaScript, он также поддерживает как минимум 3 парадигмы программирования: объектно-ориентированное, императивное и функциональное.

Тогда как насчет других языков? Кажется, что если вы наберете «является ли Python функциональным языком?», То появится много связанных поисковых вопросов. Могут возникнуть вопросы: «Является ли SQL императивным языком?» или «является ли C ++ императивным языком?» и так далее. Люди всегда хотят знать парадигмы разных языков. После проверки официальной документации по 8 языкам программирования, для собственного удобства, здесь я резюмирую парадигмы программирования, поддерживаемые 8 часто используемыми языками программирования:

  • C: императив, процедурный
  • C ++: императивный, объектно-ориентированный, общий, функциональный стиль (не функциональный)
  • C #: императивный, декларативный, функциональный, универсальный, объектно-ориентированный (на основе классов), компонентно-ориентированный
  • Java: параллельный, на основе классов, функциональный (Java8)
  • JavaScript: императивный, функциональный, объектно-ориентированный
  • Python: императивный, функциональный, процедурный, объектно-ориентированный
  • Ruby: императивный, функциональный, объектно-ориентированный
  • SQL: декларативный, управляемый данными

Вернуться к JavaScript…

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

JavaScript поддерживает функциональное программирование, в то время как JavaScript не является чисто функциональным языком программирования. В функциональном программировании данные неизменны. Согласно этому краткому изложению, чистая функция (1) никогда не изменяет никаких параметров, которые передаются ей по ссылке (в JS, объектах и ​​массивах), поскольку параметры следует считать неизменяемыми. Более того, (2) на возвращаемое значение чистой функции ничего не влияет, кроме ее входных параметров. (3) Во время выполнения чистая функция ничего не меняет за ее пределами (побочные эффекты) . В приведенном ниже коде представлен простой пример чистой функции:

//pure function
//1. return value: not influenced by anything else other than parameters
//2. function never changes the argument
//3. does not change anything outside of the function.
function pure(num){
 return num * 3 
}

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

использованная литература









Овладейте собеседованием на JavaScript: что такое функциональное программирование?
« Освойте собеседование на JavaScript
- это серия сообщений, предназначенных для подготовки кандидатов к ответам на общие вопросы… medium.com »













парадигмы
Слово« парадигма
часто используется, когда речь идет о языках программирования. Что это означает? Программирование… cs.lmu.edu »