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