Сравнение мультипарадигмальных языков программирования
Эта статья , возможно, содержит оригинальные исследования . ( Август 2009 г. ) |
Языки программирования можно сгруппировать по количеству и типам поддерживаемых парадигм .
Краткое изложение парадигм [ править ]
Краткий справочник парадигм программирования, перечисленных в этой статье.
- Параллельное программирование . Имейте языковые конструкции для параллельного выполнения, они могут включать в себя многопоточность, поддержку распределенных вычислений, передачу сообщений, общие ресурсы (включая общую память) или фьючерсы.
- Актерское программирование - параллельные вычисления с актерами , которые принимают локальные решения в ответ на окружающую среду (способные к эгоистическому или конкурентному поведению).
- Программирование с ограничениями - отношения между переменными выражаются в виде ограничений (или сетей ограничений), направляющих допустимые решения (используется удовлетворение ограничений или симплексный алгоритм ).
- Программирование потоков данных – принудительный пересчет формул при изменении значений данных (например, электронные таблицы )
- Декларативное программирование - описывает, какие вычисления должны выполняться, без указания подробных изменений состояния в императивном программировании (функциональное и логическое программирование являются основными подгруппами декларативного программирования).
- Распределенное программирование – поддержка нескольких автономных компьютеров, которые обмениваются данными через компьютерные сети.
- Функциональное программирование – использует оценку математических функций и избегает состояния и изменяемых данных.
- Общее программирование - использует алгоритмы, написанные на основе типов, которые будут указаны позже, которые затем создаются по мере необходимости для конкретных типов, предоставляемых в качестве параметров.
- Императивное программирование - явные операторы, изменяющие состояние программы.
- Логическое программирование - для программирования используется явная математическая логика.
- Метапрограммирование - написание программ, которые пишут или манипулируют другими программами (или самими собой) как своими данными или выполняют часть работы во время компиляции, которая в противном случае выполнялась бы во время выполнения.
- Метапрограммирование шаблонов - методы метапрограммирования, в которых компилятор использует шаблоны для создания временного исходного кода, который компилятор объединяет с остальным исходным кодом, а затем компилирует.
- Рефлексивное программирование - методы метапрограммирования, при которых программа модифицирует или расширяет себя.
- Объектно-ориентированное программирование - для разработки программ используются структуры данных, состоящие из полей данных и методов вместе с их взаимодействиями (объектами).
- На основе классов - объектно-ориентированное программирование, в котором наследование достигается путем определения классов объектов, а не самих объектов.
- Основанное на прототипах — объектно-ориентированное программирование, которое избегает классов и реализует наследование посредством клонирования экземпляров.
- Конвейерное программирование — простое изменение синтаксиса для добавления синтаксиса для вложенных вызовов функций в язык, изначально разработанный без него.
- Программирование на основе правил - сеть практических правил, которые составляют базу знаний и могут использоваться для экспертных систем, а также для вывода и решения проблем.
- Визуальное программирование – графическое управление элементами программы, а не их текстовое указание (например, Simulink ); также называется диаграммным программированием [1]
Обзор языка [ править ]
Язык | Количество парадигм | Параллельно | Ограничения | Поток данных | Декларативный | Распределенный | Функциональный | Metaprogramming | Общий | Императив | Логика | Отражение | Объектно-ориентированный | Трубопроводы | Визуальный | Основанный на правилах | Другой |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Есть | 5 | Да | — | — | — | Да | — | — | Да | Да | — | — | Да | — | — | — | — |
Альф | 2 | — | — | — | — | — | Да | — | — | — | Да | — | — | — | — | — | — |
АмигаЕ [ нужна ссылка ] | 2 | — | — | — | — | — | — | — | — | Да | — | — | Да | — | — | — | — |
АПЛ | 3 | — | — | — | — | — | Да | — | — | Да | — | — | — | — | — | — | Массив (многомерный) |
БЕТА [ нужна ссылка ] | 3 | — | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
С++ | 7 (15) | Да | Библиотека | Библиотека | Библиотека | Библиотека | Да | Да | Да | Да | Библиотека | Библиотека | Да | Да | — | Библиотека | Массив (многомерный; с использованием STL ) |
С# | 6 (7) | Да | — | Библиотека | — | — | Да | — | Да | Да | — | Да | Да | — | — | — | Реактивный |
ЧакК [ нужна ссылка ] | 3 | Да | — | — | — | — | — | — | — | Да | — | — | Да | — | — | — | — |
Клэр | 2 | — | — | — | — | — | Да | — | — | — | — | — | Да | — | — | — | — |
Кложур | 5 | Да | — | — | Да | — | Да | Да | — | — | Библиотека | — | — | Да | Редактор | — | Множественная отправка , |
Общий Лисп | 7 (14) | Библиотека | Библиотека | Библиотека | Да | Библиотека | Да | Да | Да | Да | Библиотека | Да | Да | Библиотека | Библиотека | Библиотека | Множественная диспетчеризация, мета-ООП-система, |
Завиток | 5 | — | — | — | — | — | Да | — | Да | Да | — | Да | Да | — | — | — | — |
Карри | 4 | Да | Да | — | — | — | Да | — | — | — | Да | — | — | — | — | — | — |
Д (версия 2.0) | 7 | Да | — | — | — | — | Да | Да | Да | Да | — | Да | Да | — | — | — | — |
Дельфи | 3 | — | — | — | — | — | — | — | Да | Да | — | — | Да | — | — | — | — |
Дилан [ нужна ссылка ] | 3 | — | — | — | — | — | Да | — | — | — | — | Да | Да | — | — | — | — |
И | 3 | Да | — | — | — | Да | — | — | — | — | — | — | Да | — | — | — | — |
ECMAScript | 4 (5) | Частичный | — | — | Библиотека | — | Да | — | — | Да | — | Да | Да | Библиотека | Редактор | — | Реактивный, |
Эрланг | 3 | Да | — | — | Да | Да | Да | — | — | — | — | — | — | Да | — | — | — |
Эликсир | 4 | Да | — | — | — | Да | Да | Да | — | — | — | — | — | Да | — | — | — |
Вяз | 6 | Да | — | Да | Да | — | Да ( чистый ) | — | Да | — | — | — | — | Да | — | — | Реактивный |
Ф# | 7 (8) | Да | — | Библиотека | Да | — | Да | — | Да | Да | — | Да | Да | — | — | — | Реактивный |
Фортран | 4 (5) | Да | — | — | — | — | Да | — | Да | — | — | — | Да | — | — | — | Массив (многомерный) |
Идти | 4 | Да | — | — | — | — | — | — | — | Да | — | Да | — | Да | — | — | — |
Хаскелл | 8 (15) | Да | Библиотека | Библиотека | Да | Библиотека | Да ( ленивый ) ( чистый ) | Да | Да | Да | Библиотека | — | Частичный | Да | Да | Библиотека | Грамотный, реактивный, зависимый типы (частичный) |
Этот | 4 | Да | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
Дж [ нужна ссылка ] | 3 | — | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
Ява | 6 | Да | Библиотека | Библиотека | — | — | Да | — | Да | Да | — | Да | Да | — | — | — | — |
Юлия | 9 (17) | Да | Библиотека | Библиотека | Библиотека | Да | Да ( нетерпеливо ) | Да | Да | Да | Библиотека | Да | Да | Да | — | Библиотека | Множественная отправка , Массив (многомерный); необязательно ленивый |
Котлин | 8 | Да | — | — | — | — | Да | Да | Да | Да | — | Да | Да | Да | — | — | — |
ЛабВЬЮ | 4 | Да | — | Да | — | — | — | — | — | — | — | — | Да | — | Да | — | — |
Достаточно | 2 | — | — | — | — | — | — | — | — | — | — | — | Да | — | Да | — | — |
LispWorks (версия 6.0 с поддержкой симметричной мультиобработки, правил, логики ( Пролог ), CORBA ) | 9 | Да | — | — | — | Да | Да | Да | — | Да | Да | Да | Да | — | — | Да | — |
Два [ нужна ссылка ] | 3 | — | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
МАТЛАБ | 6 (10) | Ящик для инструментов | Ящик для инструментов | Да | — | Ящик для инструментов | — | Да | Да | — | — | Да | Да | — | Да | — | Массив (многомерный) |
Немерль | 7 | Да | — | — | — | — | Да | Да | Да | Да | — | Да | Да | — | — | — | — |
Объектный Паскаль | 4 | Да | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
OCaml | 4 | — | — | — | — | — | Да | — | Да | Да | — | — | Да | — | — | — | — |
Оз | 11 | Да | Да | Да | Да | Да | Да | — | — | Да | Да | — | Да | Да | — | Да | — |
Перл [ нужна ссылка ] | 8 (9) | Да | — | Да | — | — | Да | Да | — | Да | — | Да | Да | Да | — | — | — |
PHP | 4 | — | — | — | — | — | Да | — | — | Да | — | Да | Да | — | — | — | — |
Напольное покрытие | 3 | — | — | — | — | — | Да | — | — | Да | Да | — | — | — | — | — | — |
Програф | 3 | — | — | Да | — | — | — | — | — | — | — | — | Да | — | Да | — | — |
Питон | 5 (10) | Библиотека | Библиотека | — | — | Библиотека | Да | Да | Да | Да | Библиотека | Да | Да | — | Редактор | — | Структурированный |
Р | 4 (6) | Библиотека | — | — | — | Библиотека | Да | — | — | Да | — | Да | Да | Да | — | — | Массив (многомерный) |
Ракетка | 10 | Да | Да | Да | — | Да | Да | Да | — | Да | Да | Да | Да | — | — | — | Ленивый |
Раку | 10 | Да | Библиотека | Да | — | Библиотека | Да | Да | Да | Да | — | Да | Да | Да | — | — | Множественная отправка, ленивые списки, реактивность. |
РУП | 3 | — | — | — | — | — | — | — | — | Да | Да | — | — | — | — | Да | — |
Руби | 5 | — | — | — | — | — | Да | Да | — | Да | — | Да | Да | — | — | — | — |
Руст (версия 1.0.0-альфа) | 6 | Да | — | — | — | — | Да | Да | Да | Да | — | — | Да | — | — | — | Линейный, афлайновый и тип владения |
Сатер [ нужна ссылка ] | 2 | — | — | — | — | — | Да | — | — | — | — | — | Да | — | — | — | — |
Скала | 9 | Да | — | Да | Да | — | Да | Да | Да | Да | — | Да | Да | — | — | — | — |
начало [ нужна ссылка ] | 2 | — | — | — | — | — | — | — | — | Да | — | — | Да | — | — | — | — |
СИЗАЛЬ | 3 | Да | — | Да | — | — | Да | — | — | — | — | — | — | — | — | — | — |
Таблицы | 2 | — | — | — | — | — | Да | — | — | — | — | — | — | — | Да | — | — |
Быстрый | 7 | Да | — | — | — | — | Да | Да | Да | Да | — | Да | Да | — | — | — | Блочно-структурированный |
Tcl с расширением Snit [ нужна ссылка ] | 3 | — | — | — | — | — | Да | — | — | Да | — | — | Да | — | — | — | — |
Визуальный Бейсик .NET | 6 (7) | Да | — | Библиотека | — | — | Да | — | Да | Да | — | Да | Да | — | — | — | Реактивный |
Windows PowerShell | 6 | — | — | — | — | — | Да | — | Да | Да | — | Да | Да | Да | — | — | — |
Язык Wolfram и математика | 13 | Да | Да | Да | Да | Да | Да | Да | Да | Да | Да | Да | Да | Да | — | Да | Основанный на знаниях |
См. также [ править ]
- Парадигма программирования
- Список языков программирования по типам
- Язык, специфичный для предметной области
- Специализированное мультимоделирование
Примечания [ править ]
- ^ на основе рандеву и монитора
- ↑ Перейти обратно: Перейти обратно: а б с д и ж г час я дж к л м н тот п д р с т в v В х и С аа аб и объявление но из в ах есть основанный на классе
- ↑ Перейти обратно: Перейти обратно: а б с д и template metaprogramming
- ↑ Перейти обратно: Перейти обратно: а б с использование потока данных TPL
- ^ поддержка только лямбда-выражений (ленивое функциональное программирование)
- ↑ Перейти обратно: Перейти обратно: а б с использование реактивных расширений (Rx)
- ^ множественная отправка, комбинации методов
- ↑ Перейти обратно: Перейти обратно: а б с д и актерское программирование
- ^ обещания, собственные расширения
- ^ с использованием Node.js модуля кластера . или метода child_process.fork , веб-воркеров в браузере и т. д
- ↑ Перейти обратно: Перейти обратно: а б с д На основе прототипа
- ^ использование реактивных расширений (RxJS)
- ^ в Node.js через событий модуль
- ^ в браузерах через собственный EventTarget API
- ↑ Перейти обратно: Перейти обратно: а б с чисто функциональный
- ^ параметризованные классы
- ^ неизменяемый
- ^ множественная рассылка, а не традиционная одиночная
- ^ Akka. Архивировано 19 января 2013 г. в Wayback Machine.
Цитаты [ править ]
- ^ Брэгг, SD; Дрискилл, К.Г. (20–22 сентября 1994 г.). «Диаграммно-графические языки программирования и DoD-STD-2167A». Материалы AUTOTESTCON '94 (IEEEXplore) . Институт инженеров по электротехнике и электронике (IEEE). стр. 211–220. дои : 10.1109/AUTEST.1994.381508 . ISBN 978-0-7803-1910-3 . S2CID 62509261 .
- ^ Справочное руководство Ada, ISO/IEC 8652:2005(E) Ed. 3 , Раздел 9: Задачи и синхронизация
- ^ Справочное руководство Ada, ISO/IEC 8652:2005(E) Ed. 3 Приложение E: Распределенные системы
- ^ Справочное руководство Ada, ISO/IEC 8652:2005(E) Ed. 3 , Раздел 12: Общие единицы измерения
- ^ Справочное руководство Ada, ISO/IEC 8652:2005(E) Ed. 3 , Раздел 6: Подпрограммы
- ^ Справочное руководство Ada, ISO/IEC 8652:2005(E) Ed. 3 , 3.9 Типы с тегами и расширения типов
- ^ Поддержка темы
- ^ Поддержка атомики
- ^ Модель памяти
- ^ Закодировано
- ^ СистемаC
- ^ Boost.Iostreams
- ^ Булинк
- ^ «АраРат» (PDF) . Архивировано из оригинала (PDF) 19 августа 2019 г. Проверено 15 сентября 2019 г.
- ^ OpenMPI
- ^ Повышение.MPI
- ^ Boost.MPL
- ^ ЛК++
- ^ Кастор. Архивировано 25 января 2013 г. в Wayback Machine.
- ^ Библиотека отражения
- ^ N3534
- ^ Повышение.Дух
- ^ Clojure — параллельное программирование
- ^ Clojure — core.async
- ^ Clojure — функциональное программирование
- ^ Clojure — Макросы
- ^ Clojure - core.logic
- ^ Clojure — Руководство по потоковым макросам
- ^ «Световой стол» . 08.04.2019.
- ^ Мультиметоды и иерархии
- ^ Агенты и асинхронные действия
- ^ [1] многие парадигмы параллелизма реализованы как расширения языка.
- ^ [2] программирование ограничений внутри CL через расширения
- ^ [3] расширение потока данных
- ^ [4] путем создания DSL с использованием встроенного метапрограммирования; также см. примечание о функциональных парадигмах, ограничениях и логике, которые являются частью декларативной парадигмы.
- ^ [5] MPI и т. д. через языковые расширения
- ^ метапрограммирование шаблонов с использованием макросов (см. C++)
- ^ [6] [7] [8] Пролог реализован как расширение языка.
- ^ Объектная система Common Lisp, см. статью в Википедии о CLOS, объектной системе Common Lisp.
- ^ реализовано пользователем с помощью короткого макроса, пример реализации
- ^ - Инструмент визуального программирования на основе Common Lisp.
- ^ [9] расширение программирования на основе правил
- ^ [10] Архивировано 26 апреля 2018 г. на Wayback Machine через протокол метаобъектов.
- ^ D Таблица функций языка
- ^ Стандартный алгоритм Фобоса
- ^ Строковые миксины языка D
- ^ Маленький JavaScripter демонстрирует фундаментальную общность с функциональным языком Scheme.
- ^ Объектно-ориентированное программирование на JavaScript. Архивировано 10 февраля 2019 г. на Wayback Machine. В нем представлен обзор методов объектно-ориентированного программирования на JavaScript.
- ^ «React — библиотека JavaScript для создания пользовательских интерфейсов» . 08.04.2019.
- ^ «ТНГ-Крючки» . Гитхаб . 08.04.2019.
- ^ «Документация Лодаша» . 08.04.2019.
- ^ «мори» . 08.04.2019.
- ^ «Световой стол» . 08.04.2019.
- ^ «ТНГ-Крючки» . Гитхаб . 08.04.2019.
- ^ «Встраивание Пролога» . Хаскелл.орг .
- ^ «Функциональное реактивное программирование» . ХаскеллВики .
- ^ Облачный Хаскелл
- ^ «Шаблон Хаскелла» . ХаскеллВики .
- ^ «Логикта: монада логического программирования с возвратом» . Хаскелл.орг .
- ^ Коллмансбергер, Стив; Эрвиг, Мартин (30 мая 2006 г.). «Правила Haskell: встраивание систем правил в Haskell» (PDF) . Университет штата Орегон .
- ^ https://jcp.org/en/jsr/detail?id=331 JSR 331: API программирования с ограничениями
- ^ https://github.com/GoogleCloudPlatform/DataflowJavaSDK SDK потока данных Google Cloud Platform.
- ^ "JuliaOpt/JuMP.jl" . Гитхаб . ЮлияОпт. 11 февраля 2020 г. Проверено 12 февраля 2020 г.
- ^ «GitHub — MikeInnes/DataFlow.jl» . Гитхаб . 15 января 2019 г.
- ^ «GitHub — JuliaGizmos/Reactive.jl: примитивы реактивного программирования для Julia» . Гитхаб . 2018-12-28.
- ^ https://github.com/davidantthoff/Query.jl Запрашивайте практически все в Julia.
- ^ https://github.com/lilinjn/LilKanren.jl Коллекция реализаций Kanren в Julia.
- ^ «GitHub — abeschneider/PEGParser.jl: Парсер PEG для Джулии» . Гитхаб . 03.12.2018.
- ^ «GitHub — gitfoxi/Parsimonious.jl: генератор парсера PEG для Julia» . Гитхаб . 03.08.2017.
- ^ Ленивый https://github.com/MikeInnes/Lazy.jl
- ^ «Выполнять итерации цикла параллельно» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Написать ограничения» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Начало работы с SimEvents» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Выполнять итерации цикла параллельно» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Выполнить выражение MATLAB в тексте — MATLAB eval» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Определить класс объекта» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Метаданные класса» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Объектно-ориентированное программирование» . mathworks.com . Проверено 21 октября 2016 г.
- ^ «Симулинк» . mathworks.com . Проверено 21 октября 2016 г.
- ^ потоки на основе интерпретатора
- ^ Perl высшего порядка
- ^ Руководство по PHP , Глава 17. Функции
- ^ Руководство по PHP , Глава 19. Классы и объекты (PHP 5)
- ^ Руководство по PHP , Анонимные функции
- ^ «Параллельная обработка и многопроцессорность в Python» . Питон Вики . Проверено 21 октября 2016 г.
- ^ «threading — интерфейс потоков более высокого уровня» . docs.python.org . Проверено 21 октября 2016 г.
- ^ «ограничение Python» . pypi.python.org . Проверено 21 октября 2016 г.
- ^ «Распределенное программирование» . Питон Вики . Проверено 21 октября 2016 г.
- ^ «Глава 9. Метапрограммирование» . chimera.labs.oreilly.com . Архивировано из оригинала 23 октября 2016 года . Проверено 22 октября 2016 г. .
- ^ «Метапрограммирование» . readthedocs.io . Проверено 22 октября 2016 г. .
- ^ «PEP 443 — универсальные функции для одной диспетчеризации» . python.org . Проверено 22 октября 2016 г. .
- ^ «PEP 484 – Подсказки по типу» . python.org . Проверено 22 октября 2016 г. .
- ^ «Пидаталог» . Проверено 22 октября 2016 г. .
- ^ «Световой стол» . 08.04.2019.
- ^ «Будущеевселенная» .
- ^ «будущие пакетные инструменты» .
- ^ «Магриттр: передовой оператор трубы для R» . cran.r-project.org\access-date=13 июля 2017 г. 17 ноября 2020 г.
- ^ Руководство по рэкету: параллелизм и синхронизация
- ^ Руководство по розетке
- ^ FrTime: язык для реактивных программ
- ^ Руководство по рэкету: Распределенные места
- ^ Ленивая ракетка
- ^ Каналы и другие механизмы
- ^ «Модуль решения проблем» .
- ^ Оператор подачи
- ^ https://github.com/perl6/doc/issues/1744#issuecomment-360565196 Модуль Cro.
- ^ «Метапрограммирование: Что, почему и как» . 14 декабря 2011 г.
- ^ https://perl6advent.wordpress.com/2009/12/18/day-18-roles/ Параметризованные роли
- ^ «Метаобъектный протокол (MOP)» .
- ^ https://docs.perl6.org/language/classtut Классы и роли.
- ^ «Руководство по макросам Rust» . Ржавчина . Проверено 19 января 2015 г.
- ^ «Руководство по плагинам компилятора Rust» . Ржавчина . Проверено 19 января 2015 г.
- ^ Справочник по ржавчине §6.1.3.1
- ^ Обзор языка программирования Scala
- ^ Спецификация языка Scala
- ^ «Программирование/Введение в Tcl» . ru.wikibooks.org . Проверено 22 октября 2016 г. .
- ^ «TCLLIB — Стандартная библиотека Tcl: snitfaq» . sourceforge.net . Проверено 22 октября 2016 г. .
- ^ Заметки для экспертов по языкам программирования , Документация по языку Wolfram.
- ^ Внешние программы , Документация по языку Wolfram.
Ссылки [ править ]
- Джим Коплиен, Мультипарадигмальный дизайн для C++ , Addison-Wesley Professional, 1998.