Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

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

Обзор различных парадигм программирования в соответствии с Питером Ван Роем [4] : 5 [5]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • COmmon Business Oriented Language ( COBOL ) - использует такие термины, как файл , перемещение и копирование .
  • FORmula TRANslation ( FORTRAN ) - используя терминологию математического языка, он был разработан в основном для научных и инженерных задач.
  • Алгоритмический язык ( ALGOL ) - ориентирован на то, чтобы быть подходящим языком для определения алгоритмов , с использованием терминологии математического языка для решения научных и инженерных задач, как и FORTRAN.
  • Programming Language One ( PL / I ) - гибридный коммерчески-научный язык общего назначения, поддерживающий указатели .
  • Универсальный код символьных инструкций для начинающих ( BASIC ) - он был разработан, чтобы дать возможность большему количеству людей писать программы.
  • C  - язык программирования общего назначения, первоначально разработанный Деннисом Ричи в период с 1969 по 1973 год в AT&T Bell Labs .

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

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

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

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

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

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

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

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

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

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

Дифференцируемое программирование структурирует программы таким образом, чтобы их можно было различать повсюду, обычно с помощью автоматического различения . [12] [13]

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

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

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

  • Сравнение парадигм программирования
  • Доменный язык
  • Язык моделирования
  • Область программирования
  • Полнота по Тьюрингу
  • Языки программирования фон Неймана

Ссылки [ править ]

  1. ^ Нёрмарк, Курт. Обзор четырех основных парадигм программирования . Университет Ольборга, 9 мая 2011 г. Проверено 22 сентября 2012 г.
  2. ^ Frans Coenen (1999-10-11). «Характеристики декларативных языков программирования» . cgi.csc.liv.ac.uk . Проверено 20 февраля 2014 .
  3. ^ а б Майкл А. Ковингтон (2010-08-23). «CSCI / ARTI 4540/6540: Первая лекция по символическому программированию и LISP» (PDF) . Университет Джорджии. Архивировано из оригинального (PDF) 07 марта 2012 года . Проверено 20 ноября 2013 .
  4. Питер Ван Рой (12 мая 2009 г.). «Парадигмы программирования: что должен знать каждый программист» (PDF) . info.ucl.ac.be . Проверено 27 января 2014 .
  5. ^ Питер Ван-Рой; Сейф Хариди (2004). Концепции, методы и модели компьютерного программирования . MIT Press. ISBN 978-0-262-22069-9.
  6. Франк Рубин (март 1987 г.). « Считается вредным » « GOTO Считается вредным» (PDF) . Коммуникации ACM . 30 (3): 195–196. DOI : 10.1145 / 214748.315722 . S2CID 6853038 . Архивировано из оригинального (PDF) 20 марта 2009 года.  
  7. Рианна Харпер, Роберт (1 мая 2017 г.). "Что такое парадигма программирования?" . Пятнадцать восемьдесят четыре . Издательство Кембриджского университета.
  8. Кришнамурти, Шрирам (ноябрь 2008 г.). «Обучение языкам программирования в постлиннейскую эпоху» . СИГПЛАН . ACM. С. 81–83. Нет. 43, 11..
  9. Перейти ↑ Floyd, RW (1979). «Парадигмы программирования» . Коммуникации ACM . 22 (8): 455–460. DOI : 10.1145 / 359138.359140 .
  10. ^ «Наследование режимов, клонирование, перехватчики и ООП (обсуждение в группах Google)» .
  11. ^ «Бизнес-глоссарий: определение символического программирования» . allbusiness.com . Проверено 30 июля 2014 .
  12. ^ Ван, Фэй; Декер, Джеймс; У, Силунь; Эссертель, Грегори; Rompf, Tiark (2018), Bengio, S .; Wallach, H .; Larochelle, H .; Грауман, К. (ред.), «Обратное распространение с обратными вызовами : основы эффективного и выразительного дифференцируемого программирования» (PDF) , « Достижения в системах обработки нейронной информации» 31 , Curran Associates, Inc., стр. 10201–10212 , получено 2019-02 -13
  13. ^ Иннес, Майк (2018). «О машинном обучении и языках программирования» (PDF) . Конференция SysML 2018 . Архивировано из оригинального (PDF) 20 сентября 2018 года . Проверено 13 февраля 2019 .
  14. ^ "Многопарадигмальный язык программирования" . developer.mozilla.org . Mozilla Foundation . Архивировано из оригинального 21 августа 2013 года .

Внешние ссылки [ править ]

  • Классификация основных парадигм программирования
  • Как парадигмы программирования развиваются и принимаются?