Файл: Классификация языков программирования высокого уровня.pdf
Добавлен: 30.03.2023
Просмотров: 301
Скачиваний: 2
Рефлексивное программирование — это разновидность метапрограммирования, предусматривающая написание программ, которые могут изменять свое собственное поведение. Возможность обработки инструкций так же, как и данных, является одним из ключевых моментов архитектуры фон Неймана; разница между ними проявляется только в том, как именно их обрабатывает компилятор. В большинстве языков инструкции выполняются, а данные обрабатываются. Рефлексивное программирование позволяет обработку инструкций перед их выполнением. Таким образом, последовательность инструкций, подлежащих выполнению, может быть сформирована в процессе выполнения на основании входных данных и другой информации, доступной только на этом этапе.[43]
Скалярное программирование[44] — парадигма, диктующая отсутствие в языке матричных операций. Каждая операция применяется к отдельным скалярным величинам, но не ко всему массиву. Таким образом, программист должен организовать обработку массива как последовательность скалярных операций.Скалярное программирование является противоположностью матричного программирования.[45]
Стек-ориентированная парадигма программирования - использует для передачи параметров модель стека. Стек-ориентированный язык программирования оперирует одним или несколькими стеками и обычно использует префиксную или постфиксную нотацию, вместо инфиксной нотации, обычной для других языков. Две основные операции, которые выполняются над данными в стеке — pop (удалить верхний элемент и вернуть его) и push (добавить элемент в верх стека). Иногда стек-ориентированные языки предоставляют и более сложные операции, например, dup (скопировать верхний элемент стека и добавить его в верх стека), swap (поменять местами два верхних элемента стека), roll (циклически переставить элементы в заданной части стека) и drop (удалить верхний элемент стека, не возвращая его).[46]
Строгая парадигма - в строгом языке программирования могут быть определены только строгие функции.[47]В денотационной семантике языков программирования функция f является строгой если f (_|_) = |. Сущность «_|_» обозначает выражение, которое не возвращает нормального значения по причине выполнения бесконечного цикла или прекращения из-за ошибки (к примеру, деления на ноль).
Структурное программирование — парадигма, имеющая два значения: низкоуровневая трактовка предполагает, что программная логика состоит из нескольких структур, комбинируемых определенным образом. Элементарными структурами обычно являются последовательность (выполнение нескольких команд или блоков последовательно, в определенном порядке), условный переход (выполнение одного из списков команд в зависимости от текущего состояния программы) и повторение (выполнение одного списка команд несколько раз). Большинство современных императивных языков программирования поддерживают эту трактовку структурной парадигмы.Более высокоуровневая трактовка предполагает разделение логики программы на несколько подпрограмм, каждая из которых будет иметь одну точку входа. Мнения о количестве точек выхода расходятся: теоретически предпочтение отдается единственной точке выхода, но на практике их может использоваться несколько. Примером такой ситуации является разветвление логики подпрограммы и необходимость сигнализировать о возникновении ошибки или об успешном конце работы одной из ветвей. Конечно, подпрограммы с несколькими точками выхода могут быть переписаны так, чтобы оставить только одну точку выхода, но это излишне усложнит код. Эта трактовка структурной парадигмы сходна с процедурным программированием: легче и нагляднее всего такое разделение на подпрограммы реализуется именно в виде процедур.Структурное программирование является частным случаем императивного программирования.[48]
Табличная - Табличное программирование (tabular programming) — разновидность объектно-ориентированного программирования, в котором классы представляются в виде таблиц. Столбцы содержат свойства класса, а строки — экземпляры объектов.[49]
Функциональная — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании (то есть тех, чей единственный результат работы заключается в возвращаемом значении, или другими словами, вычисление которых не имеет побочного эффекта). Противопоставляется парадигме императивного программирования, в которой исполнителю программы предписывается последовательность выполняемых действий, в то время как в функциональном программировании способ решения задачи описывается при помощи зависимости функций друг от друга (в том числе возможны рекурсивные зависимости), но без указания последовательности шагов.[50]
Эзотерический язык программирования — язык программирования, разработанный для исследования границ возможностей разработки языков программирования, для доказательства потенциально возможной реализации некой идеи (так называемое «доказательство концепции», англ. proof of concept), в качестве произведения программного искусства или в качестве шутки (компьютерного юмора).[51]
Многие эзотерические языки придумываются для развлечения, часто они пародируют «настоящие» или являются абсурдным воплощением «серьёзных» концепций программирования. Некоторые эзотерические языки нарочно ограничены (как, например, язык HQ9+), другие являются тьюринг-полными, то есть языками общего назначения. Общее свойство, присущее любому эзотерическому языку — текст программы на нём понятен лишь «посвящённому» либо непонятен вообще, потому что для составления программы нужно написать программу на обычном языке. В то время как разработчики «реальных» языков программирования стараются сделать синтаксис максимально понятным, а программирование — удобным, создатели эзотерических языков обычно ставят перед собой противоположные задачи.
На практике такие языки, как правило, бесполезны, однако программирование на некоторых из них является неплохой тренировкой. Эзотерические языки нередко включают в список разрешённых языков на конкурсах по программированию.[52]
Параллельное (concurrent) программирование - представляет программу в виде набора сообщающихся процессов, которые могут выполняться параллельно. Такие программы могут выполняться как на одном процессоре (чередуя выполнение шагов каждого процесса), так и на нескольких.[53]
Потоковое программирование[54]- представляет программу в виде ориентированного графа, в котором ребра соответствуют потокам данных, а вершины — действиям, которые над ними производятся. Потоковое программирование считается разновидностью функционального программирования. Внимание концентрируется скорее на данных и логических отношениях между ними, а действия над данными вторичны. Кроме того, в большинстве реализаций потоковых языков программирования они являются и визуальными, т.к. программы представляются в виде схем, а не кода. Операции обычно изображаются в виде “черными ящиками” с входными и выходными контактами, к которым “подводятся” данные. Как только известны все данные, ведущие к блоку действия, он выполняется и передает свой результат дальше. Таким образом, для некоторых блоков порядок, в котором они выполнятся, неизвестен.[55]
Правила переписывания. Несмотря на то, что изначально понятие переписывания было введено для лямбда исчислений, основной массив результатов и приложений в настоящее время касается переписывания первого порядка. Переписывающие системы такого рода называют Системами Переписывания Термов или TRS.[56]
Используя, 30 второстепенных парадигм и три основных парадигмы я смогу заполнить Таблицу 1. Для классификации по текущим парадигмам, мне необходим краткий анализ для каждого из языков, из имеющегося списка в приложении. В следующей части представлен хронологический порядок 29 языков программирования высокого уровня, с краткими характеристиками каждого конкретного языка.
-
Краткое описание языков программирования высокого уровня
1. Лисп (LISP, от англ. LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Лисп был создан Джоном Маккарти для работ по искусственному интеллекту и до сих пор остаётся одним из основных инструментальных средств в данной области. Применяется он и как средство обычного промышленного программирования, от встроенных скриптов до веб-приложений массового использования, хотя популярным его назвать нельзя.
Lisp является самым ранним представителем парадигмы языка функционального программирования с нуля. В отличие от процедурных и объектно-ориентированных языков, теоретическая модель которых является машиной Тьюринга, теоретической моделью расчета Лиспа является лямбда исчисление, разработанное церковью Алонсо. Это отличие понимается по следующим направлениям:
- В процедурных языках код работает с данными.
- В объектно-ориентированных языках объекты инкапсулируют код и данные, взаимодействуя друг с другом.
- В функциональных языках данные передаются через функции, но не имеют отдельного собственного существования.
2. COBOL (от COmmon Business-Oriented Language) — один из старейших языков программирования, разработанный, прежде всего для написания программ для экономической сферы. Руководителем проекта по созданию Кобола была Грейс Хоппер.
Спецификация языка была создана в 1959 году. Создатели языка ставили своей целью сделать его машинно-независимым и максимально приближенным к естественному английскому языку. Обе цели были успешно достигнуты; программы на COBOL считаются понятными даже неспециалистам, поскольку тексты на этом языке программирования не нуждаются в каких-либо специальных комментариях (самодокументирующиеся программы).
COBOL — язык очень старый и в свое время использовался крайне активно, поэтому существует множество реализаций и диалектов. Для языка был утвержден ряд стандартов: в 1968, 1974, 1985 и 2002 годах. Последний стандарт добавил в язык поддержку объектно-ориентированной парадигмы.
Язык позволяет эффективно работать с большим количеством данных, он насыщен разнообразными возможностями поиска, сортировки и распределения. К числу других плюсов COBOL обычно относят его структурированность. Довольно мощные компиляторы с этого языка разработаны для персональных компьютеров. Некоторые из них столь эффективны, что программу, отлаженную на персональном компьютере, нетрудно перенести на большие ЭВМ.
Перечисляя минусы, нельзя не вспомнить о том, что на Коболе можно запрограммировать лишь простейшие алгебраические вычисления. Для сложных инженерных расчетов этот язык не годится. Еще одна причина, которая в какой-то мере сдерживает развитие языка, — это наличие в США специально созданного отраслевого комитета, вырабатывающего стандарты, за соблюдением которых следит правительственная комиссия. Как это всегда бывает в подобных случаях, фирмы, занимающиеся разработкой программного обеспечения, не торопятся подгонять свои заготовки к жестким требованиям комиссии, отсутствует конкуренция версий, а в итоге проигрывает распространение языка.
3. Лого (англ. Logo) — язык программирования высокого уровня, разработанный в 1967 году Уолли Фёрзегом, Сеймуром Пейпертом и Синтией Соломон в образовательных целях для обучения детей дошкольного и младшего школьного возраста основным концепциям программирования (рекурсии, расширяемости и пр.).
Лого - универсальный язык простой в изучении, так как команды, используемые в нем, имеют не абстрактный для учащихся вид (например: вперед, назад, направо, налево, повтори и др.). Лого – это прекрасный инструмент для создания компьютерной графики одновременно с освоением элементарных навыков структурного программирования. Элементы Лого-графики сейчас включаются во многие языки программирования, такие как: Паскаль, Си и другие. Среду Лого можно назвать интегрированной, т.к. она включает в себя графический, текстовый, музыкальный редакторы, среду программирования.
4. Fortran – был создан в 1954 - 1957 гг. группой под руководством Джона Бэкуса в корпорации IBM. Он был разработан для решения научных и инженерных задач. Обладает популярностью, наличием трансляторов различных типов машин, высокой эффективностью кода, переносимостью на другие типы ЭВМ в разных ОС, простотой конструкций. Современный Фортран обладает объектно-ориентированной парадигмой, императивной, строгой и статической типизацией данных, так же имеет пакет для перемножения матриц.
5. Prolog - появился в 1972 г. Когда в 60-х годах очень развивалась теория автоматического доказательства теорем и Робинсоном был предложен алгоритм резолюций, который позволял доказать любую верную теорему (вывести из аксиом) за конечное время (за какое не известно). Как оказалось позже, это наилучшее решение общей задачи, невозможно доказать теорему за ограниченное число операций. Простыми словами, алгоритм представляет собой обход (в общем случае бесконечного) графа в ширину, естественно, что предсказуемость работы алгоритма практически равно 0, соответственно для Языка Программирования — это абсолютно не подходит. И в этот момент Кальмэроу нашел блестящее сужение задачи, благодаря которому доказательство некоторых теорем выглядело как процедурное исполнение программы. Пролог (англ. Prolog) — язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка. Prolog является декларативным языком программирования: логика программы выражается в терминах отношений, представленных в виде фактов и правил. Для того чтобы инициировать вычисления, выполняется специальный запрос к базе знаний, на которые система логического программирования генерирует ответы «истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов созданная система Пролог выводит конкретные данные в подтверждение истинности обобщённых сведений и правил вывода.