Файл: Классификация языков программирования высокого уровня.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 291

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Особенности ЯВУ при анализе парадигм:

  • практикуются неявные формы представления отдельных понятий ради лаконизма записи программ;
  • выражения чаще всего рассчитаны на схему предвычисления над скалярами конкретной длины или сложными значениями (сначала вычисляются операнды, затем вычисляется результат операций);
  • – различны виды ветвлений и циклов, категории функций и процедур;[18]
  • типы данных конструируются по фиксированным в ЯП правилам и реализуются по принятым в СП шаблонам;
  • схемы управления вычислениями нередко фиксированы в языке и конкретно реализованы в системе программирования;
  • взаимодействие и соответствие средств и методов, относящихся к разным семантическим системам, при их реализации в системе программирования определено по традиции и прецедентам, причем в коде оно скрыто или рассредоточено, а не структурировано;
  • эффективность программирования базируется на знании методов реализации значений и обработчиков структур данных в памяти;
  • результат программы, как правило, рассредоточен по разным переменным, но во многих ЯВУ есть выражения и функции, формирующие один результат.[19]

По Белову[20] были выделенны три основные парадигмы: процедурная, объектно-ориентированная и логическая.

Языки высокого уровня делятся на:

  • Процедурные (алгоритмические) (Basic, Pascal, С и др.), которые предназначены для однозначного описания алгоритмов; для решения задачей процедурные языки требуют в той или иной форме явно выписать процедуру ее решения;
  • Логические (Prolog, Lisp и др.), которые ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания;
  • Объектно-ориентированные — (Object Pascal, С++, Java и др.) в основе которых лежит понятие объекта, сочетающего в себе данные и действия над ними. Программа на объектно-ориентированном языке, решая некоторую задачу, по сути, описывает часть мира, относящуюся к этой задаче. Описание действительности в форме системы взаимодействия объектов естественнее, чем система взаимодействия процедур.[21]

Я возьму три текущих понятия за основу для таблицы классификаций по парадигмам программирования главным (по Белову), и второстепенным (сбор данных с простора интернета и книжных источников). Далее я выберу 29 языков программирования высокого уровня из списка самых популярных языков программирования 2018 г., который приложен в содержании (мне хотелось бы взять все языки из списка но, увы, сказался недостаток свободного времени). Путем анализа каждого языка из списка произведу заполнение таблицы. В следующий разделе: Второстепенные парадигмы, - будет представлен список с описанием каждой парадигмы.


  1. Второстепенные парадигмы программирования

Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Парадигма имеет узкопрофессиональный смысл.[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]