Классификация|Пояснение|Плюсы и минусы|Примеры
--|--|--|--
*Поддерживаемые парадигмы* |_|_|_
Императивная|Шаги алгоритма обработки данных описываются через последовательность, ветвление, цикл и вызов подпрограммы| ``-`` можно описать только простые алгоритмы|C
Функциональная|Алгоритм описывается через вызовы функций, данные нельзя изменять, но можно разделять на части и включать в другие сложные структуры| ``+`` нет проблем с синхронизацией действий в параллельных алгоритмах\
``+/-`` программа - это множество мелких рекурсивных функций|Haskell
Объектно-ориентированная|Программа - это множество объектов, для взаимодействия с которыми нужно вызывать соответствующие методы| ``+`` точно отражает модель реального мира|Java, Free Pascal
Логическая|Программа описывает логические связи (отношения) в предметной области| ``-`` программа - это множество небольших отношений, описываемых через перечисление или рекурсивно|Prolog
Мультипарадигменные|Язык позволяет легко использовать любые комбинации парадигм||С++, C#, Rust, go, Dart, Python, Lua, JavaScript
*По результату обработки* |_|_|_
Компилятор|Результатом является исполняемый или объектный файл| ``+`` не тратится время на компиляцию при запуске\
``+`` для работы нужны только скомпилированные библиотеки или среда выполнения|C/C++, C#, Java, Free Pascal, PascalABC.NET, GNU Prolog, go, Dart, Rust
Транслятор|Результатом является файл на другом языке программирования (C/C++ или подмножество JavaScript)| ``+`` можно использовать в любой ОС, где есть целевой язык\
``+`` можно использовать библиотеки и средства разработки целевого языка|Chicken Scheme, Blockly, C++ syntax 2, Bison
Интерпретатор|Файл с представлением программы не выводится или сохраняется внутреннее представление| ``+`` всё необходимое для работы в интерпретаторе\
``-`` при запуске тратится время на перевод программы во внутреннее представление|Python, Lua, JavaScript
*Целевой код* |_|_|_
Машинный код| Код для реального процессора (native) | ``+`` работает максимально быстро\
``-`` нельзя выполнять на другом процессоре (можно через эмулятор, тогда эквивалентно нижеследующему варианту)|C/C++, Free Pascal, Rust, go
Код виртуальной машины | Байт-код (JVM, WebAssembly, LLVM, CIL)| ``+`` программу можно выполнять на любом процессоре, но нужен эмулятор этой машины (VM) \
``+`` может использоваться компиляторами разных языков программирования\
``-`` скорость меньше в 3-5 раз | GNU Prolog, QuickJS, Lua
JIT-технология|Наиболее часто исполняемый байт-код переводится в машинный|``+`` скорость увеличивается в 2+ раза по сравнению с эмулятором|Java, SpiderMonkey JS, C#, PascalABC.NET, PyPy, LuaJIT, Dart
Внутреннее представление | Представление в форме дерева (AST), где узлы - это синтаксические конструкции, а листы - ссылки на переменную или константу.\
Используется только в интерпретаторах | ``-`` скорость меньше в 10+ раз |Python
*Типизация* |_|_|_
Есть|Для каждого имени в программе нужно указать тип|``+`` ошибки будут обнаружены на этапе компиляции\
``+`` генерируется более эффективный код| С/С++, TypeScript, Java, C#, Rust, go, Dart
Нет|Тип определяется при обращении|``-`` скорость уменьшается в 3-5 раз|Python (можно указать тип, но проверка производится специальной утилитой), Lua, JavaScript, GNU Prolog
*Управление памятью* |_|_|_
Нет|В программе требуется явно освобождать память, когда она не нужна|``-`` можно забыть освободить или освободить несколько раз| C/C++
Подсчет ссылок| В объекте хранится поле с количеством указывающих на него ссылок|``+`` работает без остановок на сборку мусора\
``-`` не удаляет циклические структуры| умные указатели C++, Rust, Python
Сборка мусора|Время от времени или в фоновом режиме отслеживается к каким участкам памяти нет ссылок|``-`` может использовать память больше, чем реально необходимо\
``-`` приостановка выполнения программы на время сборки мусора|Java, C#, JavaScript
*Хранение базовых типов* |_|_|_
Как значение|Значение хранится непосредственно на стеке или статической памяти|``+`` обращение к значению происходит максимально быстро|C/C++, Rust, go, Free Pascal, GNU Prolog
По ссылке|Значение хранится в динамической памяти|``+`` базовые типы являются объектами\
``-`` нужно время на размещение объектов в памяти и удаление|нетипизированные языки, упаковка в Java и C#
*Хранение коллекций* |_|_|_
Как значение|При передаче значения можно выбрать - коллекция будет копироваться или передаваться по указателю|``+/-`` операция передачи выглядит всегда просто, но нужно контролировать способ передачи коллекции, чтобы уменьшать сложность операции|C/C++, Free Pascal, go, Rust (при определении метода Copy)
По ссылке|Копирование выполняется всегда явно|``+`` передача коллекции по ссылке является простой операцией\
``-`` можно испортить значение при изменении, если коллекция используется в нескольких структурах|Python, Javascript, Dart