Парадигмы программирования на сайте Игоря Гаршина. Технологии разработки программ (original) (raw)

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

Языки передачи, хранения, обработки и представления информации Борьба со сложностью и есть драйвер и мотивация для создания новых парадигм. Более того, это может являться критерием правильности выбора парадигмы: насколько простым и понятным оказывается итоговый код. (Григорий Демченко)

Разделы страницы о концепциях и технологиях программирования:


Технологии программирования (сетевые обзоры и сборники статей)

Классификации языков программирования

По методологии и назначению языки программирования можно разделить на следующие категории (перечислены по алфавиту):

  1. Аспектно-ориентированные
  2. Декларативные
  3. Динамические
  4. Логические
  5. Объектно-ориентированные
  6. Описания интерфейсов
  7. Прототипные
  8. Процедурные (императивные)
  9. Рефлексивные (поддерживающие отражение)
  10. Скриптовые (сценарные)
  11. с обобщённым программированием
  12. Стековые [язык Форт]
  13. Учебные [например, язык Лого]
  14. Функциональные [R, Haskell; Python?]
  15. Эзотерические

Ссылки по классификации методологий и языков программирования:

Далее приведены главы с описанием каждой методологии, но уже не по алфавиту, а в порядке усложнения.

Процедурное (императивное) программирование

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

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

Декларативные языки программирования - это языки объявлений и построения структур. К ним относятся функциональные и логические языки программирования. В этих языках не производится алгоритмических действий явно, то есть алгоритм не задается прграммистом, а строится самой программой. В декларативных языках задается, производится построение какой-либо структуры или системы, то есть декларируются (объявляются) какие-то свойства создаваемого объекта. Эти языки получили широкое применение в 1) системах автоматизированного проектирования (САПР), 2) в так называемых CAD-пакетах, 3) в моделировнии, 4) системах искусственного интеллекта [и, наверное, 5) в визуальном программировании?].

Структурное программирование

Структу́рное программи́рование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 1970-х годах Э. Дейкстрой и др. В соответствии с данной методологией любая программа строится без использования оператора goto [ноги которого растут из машинного языка Assembler] из трёх базовых управляющих структур: последовательность, ветвление, цикл; кроме того, используются подпрограммы. При этом разработка программы ведётся пошагово, методом «сверху вниз» [вложенно].

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственно, усложнения программного обеспечения. [Запутанность переходов между строками кода с помощью GOTO порождала трудно отлавливаемые ошибки и непредсказуемые последствия. На самом деле, оператор GOTO опасен, но очень эффективен.]

Модульное программирование

Мо́дульное программи́рование — это организация программы как совокупности небольших независимых блоков, называемых модулями. [Является развитием концепций подпрограмм из структурного программирования.]

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

Термин «модуль» в программировании начал использоваться в связи с внедрением модульных принципов при создании программ. В 1970-х годах под модулем понимали какую-либо процедуру или функцию, написанную в соответствии с определёнными правилами. Например: «модуль должен быть простым, замкнутым (независимым), обозримым (от 50 до 100 строк), реализующим только одну функцию задачи, имеющим одну входную и одну выходную точку». Первым основные свойства программного модуля более-менее чётко сформулировал Д. Парнас (David Parnas) в 1972 году: «Для написания одного модуля должно быть достаточно минимальных знаний о тексте другого». Таким образом, в соответствии с определением, модулем могла быть любая отдельная процедура (функция) как самого нижнего уровня иерархии (уровня реализации), так и самого верхнего уровня, на котором происходят только вызовы других процедур-модулей.

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

Впервые специализированная синтаксическая конструкция модуля была предложена Н. Виртом в 1975 г. и включена в его новый язык Modula (а затем - Modula-2).

Минусы модульности: требуется большая аккуратность и больше времени на разработку. При выполнении требуется больше памяти. Преимущества модульного программирования: 1) модули можно тестировать, отлаживать и поддерживать по отдельности; 2) можно повторно использовать модули из других проектов или купить их у сторонних производителей; 3) программу можно легче модернизировать простой заменой модулей.

Обобщённое программирование

