Перейти до вмісту

Порівняння багатопарадигмальних мов програмування

Матеріал з Вікіпедії — вільної енциклопедії.

Мови програмування можна згрупувати за кількістю та типами підтримуваних парадигм.

Підсумки парадигм

[ред. | ред. код]

Коротке посилання на парадигми програмування, перелічені в цій статті.

  • Одночасне програмування – наявність мовних конструкцій для паралелізму, це може включати багатопотоковість, підтримку розподілених обчислень, передачу повідомлень, спільні ресурси (включаючи спільну пам’ять) або обіцянки
    • Програмування акторів – одночасне обчислення з акторами, які ухвалюють локальні рішення у відповідь на середовище (здатні до егоїстичної або конкурентної поведінки)
  • Програмування в обмеженнях – зв’язки між змінними виражаються як обмеження (або мережі обмежень), що спрямовує допустимі рішення (використовує задоволення обмежень або симплексний алгоритм)
  • Програмування потоку даних – примусовий перерахунок формул при зміні значень даних (наприклад, електронні таблиці)
  • Декларативне програмування – описує, що має виконувати обчислення, без вказівки детальних змін стану порівняно з імперативним програмуванням (функціональне та логічне програмування є основними підгрупами декларативного програмування)
  • Розподілене програмування – підтримка кількох автономних комп’ютерів, які спілкуються через комп’ютерні мережі
  • Функціональне програмування – використовує оцінку математичних функцій і уникає стану та змінних даних
  • Узагальнене програмування – використовує алгоритми, написані в термінах типів, які будуть визначені пізніше, які потім створюються за потреби для конкретних типів, наданих як параметри
  • Імперативне програмування – явні оператори, які змінюють стан програми
  • Логічне програмування – використовує явну математичну логіку для програмування
  • Метапрограмування – написання програм, які пишуть або маніпулюють іншими програмами (або собою) як їхніми даними, або виконують частину роботи під час компіляції, яка інакше була б виконана під час виконання
    • Шаблонне метапрограмування – методи метапрограмування, у яких шаблони використовуються компілятором для створення тимчасового вихідного коду, який компілятор об’єднує з рештою вихідного коду, а потім компілює
    • Рефлексивне програмування – методи метапрограмування, за яких програма змінює або розширює саму себе
  • Об’єктно-орієнтоване програмування – використовує структури даних, що складаються з полів даних і методів разом з їх взаємодією (об’єктами) для розробки програм
    • На основі класів – об’єктно-орієнтоване програмування, у якому успадкування досягається шляхом визначення класів об’єктів, а не самих об’єктів.
    • На основі прототипу – об’єктно-орієнтоване програмування, яке уникає класів і реалізує успадкування через клонування екземплярів
  • Конвеєрне програмування – проста зміна синтаксису для додавання синтаксису до викликів вкладених функцій до мови, спочатку розробленої без жодного
  • Програмування на основі правил – мережа емпіричних правил, які містять базу знань і можуть бути використані для експертних систем, дедукції та вирішення проблем
  • Візуальне програмування – маніпулювання елементами програми графічно, а не вказуючи їх текстово (наприклад, Simulink); також називається діаграмним програмуванням[1].

Огляд мови

