Сравнение многопарадигмальных языков программирования - Comparison of multi-paradigm programming languages

Языки программирования можно сгруппировать по количеству и типам парадигмы поддерживается.

Резюме парадигм

Краткая справка по парадигмам программирования, перечисленным в этой статье.

  • Параллельное программирование - иметь языковые конструкции для параллелизма, они могут включать многопоточность, поддержку распределенных вычислений, передачу сообщений, общие ресурсы (включая общую память) или фьючерсы
    • Актерское программирование - одновременное вычисление с актеры которые принимают местные решения в ответ на окружающую среду (способны к эгоистичному или конкурентному поведению)
  • Ограниченное программирование - отношения между переменными выражаются как ограничения (или сети ограничений), направляющие допустимые решения (использует удовлетворение ограничений или симплексный алгоритм )
  • Программирование потока данных - принудительный пересчет формул при изменении значений данных (например, электронные таблицы )
  • Декларативное программирование - описывает, что должны выполняться вычисления, без указания подробных изменений состояния c.f. императивное программирование (функциональное и логическое программирование являются основными подгруппами декларативного программирования)
  • Распределенное программирование - иметь поддержку нескольких автономных компьютеров, которые обмениваются данными через компьютерные сети
  • Функциональное программирование - использует оценку математических функций и избегает состояния и изменяемых данных
  • Общее программирование - использует алгоритмы, написанные в терминах типов, которые будут определены позже, которые затем создаются по мере необходимости для определенных типов, предоставленных в качестве параметров
  • Императивное программирование - явные инструкции, которые изменяют состояние программы
  • Логическое программирование - использует явную математическую логику для программирования
  • Метапрограммирование - написание программ, которые пишут или манипулируют другими программами (или самими собой) в качестве своих данных, или которые выполняют часть работы во время компиляции, которая в противном случае была бы выполнена во время выполнения
    • Метапрограммирование шаблона - методы метапрограммирования, в которых шаблоны используются компилятором для генерации временного исходного кода, который объединяется компилятором с остальной частью исходного кода и затем компилируется
    • Светоотражающее программирование - методы метапрограммирования, при которых программа модифицирует или расширяет себя
  • Объектно-ориентированного программирования - использует структуры данных, состоящие из полей данных и методов вместе с их взаимодействиями (объектами) для разработки программ
    • На основе классов - объектно-ориентированное программирование, в котором наследование достигается путем определения классов объектов, а не самих объектов
    • На основе прототипа - объектно-ориентированное программирование, которое избегает классов и реализует наследование через клонирование экземпляров
  • Конвейерное программирование - простое изменение синтаксиса, чтобы добавить синтаксис для вложенных вызовов функций на язык, изначально разработанный без них
  • Программирование на основе правил - сеть практических правил, которые составляют базу знаний и могут использоваться для экспертных систем и вывода и решения проблем.
  • Визуальное программирование - манипулирование элементами программы графически, а не путем их текстового задания (например, Simulink ); также называется схематическое программирование[1]

Обзор языка

Список языков программирования с несколькими парадигмами
ЯзыкКоличество парадигмОдновременныйОграниченияПоток данныхДекларативнаяРаспространеноФункциональныйМетапрограммированиеУниверсальныйИмперативЛогикаОтражениеОбъектно ориентированныйТрубопроводыВизуальныйОснованный на правилахДругие парадигмы
Ада[2][3][4][5][6]5да[а 1]НетНетНетдаНетНетдадаНетНетда[а 2]НетНетНетНет
ALF2НетНетНетНетНетдаНетНетНетдаНетНетНетНетНетНет
AmigaE[нужна цитата ]2НетНетНетНетНетНетНетНетдаНетНетда[а 2]НетНетНетНет
APL3НетНетНетНетНетдаНетНетдаНетНетНетНетНетНетМассив (многомерный)
БЕТА[нужна цитата ]3НетНетНетНетНетдаНетНетдаНетНетда[а 2]НетНетНетНет
C ++7 (15)да[7][8][9]Библиотека[10]Библиотека[11][12]Библиотека[13][14]Библиотека[15][16]дада[17]да[а 3]даБиблиотека[18][19]Библиотека[20]да[а 2]да[21]НетБиблиотека[22]Массив (многомерный; с использованием STL )
C #6 (7)даНетБиблиотека[а 4]НетНетда[a 5]НетдадаНетдада[а 2]НетНетНетреактивный[6]
ChucK[нужна цитата ]3даНетНетНетНетНетНетНетдаНетНетда[а 2]НетНетНетНет
Клэр2НетНетНетНетНетдаНетНетНетНетНетда[а 2]НетНетНетНет
Clojure5да[23][24]НетНетдаНетда[25]да[26]НетНетБиблиотека[27]НетНетда[28]редактор[29]НетМножественная отправка,[30] Агенты[31]
Common Lisp5Библиотека[32]Библиотека[33]Библиотека[34]да[35]Библиотека[36]дадада[37]даБиблиотека[38]даДа (множественная отправка, комбинации методов)[39][а 2]Библиотека[40]НетБиблиотека[41]Множественная отправка, система мета-ООП,[42] Язык расширяется с помощью метапрограммирования.
Завиток5НетНетНетНетНетдаНетда[а 3]даНетдада[а 2]НетНетНетНет
Карри4дадаНетНетНетдаНетНетНетдаНетНетНетНетНетНет
D (версия 2.0)[43][44]6да[7]НетНетНетНетдада[45][а 3]да[а 3]даНетНетда[а 2]НетНетНетНет
Дилан[нужна цитата ]3НетНетНетНетНетдаНетНетНетНетдада[а 2]НетНетНетНет
E3даНетНетНетдаНетНетНетНетНетНетда[а 2]НетНетНетНет
ECMAScript[46][47] (ActionScript, E4X, JavaScript, JScript )4 (5)частичный (обещания, собственные расширения)[8]НетНетБиблиотека[48][49]НетдаНетНетдаНетдада[9]Библиотека[50][51]редактор[52]Нетреактивный,[10][53] управляемый событием[а 11][12]
Embarcadero Delphi3НетНетНетНетНетНетНетда[а 3]даНетНетда[а 2]НетНетНетНет
Erlang3даНетНетдададаНетНетНетНетНетНетдаНетНетНет
Эликсир4даНетНетНетдададаНетНетНетНетНетдаНетНетНет
Вяз6даНетдадаНетдаНетдаНетНетНетНетдаНетНетреактивный
F #7 (8)да[7]НетБиблиотека[а 4]даНетдаНетдадаНетдада[а 2]НетНетНетреактивный[6]
Фортран4 (5)даНетНетНетНетда[а 13]Нетда[а 14]НетНетНетда[а 2]НетНетНетМножество (многомерный)
Идти4даНетНетНетНетНетНетНетдаНетдаНетдаНетНетНет
Haskell8 (15)даБиблиотека[54]Библиотека[55]даБиблиотека[56]Да (ленивый )да[57]дадаБиблиотека[58]НетНеизменныйдадаБиблиотека[59]грамотные, реактивные, зависимые типы (частично)
Ио4да[7]НетНетНетНетдаНетНетдаНетНетда[9]НетНетНетНет
J[нужна цитата ]3НетНетНетНетНетдаНетНетдаНетНетда[а 2]НетНетНетНет
Ява6даБиблиотека[60]Библиотека[61]НетНетдаНетдадаНетдада[а 2]НетНетНетНет
Юля9 (17)даБиблиотека[62]Библиотека[63][64]Библиотека[65]даДа (жаждущий )дададаБиблиотека[66]даДа (множественная отправка, а не традиционная разовая)даНетБиблиотека[67][68]Множественная отправка,
Множество (многомерный); необязательно ленивый[69] и реактивный (с библиотеками)
Котлин8даНетНетНетНетдадададаНетдададаНетНетНет
LabVIEW4даНетдаНетНетНетНетНетНетНетНетдаНетдаНетНет
Лава2НетНетНетНетНетНетНетНетНетНетНетда[а 2]НетдаНетНет
LispWorks (версия 6.0 с поддержкой симметричной многопроцессорности, правил, логики (Prolog), CORBA)9даНетНетНетдададаНетдададада[а 2]НетНетдаНет
Lua[нужна цитата ]3НетНетНетНетНетдаНетНетдаНетНетда[9]НетНетНетНет
MATLAB6 (10)Ящик для инструментов[70]Ящик для инструментов[71]да[72]НетЯщик для инструментов[73]Нетда[74]да[75]НетНетда[76]да[77]Нетда[78]НетМножество (многомерный)
Nemerle7даНетНетНетНетдадададаНетдада[а 2]НетНетНетНет
Object Pascal4даНетНетНетНетдаНетНетдаНетНетда[а 2]НетНетНетНет
OCaml4НетНетНетНетНетдаНетдадаНетНетда[а 2]НетНетНетНет
Унция11дадададададаНетНетдадаНетда[а 2]даНетдаНет
Perl[нужна цитата ]8 (9)да[79]Библиотека[80]да[81]НетНетдадаНетдаНетда[а 2]да[а 2]даНетНетНет
PHP[82][83][84]4НетНетНетНетНетдаНетНетдаНетдада[а 2]НетНетНетНет
Поплог3НетНетНетНетНетдаНетНетдадаНетНетНетНетНетНет
Prograph3НетНетдаНетНетНетНетНетНетНетНетда[а 2]НетдаНетНет
Python5 (10)Библиотека[85][86]Библиотека[87]НетНетБиблиотека[88]Частичноеда[89][90]да[91][92]даБиблиотека[93]дада[а 2]Нетредактор[94]Нетструктурированный
р4НетНетНетНетНетдаНетНетдаНетдадада[95]НетНетМассив (многомерный)
Ракетка6да[96]НетНетНетНетдадаНетдадададаНетНетНетНет
Раку10да[97]да[98]да[99]НетБиблиотека[100]дада[101]да[102]даНетда[103]да[104]даНетНетМножественная рассылка, ленивые списки, реагирование.
ROOP3НетНетНетНетНетНетНетНетдадаНетНетНетНетдаНет
Рубин5НетНетНетНетНетдадаНетдаНетдада[а 2]НетНетНетНет
Ржавчина (версия 1.0.0-альфа)6да[7]НетНетНетНетдада[105][106]да[107]даНетНетдаНетНетНетлинейный, аффлайн и типы владения
Sather[нужна цитата ]2НетНетНетНетНетдаНетНетНетНетНетда[а 2]НетНетНетНет
Scala[108][109]9да[7]Нетда[а 15]даНетдадададаНетдада[а 2]НетНетНетНет
Симула[нужна цитата ]2НетНетНетНетНетНетНетНетдаНетНетда[а 2]НетНетНетНет
СИЗАЛ3даНетдаНетНетдаНетНетНетНетНетНетНетНетНетНет
Таблицы2НетНетНетНетНетдаНетНетНетНетНетНетНетдаНетНет
Быстрый7даНетНетНетНетдадададаНетдада[а 2]НетНетНетблочно-структурированный
Tcl с расширением Snit[нужна цитата ]3НетНетНетНетНетда[110]НетНетдаНетНетда[9][111]НетНетНетНет
Visual Basic .NET6 (7)даНетБиблиотека[а 4]НетНетдаНетдадаНетдада[а 2]НетНетНетреактивный[6]
Windows PowerShell6НетНетНетНетНетдаНетдадаНетдада[а 2]даНетНетНет
Язык Wolfram Language & Mathematica13[112] (14)дадададададададададададада[113]НетдаНа основе знаний

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

Примечания

  1. ^ рандеву и на основе монитора
  2. ^ а б c d е ж грамм час я j k л м п о п q р s т ты v ш Икс у z аа ab ac объявление ае аф аг ах ай На основе классов
  3. ^ а б c d е Метапрограммирование шаблона
  4. ^ а б c с помощью TPL Dataflow
  5. ^ Только лямбда поддержка (ленивое функциональное программирование)
  6. ^ а б c с помощью Реактивные расширения (Rx)
  7. ^ а б c d е актерское программирование
  8. ^ с помощью Node.js ' кластер модуль или child_process.fork метод веб-работники в браузере и т. д.
  9. ^ а б c d На основе прототипа
  10. ^ с помощью Реактивные расширения (RxJS)
  11. ^ в Node.js через их События модуль
  12. ^ в браузерах через родные EventTarget API
  13. ^ чисто функциональный
  14. ^ параметризованные классы
  15. ^ Акка В архиве 2013-01-19 в Wayback Machine

Цитаты

  1. ^ Bragg, S.D .; Дрискилл, К. (20–22 сентября 1994 г.). «Диаграммно-графические языки программирования и DoD-STD-2167A». Материалы AUTOTESTCON '94. IEEEXplore. IEEE. С. 211–220. Дои:10.1109 / AUTEST.1994.381508. ISBN  978-0-7803-1910-3.
  2. ^ Справочное руководство по Ada, ISO / IEC 8652: 2005 (E) Ed. 3, Раздел 9: Задачи и синхронизация
  3. ^ Справочное руководство по Ada, ISO / IEC 8652: 2005 (E) Ed. 3 Приложение E: Распределенные системы
  4. ^ Справочное руководство по Ada, ISO / IEC 8652: 2005 (E) Ed. 3, Раздел 12: Стандартные единицы
  5. ^ Справочное руководство по Ada, ISO / IEC 8652: 2005 (E) Ed. 3, Раздел 6: Подпрограммы
  6. ^ Справочное руководство по Ada, ISO / IEC 8652: 2005 (E) Ed. 3, 3.9 Типы с тегами и расширения типов
  7. ^ Поддержка потоков
  8. ^ Поддержка Atomics
  9. ^ Модель памяти
  10. ^ Gecode
  11. ^ SystemC
  12. ^ Boost.Iostreams
  13. ^ Boolinq
  14. ^ АраРат
  15. ^ OpenMPI
  16. ^ Boost.MPI
  17. ^ Boost.MPL
  18. ^ LC ++
  19. ^ Кастор В архиве 2013-01-25 в Wayback Machine
  20. ^ Отражать библиотеку
  21. ^ N3534
  22. ^ Boost.Spirit
  23. ^ Clojure - Параллельное программирование
  24. ^ Clojure - core.async
  25. ^ Clojure - Функциональное программирование
  26. ^ Clojure - Макросы
  27. ^ Clojure - core.logic
  28. ^ Clojure - Руководство по макросам многопоточности
  29. ^ «Световой стол». 2019-04-08.
  30. ^ Мультиметоды и иерархии
  31. ^ Агенты и асинхронные действия
  32. ^ [1] многие парадигмы параллелизма реализованы как языковые расширения
  33. ^ [2] программирование ограничений внутри CL через расширения
  34. ^ [3] расширение потока данных
  35. ^ [4] путем создания DSL с использованием встроенного метапрограммирования; также см. примечание о функциональных парадигмах, ограничениях и логике, которые являются частью декларативного
  36. ^ [5] MPI и т. Д. Через языковые расширения
  37. ^ метапрограммирование шаблонов с использованием макросов (см. C ++)
  38. ^ [6] [7] [8] Пролог реализован как расширение языка
  39. ^ Общая объектная система Lisp см. статью в Википедии о CLOS, объектной системе Common Lisp.
  40. ^ реализуется пользователем через короткий макрос, пример реализации: [9]
  41. ^ [10] расширение программирования на основе правил
  42. ^ [11] через протокол метаобъектов
  43. ^ D Таблица функций языка
  44. ^ Фобос std. Алгоритм
  45. ^ Строковые миксины языка D
  46. ^ Маленький JavaScripter демонстрирует фундаментальную общность с функциональным языком Scheme.
  47. ^ Объектно-ориентированное программирование в JavaScript В архиве 2019-02-10 в Wayback Machine дает обзор методов объектно-ориентированного программирования в JavaScript.
  48. ^ «React - библиотека JavaScript для создания пользовательских интерфейсов». 2019-04-08.
  49. ^ «ТНГ-крючки». 2019-04-08.
  50. ^ "Документация Lodash". 2019-04-08.
  51. ^ "Мори". 2019-04-08.
  52. ^ «Световой стол». 2019-04-08.
  53. ^ «ТНГ-крючки». 2019-04-08.
  54. ^ Встраивание пролога
  55. ^ «Функциональное реактивное программирование - HaskellWiki».
  56. ^ Cloud Haskell
  57. ^ «Шаблон Haskell - HaskellWiki».
  58. ^ "Logict: монада логического программирования с возвратом".
  59. ^ [12]
  60. ^ https://jcp.org/en/jsr/detail?id=331 JSR 331: API программирования с ограничениями
  61. ^ https://github.com/GoogleCloudPlatform/DataflowJavaSDK SDK Google Cloud Platform Dataflow
  62. ^ "JuliaOpt / JuMP.jl". GitHub. JuliaOpt. 11 февраля 2020 г.. Получено 12 февраля 2020.
  63. ^ "GitHub - MikeInnes / DataFlow.jl". 2019-01-15.
  64. ^ «GitHub - JuliaGizmos / Reactive.jl: примитивы реактивного программирования для Джулии». 2018-12-28.
  65. ^ https://github.com/davidanthoff/Query.jl Запрашивать почти все в julia
  66. ^ https://github.com/lilinjn/LilKanren.jl Коллекция реализаций Канрена в Julia
  67. ^ "GitHub - abeschneider / PEGParser.jl: PEG Parser для Юлии". 2018-12-03.
  68. ^ «GitHub - gitfoxi / Parsimonious.jl: генератор парсера PEG для Джулии». 2017-08-03.
  69. ^ Ленивый https://github.com/MikeInnes/Lazy.jl
  70. ^ «Выполнять итерации цикла параллельно». mathworks.com. Получено 21 октября 2016.
  71. ^ «Ограничения записи». mathworks.com. Получено 21 октября 2016.
  72. ^ «Начало работы с SimEvents». mathworks.com. Получено 21 октября 2016.
  73. ^ «Выполнять итерации цикла параллельно». mathworks.com. Получено 21 октября 2016.
  74. ^ "Выполнить выражение MATLAB в тексте - MATLAB eval". mathworks.com. Получено 21 октября 2016.
  75. ^ «Определить класс объекта». mathworks.com. Получено 21 октября 2016.
  76. ^ «Метаданные класса». mathworks.com. Получено 21 октября 2016.
  77. ^ "Объектно-ориентированного программирования". mathworks.com. Получено 21 октября 2016.
  78. ^ «Симулинк». mathworks.com. Получено 21 октября 2016.
  79. ^ потоки на основе интерпретатора
  80. ^ лось
  81. ^ Perl высшего порядка
  82. ^ Руководство по PHP, Глава 17. Функции
  83. ^ Руководство по PHP, Глава 19. Классы и объекты (PHP 5)
  84. ^ Руководство по PHP, Анонимные функции
  85. ^ «Параллельная обработка и многопроцессорность в Python». wiki.python.org. Получено 21 октября 2016.
  86. ^ "threading - высокоуровневый интерфейс потоковой передачи". docs.python.org. Получено 21 октября 2016.
  87. ^ "ограничение питона". pypi.python.org. Получено 21 октября 2016.
  88. ^ «Распределенное программирование». wiki.python.org. Получено 21 октября 2016.
  89. ^ «Глава 9. Метапрограммирование». chimera.labs.oreilly.com. Архивировано из оригинал 23 октября 2016 г.. Получено 22 октября 2016.
  90. ^ «Метапрограммирование». readthedocs.io. Получено 22 октября 2016.
  91. ^ «PEP 443 - Универсальные функции с однократной отправкой». python.org. Получено 22 октября 2016.
  92. ^ «PEP 484 - Типовые подсказки». python.org. Получено 22 октября 2016.
  93. ^ "PyDatalog". Получено 22 октября 2016.
  94. ^ «Световой стол». 2019-04-08.
  95. ^ "Магриттр: Оператор прямой трубы для R". cran.r-project.org accessdate = 13 июля 2017 г..
  96. ^ Руководство по Racket: параллелизм и синхронизация
  97. ^ Каналы и другие механизмы
  98. ^ «Подпись класса».
  99. ^ Оператор подачи
  100. ^ https://github.com/perl6/doc/issues/1744#issuecomment-360565196 Модуль Cro
  101. ^ «Мета-программирование: что, почему и как». 2011-12-14.
  102. ^ https://perl6advent.wordpress.com/2009/12/18/day-18-roles/ Параметризованные роли
  103. ^ «Мета-объектный протокол (MOP)».
  104. ^ https://docs.perl6.org/language/classtut Классы и роли
  105. ^ "Руководство по макросам Rust". Ржавчина. Получено 19 января 2015.
  106. ^ "Руководство по плагинам компилятора Rust". Ржавчина. Получено 19 января 2015.
  107. ^ Справочник по Rust §6.1.3.1
  108. ^ Обзор языка программирования Scala
  109. ^ Спецификация языка Scala
  110. ^ "Программирование на Tcl / Введение". en.wikibooks.org. Получено 22 октября 2016.
  111. ^ "TCLLIB - Стандартная библиотека Tcl: snitfaq". sourceforge.net. Получено 22 октября 2016.
  112. ^ Примечания для экспертов по языку программирования, Документация по языку Wolfram Language.
  113. ^ Внешние программы, Документация по языку Wolfram Language.

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

  • Джим Коплиен, Мультипарадигмальный дизайн для C ++, Addison-Wesley Professional, 1998.