Обобщённое программирование (англ. generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования. Возможности обобщённого программирования впервые появились в виде дженериков (обобщённых функций) в 1970-х годах в языках Клу и Ада, затем в виде параметрического полиморфизма в ML и его потомках, а затем во многих объектно-ориентированных языках, таких как C++, Java, Object Pasca, D, Eiffel, языках для платформы .NET и др.

Объектно-ориентированное и событийное программирование

Объектно-ориентированное программирование (ООП) - метод программирования, в которо главными элементами программ являются объекты. В объектно-ориентированных языках программирования понятие объекта реализовано как совокупность свойств (структур данных, характерных для данного объекта), методов их обработки (подпрограмм изменения их свойств) и событий, на которые данный объект может реагировать и которые приводят, как правило, к изменению свойств объекта.

Важнейшие принципы ООП:

  1. Инкапсуляция - объединение данных и свойственных им процедур обработки в одном объекте. Фундаментальным понятием является класс - шаблон, на основе которого может быть создан конкретный программный объект. Он описывает свойства и методы, определяющие поведение объектов этого класса. Каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса.
  2. Наследование - такая организация классов, которая предусматривает создание новых классов на базе существующих и позволяет классу потомку иметь (наследовать) все свойства класса – родителя.
  3. Полиморфизм - означает, что рожденные объекты обладают информацией о том, какие методы они должны использовать в зависимости от того, в каком месте цепочки (дерева классов) они находятся. Это концепция, реализующая "множество методов в одном интерфейсе".
  4. Модульность - такая организация объектов, когда они заключают в себе полное определение их характеристик, никакие определения методов и свойств не должны располагаться вне его, это делает возможным свободное копирование и внедрение одного объекта в другие.
  5. [Множественное наследование - класс может принадлежать и к родителям из других иерархий. Но мало где реализуется из-за проблем, возникающих в командной разработке.]

ООП обычно реализуется совместно с событийно-ориентированным и визуальным пограммированием.

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

Статьти с критикой ООП:

Функциональное и функционально-логическое программирование

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

Противопоставляется парадигме императивного программирования [процедурного?], которая описывает процесс вычислений как последовательное изменение состояний (в значении, подобном таковому в теории автоматов). При необходимости, в функциональном программировании вся совокупность последовательных состояний вычислительного процесса представляется явным образом, например, как список.

Будучи продуктом времён академического становления компьютерных наук, функциональное программирование не так давно пережило возрождение благодаря большой пользе при использовании в распределённых системах. Однако, «чистые» функциональные языки вроде Haskell непросто понять.

В последнее время функциональное программирование сильно выросло в значимости, потому что оно хорошо подходит для параллельного программирования и программирования, основанного на событиях («reactive»). Популярная сейчас стратегия – смешивать объектно-ориентированное программирование и функциональное.

А вот прекрасные хабровские статьи о функциональном программировании [но я всё равно здесь ничего не понял - зато, уверен, поймёте вы!]:

Языки функционально программирования (Лисп, Хэскел, R...)

Глубокая идея функциональных языков на самом деле гораздо глубже, чем кажется на первый взгляд. Джон Маккарти, автор Лиспа, перевернул всё программирование 50-х и 60-х годов с головы на ноги: он поставил на первое место не данные, вокруг которых суетятся мелкие программки, а сами эти программки. Данные же он предлагал протаскивать через цепочки выполнения, а язык для описания этого дела был назван «List Processor», то есть Язык Обработки Списков. (С Лурки)

Языками функционального программирования являются Haskell и универсальный сценарный язык Python, а также Erlang - Функциональный язык программирования с сильной динамической типизацией, предназначенный для создания распределённых вычислительных систем, который разработан и поддерживается компанией Ericsson.

Еще один функциональный язык программирования - Scheme, один из трёх наиболее популярных в наши дни диалектов языка Лисп. Авторы языка - Гай Стил и Джеральд Сассмен из Массачусетского технологического института - создали его еще в середине 1970-х годов.

Функциональный язык статистической обработки R

В последнее время силное развитие получили технологии обработки больших данных (Big Data и Data Science). В этих сферах необходимо иметь мощный язык для работы со статистикой и графиками. И таким языком стал именно функционально-ориентированный язык R. R разрабатывался целенаправленно для специалистов по статистике [Data Scientist], а посему оснащён качественной визуализацией данных. Сегодня R уже конкурирует по популярности с SQL, он активно используется в коммерческих организациях, исследовательских и университетах.

R — мощный скриптовый язык, ориентированный на статистику. Его можно рассматривать в качестве конкурента для таких аналитических систем, как SAS Analytics, не говоря уже о таких более простых пакетах, как StatSoft STATISTICA или Minitab. R-фанаты считают, что этот язык заключает в себя возможности Явы, Питона, Перла, Раби и Дотнета. Если, например, Python больше приближен к продакшену и чаще применяется в коммерческих проектах, то в академических кругах большей популярностью пользуется R.

На основе R создан другой статистический интерпретатор - язык S.

Языки функционально-логического программирования (Mercury, Curry)

Методы функционального программирования попытались приложить для решения проблем логического (интеллектуального) программирования. Так появились языки функционально-логического программирования, например, Curry, Mercury.


На правах рекламы (см. условия):

[an error occurred while processing this directive]

Ключевые слова для поиска сведений о классификации и парадигмах языков программирования: На русском языке: парадигмы программирования, классификации компьютерных языков, категории ЯВУ, концепции информатики, объектно-ориентированное, событийное, процедурное, модульное, императивное, ООП; На английском языке: programming paradigms.

Страница обновлена 04.09.2024

| Яндекс.Метрика | | | | | | | | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | | | | | | |