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

Материал из wikixw
Перейти к навигации Перейти к поиску

(Перенаправление с парадигмы программирования)

Эта статья посвящена классификации языков программирования. Определение термина "модель программирования" см. в разделе Модель программирования.

Парадигмы программирования - это способ классификации языков программирования на основе их особенностей. Языки можно разделить на несколько парадигм.

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

оп

Общие парадигмы программирования включают:

  1. : императив, в котором программист инструктирует машину, как изменить ее состояние,
  2. : процедурная, которая группирует инструкции в процедуры,
  3. : объектно-ориентированный, который группирует инструкции с той частью состояния, в которой они работают,
  4. : декларативная, в которой программист просто объявляет свойства желаемого результата, но не то, как его вычислить
  5. : функционал, в котором искомый результат объявляется как значение серии приложений функций,
  6. : логика, в которой искомый результат объявляется как ответ на вопрос о системе фактов и правил,
  7. : математическая, в которой искомый результат объявляется как решение оптимизационной задачи
  8. : реактивный, в котором желаемый результат объявляется с потоками данных и распространением изменений

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

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

Обзор различных парадигм программирования по Питеру Ван Рою

Обзор[править]

Точно так же, как разработка программного обеспечения (как процесс) определяется различными методологиями, так и языки программирования (как модели вычислений) определяются различными парадигмами. Некоторые языки предназначены для поддержки одной парадигмы (Smalltalk поддерживает объектно-ориентированное программирование, Haskell поддерживает функциональное программирование), в то время как другие языки программирования поддерживают несколько парадигм (например, Object Pascal, C ++, Java, JavaScript, C #, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Oz и F #). Например, программы, написанные на C++, Object Pascal или PHP, могут быть чисто процедурными, чисто объектно-ориентированными или содержать элементы обеих или других парадигм. Разработчики программного обеспечения и программисты решают, как использовать эти элементы парадигмы.

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

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

Парадигмы программирования также можно сравнить с моделями программирования, которые позволяют вызывать модель выполнения, используя только API. Модели программирования также могут быть классифицированы на парадигмы на основе особенностей модели выполнения.

Для параллельных вычислений обычно используется модель программирования вместо языка. Причина в том, что детали параллельного оборудования просачиваются в абстракции, используемые для программирования оборудования. Это приводит к тому, что программисту приходится сопоставлять шаблоны в алгоритме с шаблонами в модели выполнения (которые были вставлены из-за утечки оборудования в абстракцию). Как следствие, ни один параллельный язык программирования не соответствует всем вычислительным задачам. Таким образом, удобнее использовать базовый последовательный язык и вставлять вызовы API в модели параллельного выполнения через модель программирования. Такие модели параллельного программирования можно классифицировать по абстракциям, отражающим аппаратное обеспечение, таким как общая память, распределенная память с передачей сообщений, понятия места, видимого в коде, и так далее. Их можно считать разновидностями парадигмы программирования, которые применяются только к параллельным языкам и моделям программирования.

Критика[править]

Некоторые исследователи языка программирования критикуют понятие парадигм как классификацию языков программирования, например, Харпер[8] и Кришнамурти.[9] Они утверждают, что многие языки программирования не могут быть строго классифицированы в одну парадигму, а скорее включают функции из нескольких парадигм. См. Сравнение многопарадигмальных языков программирования.

История[править]

Различные подходы к программированию развивались с течением времени, будучи идентифицированными как таковые либо в то время, либо ретроспективно. Ранний подход, сознательно идентифицированный как таковой, - это структурированное программирование, пропагандируемое с середины 1960-х годов. Понятие "парадигма программирования" как таковое относится, по крайней мере, к 1978 году, в лекции премии Тьюринга Роберта У. Флойд, озаглавленная "Парадигмы программирования", которая цитирует понятие парадигмы, используемое Томасом Куном в его "Структуре научных революций" (1962).

Машинный код[править]

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

В 1960-х годах языки ассемблера были разработаны для поддержки копирования библиотек и довольно сложных возможностей условной генерации макросов и предварительной обработки, ВЫЗОВА (подпрограмм), внешних переменных и общих разделов (глобальных), что позволило значительно повторно использовать код и изолировать его от специфики оборудования с помощью логических операторов, таких как READ / WRITE /GET/PUT. Сборка использовалась и до сих пор используется для критичных по времени систем и часто во встроенных системах, поскольку она дает самый прямой контроль над тем, что делает машина.

Процедурные языки[править]

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

  • COmmon Business Oriented Language (COBOL) – использует такие термины, как файл, перемещение и копирование.
  • Перевод формул (FORTRAN) – используя терминологию математического языка, она разрабатывалась в основном для научных и инженерных задач.
  • ALGOrithmic Language (ALGOL) – ориентированный на то, чтобы быть подходящим языком для определения алгоритмов, используя при этом терминологию математического языка, ориентированную на научные и инженерные проблемы, как и FORTRAN.
  • Язык программирования One (PL/I) – гибридный коммерчески-научный язык общего назначения, поддерживающий указатели.
  • Beginners All purpose Symbolic Instruction Code (BASIC) – он был разработан, чтобы позволить большему количеству людей писать программы.
  • C - язык программирования общего назначения, первоначально разработанный Деннисом Ричи между 1969 и 1973 годами в AT&T Bell Labs.

Все эти языки следуют процедурной парадигме. То есть они описывают, шаг за шагом, именно ту процедуру, которая должна, по крайней мере, по мнению конкретного программиста, выполняться для решения конкретной проблемы. Таким образом, эффективность и действенность любого такого решения полностью субъективны и сильно зависят от опыта, изобретательности и способностей программиста.

Объектно-ориентированное программирование[править]

Основная статья: Объектно-ориентированное программирование

Вслед за широким использованием процедурных языков были созданы языки объектно-ориентированного программирования (ООП), такие как Simula, Smalltalk, C++, Eiffel, Python, PHP, Java и C#. В этих языках данные и методы их обработки хранятся как единое целое, называемое объектом. При идеальной инкапсуляции, одной из отличительных особенностей ООП, единственный способ, которым другой объект или пользователь сможет получить доступ к данным, - это методы объекта. Таким образом, внутренняя работа объекта может быть изменена, не затрагивая код, который использует объект. Александр Степанов, Ричард Столлман и другие программисты до сих пор спорят об эффективности парадигмы ООП по сравнению с процедурной парадигмой. Необходимость для каждого объекта иметь ассоциативные методы заставляет некоторых скептиков связывать ООП с программным раздуванием; попытка решить эту дилемму произошла через полиморфизм.

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

Дальнейшие парадигмы[править]

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

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

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

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

Символьное программирование - это парадигма, которая описывает программы, способные манипулировать формулами и компонентами программы как данными.[3] Таким образом, программы могут эффективно модифицировать себя и, по-видимому, "учиться", что делает их подходящими для таких приложений, как искусственный интеллект, экспертные системы, обработка естественного языка и компьютерные игры. Языки, поддерживающие эту парадигму, включают Lisp и Prolog[12].

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

7 блоков[править]

  1. Время
  2. Место
  3. Окружение (Среда)
  4. Процессы
  5. Процедуры
  6. Ресурсы
  7. Результат (Итог)

Ха ОС

Поддержка нескольких парадигм[править]

См. также: Сравнение многопарадигмальных языков программирования

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

См. также[править]

Пруф[править]

info.ucl.ac.be/~pvr/paradigms.html