[ред. | ред. код]
Список мультипарадигмальних мов програмування
Мова Кількість парадигм Одночасна Обмеження Потік даних Декларативна Розподілена Функціональна Метапрограмування Універсальна Імперативна Логічна Рефлексія Об'єктно­орієнтована Конвеєрна Візуальна На основі правил Інші парадигми
Ada[2][3][4][5][6] 5 Так[a 1] Ні Ні Ні Так Ні Ні Так Так Ні Ні Так[a 2] Ні Ні Ні Ні
ALF 2 Ні Ні Ні Ні Ні Так Ні Ні Ні Так Ні Ні Ні Ні Ні Ні
AmigaE[джерело?] 2 Ні Ні Ні Ні Ні Ні Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
APL 3 Ні Ні Ні Ні Ні Так Ні Ні Так Ні Ні Ні Ні Ні Ні Array (multi-dimensional)
BETA [джерело?] 3 Ні Ні Ні Ні Ні Так Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
C++ 7 (15) Так[7][8][9] Library[10] Library[11][12] Library[13][14] Library[15][16] Так Так[17] Так[a 3] Так Library[18][19] Library[20] Так[a 2] Так[21] Ні Library[22] Array (multi-dimensional; using STL)
C# 6 (7) Так Ні Library[a 4] Ні Ні Так[a 5] Ні Так Так Ні Так Так[a 2] Ні Ні Ні reactive[a 6]
ChucK [джерело?] 3 Так Ні Ні Ні Ні Ні Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
Claire 2 Ні Ні Ні Ні Ні Так Ні Ні Ні Ні Ні Так[a 2] Ні Ні Ні Ні
Clojure 5 Так[23][24] Ні Ні Так Ні Так[25] Так[26] Ні Ні Library[27] Ні Ні Так[28] Editor[29] Ні Multiple dispatch,[30] Agents[31]
Common Lisp 7 (14) Library[32] Library[33] Library[34] Так[35] Library[36] Так Так Так[37] Так Library[38] Так Так (multiple dispatch, method combinations)[39][a 2] Library[40] Ні Library[41] Multiple dispatch, meta-OOP system,[42] Language is extensible via metaprogramming.
Curl 5 Ні Ні Ні Ні Ні Так Ні Так[a 3] Так Ні Так Так[a 2] Ні Ні Ні Ні
Curry 4 Так Так Ні Ні Ні Так Ні Ні Ні Так Ні Ні Ні Ні Ні Ні
D (версія 2.0)[43][44] 6 Так[a 7] Ні Ні Ні Ні Так Так[45][a 3] Так[a 3] Так Ні Ні Так[a 2] Ні Ні Ні Ні
Delphi 3 Ні Ні Ні Ні Ні Ні Ні Так[a 3] Так Ні Ні Так[a 2] Ні Ні Ні Ні
Dylan[джерело?] 3 Ні Ні Ні Ні Ні Так Ні Ні Ні Ні Так Так[a 2] Ні Ні Ні Ні
E 3 Так Ні Ні Ні Так Ні Ні Ні Ні Ні Ні Так[a 2] Ні Ні Ні Ні
ECMAScript[46][47] (ActionScript, E4X, JavaScript, JScript) 4 (5) partial (promises, native extensions)[a 8] Ні Ні Library[48][49] Ні Так Ні Ні Так Ні Так Так[a 9] Library[50][51] Editor[29] Ні reactive,[a 10][49] event driven[a 11][a 12]
Erlang 3 Так Ні Ні Так Так Так Ні Ні Ні Ні Ні Ні Так Ні Ні Ні
Elixir 4 Так Ні Ні Ні Так Так Так Ні Ні Ні Ні Ні Так Ні Ні Ні
Elm 6 Так Ні Так Так Ні Так Ні Так Ні Ні Ні Ні Так Ні Ні reactive
F# 7 (8) Так[a 7] Ні Library[a 4] Так Ні Так Ні Так Так Ні Так Так[a 2] Ні Ні Ні reactive[a 6]
Fortran 4 (5) Так Ні Ні Ні Ні Так[a 13] Ні Так[a 14] Ні Ні Ні Так[a 2] Ні Ні Ні Array (multi-dimensional)
Go 4 Так Ні Ні Ні Ні Ні Ні Ні Так Ні Так Ні Так Ні Ні Ні
Haskell 8 (15) Так Library[52] Library[53] Так Library[54] Так (lazy) Так[55] Так Так Library[56] Ні Immutable Так Так Library[57] literate, reactive, dependent types (partial)
Io 4 Так[a 7] Ні Ні Ні Ні Так Ні Ні Так Ні Ні Так[a 9] Ні Ні Ні Ні
J [джерело?] 3 Ні Ні Ні Ні Ні Так Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
Java 6 Так Library[58] Library[59] Ні Ні Так Ні Так Так Ні Так Так[a 2] Ні Ні Ні Ні
Julia 9 (17) Так Library[60] Library[61][62] Library[63] Так Так (eager) Так Так Так Library[64] Так Так (multiple dispatch, not traditional single) Так Ні Library[65][66] Multiple dispatch,
Array (multi-dimensional); optionally lazy[67] and reactive (with libraries)
Kotlin 8 Так Ні Ні Ні Ні Так Так Так Так Ні Так Так Так Ні Ні Ні
LabVIEW 4 Так Ні Так Ні Ні Ні Ні Ні Ні Ні Ні Так Ні Так Ні Ні
Lava 2 Ні Ні Ні Ні Ні Ні Ні Ні Ні Ні Ні Так[a 2] Ні Так Ні Ні
LispWorks (версія 6.0 з підтримкою семантичної багатопроцесорної обробки, правил, логіки (Prolog), CORBA) 9 Так Ні Ні Ні Так Так Так Ні Так Так Так Так[a 2] Ні Ні Так Ні
Lua [джерело?] 3 Ні Ні Ні Ні Ні Так Ні Ні Так Ні Ні Так[a 9] Ні Ні Ні Ні
MATLAB 6 (10) Toolbox[68] Toolbox[69] Так[70] Ні Toolbox[68] Ні Так[71] Так[72] Ні Ні Так[73] Так[74] Ні Так[75] Ні Array (multi-dimensional)
Nemerle 7 Так Ні Ні Ні Ні Так Так Так Так Ні Так Так[a 2] Ні Ні Ні Ні
Object Pascal 4 Так Ні Ні Ні Ні Так Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
OCaml 4 Ні Ні Ні Ні Ні Так Ні Так Так Ні Ні Так[a 2] Ні Ні Ні Ні
Oz 11 Так Так Так Так Так Так Ні Ні Так Так Ні Так[a 2] Так Ні Так Ні
Perl [джерело?] 8 (9) Так[76] Library[77] Так[78] Ні Ні Так Так Ні Так Ні Так[a 2] Так[a 2] Так Ні Ні Ні
PHP[79][80][81] 4 Ні Ні Ні Ні Ні Так Ні Ні Так Ні Так Так[a 2] Ні Ні Ні Ні
Poplog 3 Ні Ні Ні Ні Ні Так Ні Ні Так Так Ні Ні Ні Ні Ні Ні
Prograph 3 Ні Ні Так Ні Ні Ні Ні Ні Ні Ні Ні Так[a 2] Ні Так Ні Ні
Python 5 (10) Library[82][83] Library[84] Ні Ні Library[85] Частково Так[86][87] Так[88][89] Так Library[90] Так Так[a 2] Ні Editor[29] Ні structured
R 4 (6) Library[91] Ні Ні Ні Library[92] Так Ні Ні Так Ні Так Так Так[93] Ні Ні Array (multi-dimensional)
Racket 10 Так[94] Так[95] Так[96] Ні Так[97] Так Так Ні Так Так Так Так Ні Ні Ні Lazy[98]
Raku 10 Так[99] Так[100] Так[101] Ні Library[102] Так Так[103] Так[104] Так Ні Так[105] Так[106] Так Ні Ні Multiple dispatch, lazy lists, reactive.
ROOP 3 Ні Ні Ні Ні Ні Ні Ні Ні Так Так Ні Ні Ні Ні Так Ні
Ruby 5 Ні Ні Ні Ні Ні Так Так Ні Так Ні Так Так[a 2] Ні Ні Ні Ні
Rust (версія 1.0.0-alpha) 6 Так[a 7] Ні Ні Ні Ні Так Так[107][108] Так[109] Так Ні Ні Так Ні Ні Ні linear, affline, and ownership types
Sather[джерело?] 2 Ні Ні Ні Ні Ні Так Ні Ні Ні Ні Ні Так[a 2] Ні Ні Ні Ні
Scala[110][111] 9 Так[a 7] Ні Так[a 15] Так Ні Так Так Так Так Ні Так Так[a 2] Ні Ні Ні Ні
Simula[джерело?] 2 Ні Ні Ні Ні Ні Ні Ні Ні Так Ні Ні Так[a 2] Ні Ні Ні Ні
SISAL 3 Так Ні Так Ні Ні Так Ні Ні Ні Ні Ні Ні Ні Ні Ні Ні
Spreadsheet 2 Ні Ні Ні Ні Ні Так Ні Ні Ні Ні Ні Ні Ні Так Ні Ні
Swift 7 Так Ні Ні Ні Ні Так Так Так Так Ні Так Так[a 2] Ні Ні Ні block-structured
Tcl with Snit extension [джерело?] 3 Ні Ні Ні Ні Ні Так[112] Ні Ні Так Ні Ні Так[a 9][113] Ні Ні Ні Ні
Visual Basic .NET 6 (7) Так Ні Library[a 4] Ні Ні Так Ні Так Так Ні Так Так[a 2] Ні Ні Ні reactive[a 6]
Windows PowerShell 6 Ні Ні Ні Ні Ні Так Ні Так Так Ні Так Так[a 2] Так Ні Ні Ні
Wolfram Language & Mathematica 13[114] (14) Так Так Так Так Так Так Так Так Так Так Так Так Так[115] Ні Так Knowledge Based

