Порівняння багатопарадигмальних мов програмування
Зовнішній вигляд
Мови програмування можна згрупувати за кількістю та типами підтримуваних парадигм.
Коротке посилання на парадигми програмування, перелічені в цій статті.
- Одночасне програмування – наявність мовних конструкцій для паралелізму, це може включати багатопотоковість, підтримку розподілених обчислень, передачу повідомлень, спільні ресурси (включаючи спільну пам’ять) або обіцянки
- Програмування акторів – одночасне обчислення з акторами, які ухвалюють локальні рішення у відповідь на середовище (здатні до егоїстичної або конкурентної поведінки)
- Програмування в обмеженнях – зв’язки між змінними виражаються як обмеження (або мережі обмежень), що спрямовує допустимі рішення (використовує задоволення обмежень або симплексний алгоритм)
- Програмування потоку даних – примусовий перерахунок формул при зміні значень даних (наприклад, електронні таблиці)
- Декларативне програмування – описує, що має виконувати обчислення, без вказівки детальних змін стану порівняно з імперативним програмуванням (функціональне та логічне програмування є основними підгрупами декларативного програмування)
- Розподілене програмування – підтримка кількох автономних комп’ютерів, які спілкуються через комп’ютерні мережі
- Функціональне програмування – використовує оцінку математичних функцій і уникає стану та змінних даних
- Узагальнене програмування – використовує алгоритми, написані в термінах типів, які будуть визначені пізніше, які потім створюються за потреби для конкретних типів, наданих як параметри
- Імперативне програмування – явні оператори, які змінюють стан програми
- Логічне програмування – використовує явну математичну логіку для програмування
- Метапрограмування – написання програм, які пишуть або маніпулюють іншими програмами (або собою) як їхніми даними, або виконують частину роботи під час компіляції, яка інакше була б виконана під час виконання
- Шаблонне метапрограмування – методи метапрограмування, у яких шаблони використовуються компілятором для створення тимчасового вихідного коду, який компілятор об’єднує з рештою вихідного коду, а потім компілює
- Рефлексивне програмування – методи метапрограмування, за яких програма змінює або розширює саму себе
- Об’єктно-орієнтоване програмування – використовує структури даних, що складаються з полів даних і методів разом з їх взаємодією (об’єктами) для розробки програм
- Конвеєрне програмування – проста зміна синтаксису для додавання синтаксису до викликів вкладених функцій до мови, спочатку розробленої без жодного
- Програмування на основі правил – мережа емпіричних правил, які містять базу знань і можуть бути використані для експертних систем, дедукції та вирішення проблем
- Візуальне програмування – маніпулювання елементами програми графічно, а не вказуючи їх текстово (наприклад, 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.
- ↑ rendezvous and monitor-like based
- ↑ а б в г д е ж и к л м н п р с т у ф х ц ш щ ю я аа аб ав аг ад ае аж аи ак ал ам Class-based
- ↑ а б в г д Template metaprogramming
- ↑ а б в using TPL Dataflow
- ↑ only lambda support (lazy functional programming)
- ↑ а б в using Reactive Extensions (Rx)
- ↑ а б в г д actor programming
- ↑ using Node.js' cluster module or child_process.fork method, web workers in the browser, etc.
- ↑ а б в г Prototype-based
- ↑ using Reactive Extensions (RxJS)
- ↑ in Node.js via their events module
- ↑ in browsers via their native EventTarget API
- ↑ purely functional
- ↑ parameterized classes
- ↑ Akka [Архівовано 2013-01-19 у Wayback Machine.]
- ↑ 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.
- ↑ Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 9: Tasks and Synchronization
- ↑ Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3 Annex E: Distributed Systems
- ↑ Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 12: Generic Units
- ↑ Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, Section 6: Subprograms
- ↑ Ada Reference Manual, ISO/IEC 8652:2005(E) Ed. 3, 3.9 Tagged Types and Type Extensions
- ↑ Thread support
- ↑ Atomics support
- ↑ Memory model
- ↑ Gecode
- ↑ SystemC
- ↑ Boost.Iostreams
- ↑ Boolinq
- ↑ AraRat (PDF). Архів оригіналу (PDF) за 19 серпня 2019. Процитовано 14 липня 2022.
- ↑ OpenMPI
- ↑ Boost.MPI
- ↑ Boost.MPL
- ↑ LC++
- ↑ Castor [Архівовано 2013-01-25 у Wayback Machine.]
- ↑ Reflect Library[недоступне посилання]
- ↑ N3534
- ↑ Boost.Spirit
- ↑ Clojure - Concurrent Programming
- ↑ Clojure - core.async
- ↑ Clojure - Functional Programming
- ↑ Clojure - Macros
- ↑ Clojure - core.logic
- ↑ Clojure - Threading Macros Guide
- ↑ а б в Light Table. 8 квітня 2019.
- ↑ Multimethods and Hierarchies
- ↑ Agents and Asynchronous Actions
- ↑ [1] many concurrency paradigms implemented as language extensions
- ↑ [2] constraint programming inside CL through extensions
- ↑ [3] dataflow extension
- ↑ [4] by creating DSLs using the built-in metaprogramming; also see note on functional, constraint and logic paradigms, which are part of declarative
- ↑ [5] MPI, etc via language extensions
- ↑ template metaprogramming using macros (see C++)
- ↑ [6] [7] [8] Prolog implemented as a language extension
- ↑ Common Lisp Object System see Wikipedia article on CLOS, the Common Lisp Object System.
- ↑ implemented by the user via a short macro, example of implementation
- ↑ [9] rule-based programming extension
- ↑ [10] [Архівовано 2018-04-26 у Wayback Machine.] through the Meta Object Protocol
- ↑ D Language Feature Table
- ↑ Phobos std.algorithm
- ↑ D language String Mixins
- ↑ The Little JavaScripter demonstrates fundamental commonality with Scheme, a functional language.
- ↑ Object Oriented Programming in JavaScript [Архівовано 2019-02-10 у Wayback Machine.] gives an overview of object-oriented programming techniques in JavaScript.
- ↑ React – A JavaScript library for building user interfaces. 8 квітня 2019.
- ↑ а б TNG-Hooks. 8 квітня 2019.
- ↑ Lodash documentation. 8 квітня 2019.
- ↑ mori. 8 квітня 2019.
- ↑ Prolog embedding
- ↑ Functional Reactive Programming - HaskellWiki.
- ↑ Cloud Haskell
- ↑ Template Haskell - HaskellWiki.
- ↑ Logict: A backtracking logic-programming monad.
- ↑ https://web.engr.oregonstate.edu/~erwig/HaskellRules/HaskellRules_June06.pdf
- ↑ https://jcp.org/en/jsr/detail?id=331 JSR 331: Constraint Programming API
- ↑ https://github.com/GoogleCloudPlatform/DataflowJavaSDK Google Cloud Platform Dataflow SDK
- ↑ JuliaOpt/JuMP.jl. GitHub. JuliaOpt. 11 лютого 2020. Процитовано 12 лютого 2020.
- ↑ GitHub - MikeInnes/DataFlow.jl. 15 січня 2019.
- ↑ GitHub - JuliaGizmos/Reactive.jl: Reactive programming primitives for Julia. 28 грудня 2018.
- ↑ https://github.com/davidanthoff/Query.jl Query almost anything in julia
- ↑ https://github.com/lilinjn/LilKanren.jl A collection of Kanren implementations in Julia
- ↑ GitHub - abeschneider/PEGParser.jl: PEG Parser for Julia. 3 грудня 2018.
- ↑ GitHub - gitfoxi/Parsimonious.jl: A PEG parser generator for Julia. 3 серпня 2017.
- ↑ Lazy https://github.com/MikeInnes/Lazy.jl
- ↑ а б Execute loop iterations in parallel. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Write Constraints. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Getting Started with SimEvents. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Execute MATLAB expression in text - MATLAB eval. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Determine class of object. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Class Metadata. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Object-Oriented Programming. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ Simulink. mathworks.com. Процитовано 21 жовтня 2016.
- ↑ interpreter based threads
- ↑ Moose
- ↑ Higher Order Perl
- ↑ PHP Manual, Chapter 17. Functions
- ↑ PHP Manual, Chapter 19. Classes and Objects (PHP 5)
- ↑ PHP Manual, Anonymous functions
- ↑ Parallel Processing and Multiprocessing in Python. wiki.python.org. Процитовано 21 жовтня 2016.
- ↑ threading — Higher-level threading interface. docs.python.org. Процитовано 21 жовтня 2016.
- ↑ python-constraint. pypi.python.org. Процитовано 21 жовтня 2016.
- ↑ DistributedProgramming. wiki.python.org. Процитовано 21 жовтня 2016.
- ↑ Chapter 9. Metaprogramming. chimera.labs.oreilly.com. Архів оригіналу за 23 жовтня 2016. Процитовано 22 жовтня 2016.
- ↑ Metaprogramming. readthedocs.io. Процитовано 22 жовтня 2016.
- ↑ PEP 443 -- Single-dispatch generic functions. python.org. Процитовано 22 жовтня 2016.
- ↑ PEP 484 -- Type Hints. python.org. Процитовано 22 жовтня 2016.
- ↑ PyDatalog. Процитовано 22 жовтня 2016.
- ↑ Futureverse.
- ↑ future batchtools.
- ↑ Magrittr: A Forward Pipe Operator for R. cran.r-project.org\accessdate=13 July 2017. 17 листопада 2020.
- ↑ Racket Guide: Concurrency and Synchronization
- ↑ The Rosette Guide
- ↑ FrTime: A Language for Reactive Programs
- ↑ Racket Guide: Distributed Places
- ↑ Lazy Racket
- ↑ Channels and other mechanisms
- ↑ Class Signature.
- ↑ Feed operator
- ↑ https://github.com/perl6/doc/issues/1744#issuecomment-360565196 Cro module
- ↑ Meta-programming: What, why and how. 14 грудня 2011.
- ↑ https://perl6advent.wordpress.com/2009/12/18/day-18-roles/ Parametrized Roles
- ↑ Meta-object protocol (MOP).
- ↑ https://docs.perl6.org/language/classtut Classes and Roles
- ↑ The Rust macros guide. Rust. Процитовано 19 січня 2015.
- ↑ The Rust compiler plugins guide. Rust. Процитовано 19 січня 2015.
- ↑ The Rust Reference §6.1.3.1
- ↑ An Overview of the Scala Programming Language
- ↑ Scala Language Specification
- ↑ Tcl Programming/Introduction. en.wikibooks.org. Процитовано 22 жовтня 2016.
- ↑ TCLLIB - Tcl Standard Library: snitfaq. sourceforge.net. Процитовано 22 жовтня 2016.
- ↑ Notes for Programming Language Experts, Wolfram Language Documentation.
- ↑ External Programs, Wolfram Language Documentation.