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

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

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

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

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

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

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

Обзор

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

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

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

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

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

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

Критика

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

История

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

Машинный код

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

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

Процедурные языки

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

  • COmmon деловой язык (КОБОЛ ) - использует такие термины, как файл, шаг и копировать.
  • FORmula TRANslation (FORTRAN ) - с помощью математический языковой терминологии, он был разработан в основном для научных и инженерных задач.
  • АЛГОрифмический язык (АЛГОЛ ) - сосредоточен на том, чтобы быть подходящим языком для определения алгоритмы, используя терминологию математического языка для решения научных и инженерных задач, как и FORTRAN.
  • Первый язык программирования (PL / I ) - гибридный коммерчески-научный язык общего назначения, поддерживающий указатели.
  • Универсальный код символической инструкции для начинающих (БАЗОВЫЙ ) - он был разработан, чтобы дать возможность большему количеству людей писать программы.
  • C - язык программирования общего назначения, первоначально разработанный Деннис Ричи между 1969 и 1973 годами в AT&T Bell Labs.

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

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

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

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

Дальнейшие парадигмы

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

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

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

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

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

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

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

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

Смотрите также

Рекомендации

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

внешняя ссылка