Файл: Классификация языков программирования высокого уровня.pdf
Добавлен: 30.03.2023
Просмотров: 291
Скачиваний: 2
Особенности ЯВУ при анализе парадигм:
- практикуются неявные формы представления отдельных понятий ради лаконизма записи программ;
- выражения чаще всего рассчитаны на схему предвычисления над скалярами конкретной длины или сложными значениями (сначала вычисляются операнды, затем вычисляется результат операций);
- – различны виды ветвлений и циклов, категории функций и процедур;[18]
- типы данных конструируются по фиксированным в ЯП правилам и реализуются по принятым в СП шаблонам;
- схемы управления вычислениями нередко фиксированы в языке и конкретно реализованы в системе программирования;
- взаимодействие и соответствие средств и методов, относящихся к разным семантическим системам, при их реализации в системе программирования определено по традиции и прецедентам, причем в коде оно скрыто или рассредоточено, а не структурировано;
- эффективность программирования базируется на знании методов реализации значений и обработчиков структур данных в памяти;
- результат программы, как правило, рассредоточен по разным переменным, но во многих ЯВУ есть выражения и функции, формирующие один результат.[19]
По Белову[20] были выделенны три основные парадигмы: процедурная, объектно-ориентированная и логическая.
Языки высокого уровня делятся на:
- Процедурные (алгоритмические) (Basic, Pascal, С и др.), которые предназначены для однозначного описания алгоритмов; для решения задачей процедурные языки требуют в той или иной форме явно выписать процедуру ее решения;
- Логические (Prolog, Lisp и др.), которые ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания;
- Объектно-ориентированные — (Object Pascal, С++, Java и др.) в основе которых лежит понятие объекта, сочетающего в себе данные и действия над ними. Программа на объектно-ориентированном языке, решая некоторую задачу, по сути, описывает часть мира, относящуюся к этой задаче. Описание действительности в форме системы взаимодействия объектов естественнее, чем система взаимодействия процедур.[21]
Я возьму три текущих понятия за основу для таблицы классификаций по парадигмам программирования главным (по Белову), и второстепенным (сбор данных с простора интернета и книжных источников). Далее я выберу 29 языков программирования высокого уровня из списка самых популярных языков программирования 2018 г., который приложен в содержании (мне хотелось бы взять все языки из списка но, увы, сказался недостаток свободного времени). Путем анализа каждого языка из списка произведу заполнение таблицы. В следующий разделе: Второстепенные парадигмы, - будет представлен список с описанием каждой парадигмы.
-
Второстепенные парадигмы программирования
Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Парадигма имеет узкопрофессиональный смысл.[22]
Парадигмы программирования список и определение:
Аспектно-ориентированная -Средства для выделения сквозной функциональности в отдельную сущность. Аспект изменяет поведение основного кода, применяя средство оформления кода, который должен быть вызван из точки соединения.[23]
Компонентно-ориентированная - включает в себя набор ограничений, налагаемых на механизм ООП.
Визуальная - позволяет создавать программы посредством конструирования из элементарных блоков, а не написания текста программ. Так же называют диаграммным программированием, так как полученная программа имеет вид диаграммы. Большинство визуальных языков основаны на записи "рамки и стрелки", которые изображают элементарные блоки программы в виде прямоугольников с условными обозначениями, а отношения между ними ( потоки данных) - в виде стрелок.[24]
Вычисление с откатами - использование языком метода отката и отсечения. При неудаче в вычислениях языка используется откат до предыдущего состояния, где возможно вычислить другое решение.[25]
Декларативная - процесс вычислений посредством описания логики самого вычисления Операторы языка преследуют цель - решить все проблемы. Каждый пример должен описывать - что происходит и быть неизменным и читаемым. Декларативный код является контекстно - независимым.[26]
Декларативное программирование является противоположностью императивного программирования; первое описывает, что необходимо сделать, а второе — как именно это сделать. Фактически, декларативное программирование часто определяется как любой стиль программирования, не являющийся императивным, т.к. последнему легче дать определение.
Императивная - исходный код которой имеет структуру последовательных инструкций. Присутствуют операторы присваивания (механизм связывания, который позволяет изменять связи имен объектов данных (переменных) с их значениями.) Результат операции - проведение записи и перезаписи ячеек памяти и регистров процессора.[27]
Конкатенативная (или стековые языки программирования) - основаны на том, что конкатенация двух фрагментов кода выражает их композицию. Эти языки используют стек для хранения аргументов и возвращаемых значений операций.
Логи́ческое программи́рование - парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций. [28]
Матричная - метод обобщения операций так, что они применяются к массиву. Элементы массива обладают сходными свойствами и обрабатываются единообразно каждый раз, когда оператор применяется к массиву. Управление массивом как единым целым. (противоположность скалярной)[29]
Метапрограммирование - предусматривает написание программ, которые работают с другими программами в качестве данных. Язык обрабатывающей программы называется метаязыком, язык обрабатываемой — объектным языком.[30]
Простейшим примером метапрограммирования является любой компилятор, преобразующий код, написанный на языке высокого уровня, в низкоуровневый машинный язык или ассемблер. Очевидно, что большинство языков, поддерживающих работу со строками, могут использоваться для непосредственной генерации кода для других языков. Тем не менее, термин “метапрограммирование” обычно подразумевает, что в качестве метаязыка и объектного языка выступает один и тот же язык, и более того, такое его использование предусмотрено дизайном языка.[31]
Мультипарадигма - язык программирования, который поддерживает больше чем одну программную парадигму. Как проектировщик Леды Тимоти Бадд выражается: «Идея языка мультипарадигмы состоит в том, чтобы служить основой, в которой программисты могут работать во множестве стилей, свободно смешивая конструкции от различных парадигм».[32]
Программирование на уровне значений (также известное как модель фон Неймана) - представляет собой программу в виде последовательности значений, преобразующихся друг в друга. Выполнение программы начинается с исходных данных, которые комбинируются и преобразуются в другие значения до тех пор, пока не получаются нужные результаты. Новые значения конструируются из имеющихся при помощи предопределенного набора операций.
Эта парадигма сосредотачивается на изучении типов данных, т.е. значений и элементарных операций над ними, их структуры и свойств. Обычно элементарные операции образуют алгебру над пространством значений.
Большинство современных языков используют понятия типов данных, переменных и операторов присваивания, и следовательно, реализуют эту парадигму.
Программирование на уровне значений является противоположностью программирования на уровне функций.
На уровне функций [33] (другое русское название — комбинаторное программирование) - предполагает, что программа строится из элементарных функций, комбинируемых при помощи функционалов (функциональных форм).
Эта парадигма не использует понятия переменной или операции присваивания, а вместо этого сосредотачивается на изучении элементарных функций и функциональных форм.
На уровне функций - использует следующую иерархию сущностей в пределах языка программирования:
атомы — единицы данных, с которыми оперируют функции. Данные появляются только на входе и выходе программы, и нигде внутри. Атомы могут быть скалярами или множествами других атомов.
функции — инструменты, преобразующие атомы в другие атомы. Язык задает начальный набор функций, а программист может определять новые, используя функциональные формы. Сама программа тоже является функцией.
функциональные формы — инструменты, преобразующие функции в другие функции. Язык задает начальный набор функциональных форм, и либо позволяет создание новых форм (FFP), либо нет (FP). Таким образом, язык задает алгебру функциональных форм над пространством функций.
Программирование на уровне функций является противоположностью программирования на уровне значений и разновидностью функционального программирования (с ограничением на то, как создаются новые функции).[34]
Нестрогая - позволяет определять нестрогие функции и использовать ленивые вычисления.[35]
Обмен сообщениями - основана на методе рассылки сообщений, а именно адресной или широковещательной . Сообщения могут иметь любую природу - данные, экземпляры классов, фрагменты кода.[36]
Обобщённое программирование - состоит в написании алгоритмов в терминах абстрактных типов данных; когда алгоритм используется для конкретных типов данных, создается экземпляр этого алгоритма с типами данных, переданными в качестве параметров. Такой стиль программирования позволяет использовать универсальный код для похожих заданий, имеющих дело с разными типами данных, и таким образом уменьшить дублирование кода.[37]
Обобщённая - широко используется для реализации универсальных контейнеров и алгоритмов. Так, стандартная библиотека шаблонов STL в С++ предоставляет набор контейнеров (динамический массив, связный список, очередь, множество и т.д.) и алгоритмов, применимых к этим или пользовательским контейнерам.
Объектно-ориентированная парадигма (ООП) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
В данном определении выделим 3 части:[38]
- ООП использует в качестве базовых элементов объекты, а не алгоритмы.
- Каждый объект является экземпляром какого-либо определенного класса.
- Классы организованы иерархически.
Программа является объектно-ориентированной только при соблюдении всех трех указанных требований. Например, программирование не основанное на иерархических отношениях, не относится к ООП. Оно называется программированием на основе абстрактных типов данных, поэтому не все языки программирования, удовлетворяющие только 1 и 2 части, являются объектно-ориентированными языками.[39]
Прототипное программирование — разновидность объектно-ориентированного программирования, в котором отсутствует понятие класса. Для повторного использования поведения объекта (в классических языках программирования — наследование) этот объект клонируется, становясь прототипом. Каноническим примером прототипного языка программирования является язык Self, Javascript.[40]
Процедурное программирование — парадигма, основанная на использовании процедур. Процедура (иногда также называемая подпрограммой или методом) — это последовательность команд, которые следует выполнить. Любая процедура может быть вызвана из любой точки программы, включая другие процедуры или ее же саму (рекурсивный вызов). [41]
Процедурное программирование широко используется в крупномасштабных проектах, когда на первый план выходят следующие преимущества:
легкость повторного использования фрагментов кода, оформленных как процедуры (например, в библиотеках);
легкость прослеживания логики программы;
возможность сопровождения программного продукта через длительное время после написания кода или кем-то, кроме его автора.
Процедурное программирование является частным случаем императивной парадигмы. [42]