Дивіться також

[ред. | ред. код]

Список літератури

[ред. | ред. код]
  • Джим Коплієн, Multiparadigm Design for C++, Addison-Wesley Professional, 1998.

Коментарі

[ред. | ред. код]
  1. rendezvous and monitor-like based
  2. а б в г д е ж и к л м н п р с т у ф х ц ш щ ю я аа аб ав аг ад ае аж аи ак ал ам Class-based
  3. а б в г д Template metaprogramming
  4. а б в using TPL Dataflow
  5. only lambda support (lazy functional programming)
  6. а б в using Reactive Extensions (Rx)
  7. а б в г д actor programming
  8. using Node.js' cluster module or child_process.fork method, web workers in the browser, etc.
  9. а б в г Prototype-based
  10. using Reactive Extensions (RxJS)
  11. in Node.js via their events module
  12. in browsers via their native EventTarget API
  13. purely functional
  14. parameterized classes
  15. Akka [Архівовано 2013-01-19 у Wayback Machine.]

Примітки

[ред. | ред. код]
  1. Bragg, S.D.; Driskill, C.G. (20–22 September 1994). Diagrammatic-graphical programming languages and DoD-STD-2167A. Proceedings of AUTOTESTCON '94. IEEE. с. 211—220. doi:10.1109/AUTEST.1994.381508. ISBN 978-0-7803-1910-3.
  2. Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 9: Tasks and Synchronization
  3. Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3 Annex E: Distributed Systems
  4. Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 12: Generic Units
  5. Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 6: Subprograms
  6. Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, 3.9 Tagged Types and Type Extensions
  7. Thread support
  8. Atomics support
  9. Memory model
  10. Gecode
  11. SystemC
  12. Boost.Iostreams
  13. Boolinq
  14. AraRat (PDF). Архів оригіналу (PDF) за 19 серпня 2019. Процитовано 14 липня 2022.
  15. OpenMPI
  16. Boost.MPI
  17. Boost.MPL
  18. LC++
  19. Castor [Архівовано 2013-01-25 у Wayback Machine.]
  20. Reflect Library[недоступне посилання]
  21. N3534
  22. Boost.Spirit
  23. Clojure - Concurrent Programming
  24. Clojure - core.async
  25. Clojure - Functional Programming
  26. Clojure - Macros
  27. Clojure - core.logic
  28. Clojure - Threading Macros Guide
  29. а б в Light Table. 8 квітня 2019.
  30. Multimethods and Hierarchies
  31. Agents and Asynchronous Actions
  32. [1] many concurrency paradigms implemented as language extensions
  33. [2] constraint programming inside CL through extensions
  34. [3] dataflow extension
  35. [4] by creating DSLs using the built-in metaprogramming; also see note on functional, constraint and logic paradigms, which are part of declarative
  36. [5] MPI, etc via language extensions
  37. template metaprogramming using macros (see C++)
  38. [6] [7] [8] Prolog implemented as a language extension
  39. Common Lisp Object System see Wikipedia article on CLOS, the Common Lisp Object System.
  40. implemented by the user via a short macro, example of implementation
  41. [9] rule-based programming extension
  42. [10] [Архівовано 2018-04-26 у Wayback Machine.] through the Meta Object Protocol
  43. D Language Feature Table
  44. Phobos std.algorithm
  45. D language String Mixins
  46. The Little JavaScripter demonstrates fundamental commonality with Scheme, a functional language.
  47. Object Oriented Programming in JavaScript [Архівовано 2019-02-10 у Wayback Machine.] gives an overview of object-oriented programming techniques in JavaScript.
  48. React – A JavaScript library for building user interfaces. 8 квітня 2019.
  49. а б TNG-Hooks. 8 квітня 2019.
  50. Lodash documentation. 8 квітня 2019.
  51. mori. 8 квітня 2019.
  52. Prolog embedding
  53. Functional Reactive Programming - HaskellWiki.
  54. Cloud Haskell
  55. Template Haskell - HaskellWiki.
  56. Logict: A backtracking logic-programming monad.
  57. https://web.engr.oregonstate.edu/~erwig/HaskellRules/HaskellRules_June06.pdf
  58. https://jcp.org/en/jsr/detail?id=331 JSR 331: Constraint Programming API
  59. https://github.com/GoogleCloudPlatform/DataflowJavaSDK Google Cloud Platform Dataflow SDK
  60. JuliaOpt/JuMP.jl. GitHub. JuliaOpt. 11 лютого 2020. Процитовано 12 лютого 2020.
  61. GitHub - MikeInnes/DataFlow.jl. 15 січня 2019.
  62. GitHub - JuliaGizmos/Reactive.jl: Reactive programming primitives for Julia. 28 грудня 2018.
  63. https://github.com/davidanthoff/Query.jl Query almost anything in julia
  64. https://github.com/lilinjn/LilKanren.jl A collection of Kanren implementations in Julia
  65. GitHub - abeschneider/PEGParser.jl: PEG Parser for Julia. 3 грудня 2018.
  66. GitHub - gitfoxi/Parsimonious.jl: A PEG parser generator for Julia. 3 серпня 2017.
  67. Lazy https://github.com/MikeInnes/Lazy.jl
  68. а б Execute loop iterations in parallel. mathworks.com. Процитовано 21 жовтня 2016.
  69. Write Constraints. mathworks.com. Процитовано 21 жовтня 2016.
  70. Getting Started with SimEvents. mathworks.com. Процитовано 21 жовтня 2016.
  71. Execute MATLAB expression in text - MATLAB eval. mathworks.com. Процитовано 21 жовтня 2016.
  72. Determine class of object. mathworks.com. Процитовано 21 жовтня 2016.
  73. Class Metadata. mathworks.com. Процитовано 21 жовтня 2016.
  74. Object-Oriented Programming. mathworks.com. Процитовано 21 жовтня 2016.
  75. Simulink. mathworks.com. Процитовано 21 жовтня 2016.
  76. interpreter based threads
  77. Moose
  78. Higher Order Perl
  79. PHP Manual, Chapter 17. Functions
  80. PHP Manual, Chapter 19. Classes and Objects (PHP 5)
  81. PHP Manual, Anonymous functions
  82. Parallel Processing and Multiprocessing in Python. wiki.python.org. Процитовано 21 жовтня 2016.
  83. threading — Higher-level threading interface. docs.python.org. Процитовано 21 жовтня 2016.
  84. python-constraint. pypi.python.org. Процитовано 21 жовтня 2016.
  85. DistributedProgramming. wiki.python.org. Процитовано 21 жовтня 2016.
  86. Chapter 9. Metaprogramming. chimera.labs.oreilly.com. Архів оригіналу за 23 жовтня 2016. Процитовано 22 жовтня 2016.
  87. Metaprogramming. readthedocs.io. Процитовано 22 жовтня 2016.
  88. PEP 443 -- Single-dispatch generic functions. python.org. Процитовано 22 жовтня 2016.
  89. PEP 484 -- Type Hints. python.org. Процитовано 22 жовтня 2016.
  90. PyDatalog. Процитовано 22 жовтня 2016.
  91. Futureverse.
  92. future batchtools.
  93. Magrittr: A Forward Pipe Operator for R. cran.r-project.org\accessdate=13 July 2017. 17 листопада 2020.
  94. Racket Guide: Concurrency and Synchronization
  95. The Rosette Guide
  96. FrTime: A Language for Reactive Programs
  97. Racket Guide: Distributed Places
  98. Lazy Racket
  99. Channels and other mechanisms
  100. Class Signature.
  101. Feed operator
  102. https://github.com/perl6/doc/issues/1744#issuecomment-360565196 Cro module
  103. Meta-programming: What, why and how. 14 грудня 2011.
  104. https://perl6advent.wordpress.com/2009/12/18/day-18-roles/ Parametrized Roles
  105. Meta-object protocol (MOP).
  106. https://docs.perl6.org/language/classtut Classes and Roles
  107. The Rust macros guide. Rust. Процитовано 19 січня 2015.
  108. The Rust compiler plugins guide. Rust. Процитовано 19 січня 2015.
  109. The Rust Reference §6.1.3.1
  110. An Overview of the Scala Programming Language
  111. Scala Language Specification
  112. Tcl Programming/Introduction. en.wikibooks.org. Процитовано 22 жовтня 2016.
  113. TCLLIB - Tcl Standard Library: snitfaq. sourceforge.net. Процитовано 22 жовтня 2016.
  114. Notes for Programming Language Experts, Wolfram Language Documentation.
  115. External Programs, Wolfram Language Documentation.