Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Классификация языков программирования высокого уровня

Содержание:

Введение

Язык программирования - это искусственный или машинный язык, цель которого запись алгоритма, а именно создание программы для компьютера. В настоящее время существует множество языков программирования. В мировом рейтинге популярных языков программирования на февраль 2019 года их количество составляет 100 наименований. В зависимости от подробности алгоритма определяется уровень языка программирования. Чем меньше детализация предписаний или шагов, тем выше уровень языка.

Языки программирования бывают:

  • машинные
  • машинно-ориентированные
  • машинно-независимые

Машинный язык - система команд конкретной ЭВМ, набор инструкций двоичного кода.

Машинно-ориентированные языки - языки ассемблера (ассемблер - программа-транслятор), система команд с заменой двоичного кода на символы.

Машинно-независимые языки, или языки высокого уровня - это последовательность команд на конкретном языке, подлежащих переводу на машинный язык. Такие языки созданы для удобства и упрощения действий человека при создании программы .

Машинный и машинно-ориентированный - языки низкого уровня и сложны для восприятия человека.

Машинно-независимые языки – языки высокого уровня. Они используют общепринятые термины и символы, и для перевода такого кода используются трансляторы языка.

Трансляторы языка - это программы для перевода языков высокого уровня в машинный код.

Языки высокого уровня разделяют по типу преобразования в машинный язык на

  • скриптовые (интерпретируемые)
  • компилируемые.

Скриптовые (интерпретируемые) - это языки, в которых исходный код не компилируется в машинный код для выполнения центральным процессором, а исполняется с помощью программы — интерпретатора.

Компилируемые - это языки, которые переводятся, посредством программы или технического средства называемого компилятор, в машинный код; или в другой язык программирования посредством программы-транслятора.

Классификация языков программирования по поддерживаемым парадигмам программирования требует анализа их операционной семантики и реализационной прагматики.

Операционная семантика - описание операторов языка программирования и их смысловая конструкция. Посредством анализа семантики определяется тип программирования на конкретном языке и способ его чтения: компиляция или интерпретация. А так же определяется основное направление или основная парадигма конкретного языка на основе подхода к вычислениям или же семантики.

Языки высокого уровня разделяются на три основных парадигмы

  • процедурные
  • логические
  • объектно-ориентированные.

Процедурные языки - имеют строгую последовательность команд, требующих поочередного выполнения операторов.

Логические языки - созданы на основе формул математической логики, и включают в себя раздел дискретной математики. Они базируются на классической логике и применимы для систем логического вывода.

Объектно-ориентированные языки - языки, в которых, исходя из названия, отражены понятия и объекты реального мира. Имеют форму системы взаимодействия объектов, сочетают и описывают объект, часть мира, и, данные и действия, с ними.

Альтернативные подходы к обработке информации, сложившиеся при создании и применении языков и систем программирования принято называть парадигмами программирования.

Парадигмами программирования в форме языков и систем программирования представлено знание о потенциале информационных технологий. Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Парадигма имеет узкопрофессиональный смысл.

Все языки программирования включают различное количество стилей или парадигм. Список парадигм: автоматное программирование, аспектно-ориентированная, визуальная, вычисления с откатами, декларативная, императивная, конкатенативный, логическая, матричная, метапрограммирование, мультипарадигма, на уровне значений, на уровне функций, нестрогая, обмен сообщениями, обобщённая, объектно-ориентированная, параллельная, потоковая, правила переписывания, предметно-ориентированная, прототипная, процедурная, рефлексивная, скалярная, стек-ориентированная, строгая, структурная, табличная, функциональная, эзотерическая.

Классификация языков высокого уровня по поддерживаемым парадигмам программирования требует анализа их операционной семантики. В следующей главе находятся сведения об истории семантики программирования и трех ее видах – подходах, а так же сведения об операционной семантике. Конечная цель моей курсовой работы – это Таблица 1 в которой будут распределены 29 языков высокого уровня по основным и второстепенным парадигмам.

  1. Семантика языков программирования

Именно синтаксис и семантика являются наиболее существенными понятиями, фактически определяющими произвольный язык программирования.

В 60-х годах Джоном Бэкусом (John Backus) были созданы основы формализации синтаксиса языков программирования посредством специального математического языка. Позднее Петером Науром (Peter Naur) этот язык (а с точки зрения целевого языка программирования — метаязык) был доработан, в результате чего возникла математическая нотация, известная и сегодня под названием "форм Бэкуса-Наура" или сокращенно - БНФ.[1]

Данная нотация была специально разработана с целью формализации синтаксиса языка программирования (в то время это был весьма популярный, прежде всего в математической среде, язык программирования ALGOL 60 с ясным, но довольно пространным синтаксисом). БНФ и сегодня являются теоретически адекватным и практически применимым средством формализации синтаксиса языков программирования.

Что касается теоретических основ семантики вычислений, то в конце 60-х годов Дана Стюарт Скотт (Dana Stewart Scott) предложил применить для формализации семантики математических теорий, так называемые домены[2] (пока будем неформально понимать их как особый вид множеств). При этом на основе доменов Д.С. Скоттом был предложен так называемый денотационный подход к семантике[3]. Такой подход предполагает анализ синтаксически корректных конструкций языка (или, иначе, денотатов) с точки зрения возможности вычисления их значений посредством специализированных функций.

Далее, в 70-х годах, М. Гордон (Michael J.C. Gordon) исследовал аппарат денотационной семантики применительно к языкам функционального программирования и сделал вывод об адекватности и практической эффективности использования этого подхода для решения поставленной задачи.

Параллельным направлением изучения семантики был подход, исследовавший изменения, которые происходили в процессе работы программы на основе отслеживания смены состояний программы.[4]

Одним из практических результатов исследований в этом направлении стала разработка П. Лендином (Peter J. Landin) семантики модели языка программирования в форме абстрактной машины[5] (т.е. модели компьютера), использовавшей понятие состояния.

Альтернативный подход к формализации семантики (который был осуществлен в рамках исследования так называемой операционной семантики языков программирования) привел к созданию Ч. Хоаром (Charles A.R. Hoare) аксиоматического метода, моделирующего отношения и причинно-следственные связи, возникающие между операторами языка программирования.

Развитие операционной семантики языков программирования привело Р. Флойда (Robert W. Floyd) к созданию так называемого метода индуктивных утверждений[6], который использовался для формализации семантики протекания информации в программе. При этом существенным преимуществом предложенного Р. Флойдом метода стала возможность интуитивно прозрачной и наглядной графической иллюстрации, основанной на блок-схемах, формализующих последовательность протекания информации.

Существует несколько подходов к определению семантики языков программирования.

Наиболее широко распространены разновидности следующих трёх: операционного[7], денотационного (математического) и деривационного[8] (аксиоматического).

При описании семантики в рамках операционного подхода обычно исполнение конструкций языка программирования интерпретируется с помощью некоторой воображаемой (абстрактной) ЭВМ.

Деривационная семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.

Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.

Язык программирования строится в соответствии с той или иной базовой моделью вычислений и парадигмой программирования.[9]

Операционное определение языка программирования описывает выполнение программы, составленной на данном языке, средствами виртуального компьютера.[10] Виртуальный компьютер определяется как абстрактный автомат. Внутренние состояния этого автомата моделируют состояния вычислительного процесса при выполнении программы. Автомат транслирует исходный текст программы в набор формально определенных операций. Этот набор задает переходы автомата из исходного состояния в последовательность промежуточных состояний, изменяя значения переменных программы. Автомат завершает свою работу, переходя в некоторое конечное состояние. Таким образом, здесь идет речь о достаточно прямой абстракции возможного использования языка программирования.[11]

Итак, операционная семантика описывает смысл программы путем выполнения ее операторов на простой машине-автомате. Изменения, происходящие в состоянии машины при выполнении данного оператора, определяют смысл этого оператора.

С одной стороны, машина-автомат способна воспринимать задания, представляемые лишь на простом языке моделирования. С другой стороны, современный компьютер может служить универсальным интерпретатором такого языка. Подобный интерпретатор может быть реализован программой, которая становится виртуальной машиной для языка моделирования.[12]

Таким образом, в операционной семантике требуются:

□ транслятор, преобразующий операторы исходного языка программирования L в команды низкоуровневого языка моделирования;

□ виртуальная машина (ВМ) для языка моделирования. Или интерпритатор.[13]

Существует несколько подходов к определению семантики языков программирования.[14]

Наиболее широко распространены разновидности следующих трёх базовых моделей: операционная, денотационная (математическая) и деривационная (аксиоматическая).

При описании семантики в рамках операционного подхода обычно исполнение конструкций языка программирования интерпретируется с помощью некоторой воображаемой (абстрактной) ЭВМ. [15]

Деривационная семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.

Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.

Язык программирования строится в соответствии с той или иной базовой моделью вычислений и парадигмой программирования. Для классификации языков программирования высокого уровня по парадигме требуется анализ семантики и синтаксиса конкретного языка. Далее будет приведен список парадигм основных и второстепенных.

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

Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие. Парадигма имеет узкопрофессиональный смысл. Парадигмами программирования в форме языков и систем программирования представлено знание о потенциале информационных технологий.[16]Альтернативные подходы к обработке информации, сложившиеся при создании и применении языков и систем программирования принято называть парадигмами программирования.[17]

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

  • практикуются неявные формы представления отдельных понятий ради лаконизма записи программ;
  • выражения чаще всего рассчитаны на схему предвычисления над скалярами конкретной длины или сложными значениями (сначала вычисляются операнды, затем вычисляется результат операций);
  • – различны виды ветвлений и циклов, категории функций и процедур;[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]

Рефлексивное программирование — это разновидность метапрограммирования, предусматривающая написание программ, которые могут изменять свое собственное поведение. Возможность обработки инструкций так же, как и данных, является одним из ключевых моментов архитектуры фон Неймана; разница между ними проявляется только в том, как именно их обрабатывает компилятор. В большинстве языков инструкции выполняются, а данные обрабатываются. Рефлексивное программирование позволяет обработку инструкций перед их выполнением. Таким образом, последовательность инструкций, подлежащих выполнению, может быть сформирована в процессе выполнения на основании входных данных и другой информации, доступной только на этом этапе.[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. Краткое описание языков программирования высокого уровня

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

Иначе говоря, предикат можно определить как функцию, отображающую множество произвольной природы в множество булевых значений {ложно, истинно}. Задача пролог–программы заключается в том, чтобы доказать, является ли заданное целевое утверждение следствием из имеющихся фактов и правил. В настоящее время Пролог, несмотря на неоднократные пессимистические прогнозы, продолжает развиваться в разных странах и вбирает в себя новые технологии и концепции, а также парадигмы императивного программирования. В частности, одно из направлений развития языка (в том числе и в России) реализует концепцию интеллектуальных агентов. Другим часто подвергаемым критике свойством языка является отсутствие типизации (при этом в Visual Prolog — одном из объектно-ориентированных расширений языка — реализована строгая типизация, что, однако, снижает гибкость пролога).

В языке предопределён порядок обхода дерева решений «в глубину» и стандартизированы операторы, позволяющие вмешиваться в этот процесс (такие как оператор отсечения “!” или ветвления – “>”). Такая архитектура затрудняет автоматическое распараллеливание программ, которое позволило бы задействовать в поиске решения несколько процессоров или узлов сети.

6. C - компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но впоследствии был перенесён на множество других платформ. Согласно дизайну языка, его конструкции близко сопоставляются типичным машинным инструкциям, благодаря чему он нашёл применение в проектах, для которых был свойственен язык ассемблера, в том числе как в операционных системах, так и в различном прикладном программном обеспечении для множества устройств — от суперкомпьютеров до встраиваемых систем. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и Objective-C.

7. SQL - SQL (ˈɛsˈkjuˈɛl; англ. structured query language — «язык структурированных запросов») — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.

Является прежде всего информационно-логическим языком, предназначенным для описания, изменения и извлечения данных, хранимых в реляционных базах данных. SQL считается языком программирования, в общем случае (без ряда современных расширений) не является тьюринг-полным, но вместе с тем стандарт языка спецификацией SQL/PSM предусматривает возможность его процедурных расширений.

Изначально SQL был основным способом работы пользователя с базой данных и позволял выполнять следующий набор операций:

создание в базе данных новой таблицы;

добавление в таблицу новых записей;

изменение записей;

удаление записей;

выборка записей из одной или нескольких таблиц (в соответствии с заданным условием);

изменение структур таблиц.

Со временем SQL усложнился — обогатился новыми конструкциями, обеспечил возможность описания и управления новыми хранимыми объектами (например, индексы, представления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.

При всех своих изменениях SQL остаётся самым распространённым лингвистическим средством для взаимодействия прикладного программного обеспечения с базами данных. В то же время современные СУБД, а также информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов.

8. SAS - аббревиатура от Statistical Analysis System, что полностью описывает основное направление деятельности компании. Итак, Джеймс Гуднайт (James Goodnight) в 1976 году окончил Университет Северной Каролины, тут же приложил свою руку к созданию небольшой аналитической компании SAS Institute .

Естественно, для того, чтобы эффективно обрабатывать большие потоки информации потребовался не только качественный программный продукт, но и соответствующий язык. И им стал SAS. Изначально это был довольно примитивный набор шаблонных запросов для группировки данных, но со временем SAS стал полноценным и достаточно популярным языком программирования.

В общем-то с этого момента можно было бы смело вести историю языка, программного обеспечения и всей компании, как единого целого, но в 2002 году объявился идеологический конкурент - World Programming System (WPS), который в своей деятельности не просто стал использовать язык SAS, но и разработал для него собственный компилятор и IDE.

9. Ада (Ada) — язык программирования, созданный в 1979—1980 годах в ходе проекта Министерством обороны США с целью разработать единый язык программирования для встроенных систем (то есть систем управления автоматизированными комплексами, функционирующими в реальном времени). Имелись в виду прежде всего бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области. Язык назван в честь Ады Лавлейс.

Ада - компилируемый, статически типизированный язык программирования общего назначения.

Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование. Язык имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности.

10. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также игр. Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.

11. Objective-C — появился в 1983 г., автор Брэд Кокс, компилируемый объектно-ориентированный язык программирования, используемый корпорацией Apple, построенный на основе языка Си и парадигм Smalltalk. В частности, объектная модель построена в стиле Smalltalk — то есть объектам посылаются сообщения.

Язык Objective-C является надмножеством языка Си, поэтому Си-код полностью понятен компилятору Objective-C.

Компилятор Objective-C входит в GCC и доступен на большинстве основных платформ. Язык используется в первую очередь для Mac OS X (Cocoa) и GNUstep — реализаций объектно-ориентированного интерфейса OpenStep. Также язык используется для iOS (Cocoa Touch).

12. MATLAB как язык программирования был разработан Кливом Моулером (англ. Cleve Moler) в конце 1970-х годов когда он был деканом факультета компьютерных наук в Университете Нью-Мексико. Целью разработки служила задача дать студентам факультета возможность использования программных библиотек Linpack и EISPACK без необходимости изучения Фортрана. Вскоре новый язык распространился среди других университетов и был с большим интересом встречен учёными, работающими в области прикладной математики. Язык MATLAB является высокоуровневым интерпретируемым языком программирования, включающим основанные на матрицах структуры данных, широкий спектр функций, интегрированную среду разработки, объектно-ориентированные возможности и интерфейсы к программам, написанным на других языках программирования.

Программы, написанные на MATLAB, бывают двух типов — функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции сохраняются в виде текстовых файлов и компилируются в машинный код динамически. Существует также возможность сохранять так называемые pre-parsed программы — функции и скрипты, обработанные в вид, удобный для машинного исполнения. В общем случае такие программы выполняются быстрее обычных, особенно если функция содержит команды построения графиков. Основной особенностью языка MATLAB являются его широкие возможности по работе с матрицами, которые создатели языка выразили в лозунге «думай векторно» (англ. Think vectorized).

13. Python - Разработка языка Python была начата в конце 1980-х годов сотрудником голландского института CWI Гвидо ван Россумом. Для распределённой ОС Amoeba требовался расширяемый скриптовый язык, и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources. С самого начала Python проектировался как объектно-ориентированный язык. Python поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.

14. Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process, язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.

Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре с помощью виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. На 2019 год Java — один из самых популярных языков программирования.

15. PL/SQL (Procedural Language / Structured Query Language) — язык программирования, процедурное расширение языка SQL, разработанное корпорацией Oracle. Базируется на языке Ада[1].

PL/SQL встроен в следующие СУБД: Oracle Database (начиная с версии 7), TimesTen (англ.) (с версии 11.2.1) и IBM DB2 (с версии 9.7). Также PL/SQL используется как встроенный язык для средства быстрой разработки Oracle Forms, инструмента разработки отчётов Oracle Reports и в Oracle Application Express.

16. R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU. Язык создавался как аналогичный языку S, разработанному в Bell Labs, и является его альтернативной реализацией, хотя между языками есть существенные отличия, но в большинстве своём код на языке S работает в среде R. Изначально R был разработан сотрудниками статистического факультета Оклендского университета Россом Айхэкой (англ. Ross Ihaka) и Робертом Джентлменом (англ. Robert Gentleman) (первая буква их имён — R); язык и среда поддерживаются и развиваются организацией R Foundation.

R широко используется как статистическое программное обеспечение для анализа данных и фактически стал стандартом для статистических программ.

R доступен под лицензией GNU GPL. Распространяется в виде исходных кодов, а также откомпилированных приложений под ряд операционных систем: FreeBSD, Solaris и другие дистрибутивы Unix и Linux, Microsoft Windows, Mac OS X.

В R используется интерфейс командной строки, хотя доступны и несколько графических интерфейсов пользователя, например пакет R Commander, RKWard, RStudio, Weka, Rapid Miner, KNIME, а также средства интеграции в офисные пакеты.

В 2010 году R вошёл в список победителей конкурса журнала Infoworld[en] в номинации на лучшее открытое программное обеспечение для разработки приложений.

17. Ruby (англ. ruby — рубин, произносится ['ru:bɪ] — ру́би) — динамический, рефлективный, интерпретируемый высокоуровневый язык программирования. Язык обладает независимой от операционной системы реализацией многопоточности, сильной динамической типизацией, сборщиком мусора и многими другими возможностями. По особенностям синтаксиса он близок к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и Клу.

Кроссплатформенная реализация интерпретатора языка является полностью свободной.

18. Delphi (Делфи, произносится dɘlfi:) — императивный, структурированный, объектно-ориентированный, высокоуровневый язык программирования со строгой статической типизацией переменных. Основная область использования — написание прикладного программного обеспечения.

Этот язык программирования является диалектом языка Object Pascal. Изначально язык Object Pascal относился к несколько другому языку, который был разработан в фирме Apple в 1986 году группой Ларри Теслера. Однако, начиная с Delphi 7 в официальных документах компании Borland название Delphi стало использоваться для обозначения языка, ранее известного как Object Pascal.

19. JavaScript — мультипарадигмальный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Является реализацией языка ECMAScript (стандарт ECMA-262).

JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам.

Основные архитектурные черты: динамическая типизация, слабая типизация, автоматическое управление памятью, прототипное программирование, функции как объекты первого класса.

На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом лёгким для использования не программистами. Языком JavaScript не владеет какая-либо компания или организация, что отличает его от ряда языков программирования, используемых в веб-разработке.

20. Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка официально расшифровывается как Practical Extraction and Report Language («практический язык для извлечения данных и составления отчётов»), а в шутку — как Pathologically Eclectic Rubbish Lister («патологически эклектичный перечислитель мусора»); разработчики языка не считают его название акронимом. Первоначально название состояло из пяти символов и в таком виде в точности совпадало с английским словом pearl («жемчужина»). Но затем стало известно, что такой язык существует (см. PEARL (англ.)), и букву «a» убрали. Символом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе работа с регулярными выражениями, встроенная в синтаксис. Перл унаследовал много свойств от языков Си, AWK, скриптовых языков командных оболочек UNIX.

21. C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота как язык разработки приложений для платформы Microsoft .NET Framework. Впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

Переняв многое от своих предшественников — языков C++, Pascal, Модула, Smalltalk и, в особенности, Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

22. Visual Basic .NET (VB.NET) — объектно-ориентированный язык программирования, который можно рассматривать как очередной виток эволюции Visual Basic (VB), реализованный на платформе Microsoft .NET. VB.NET не имеет обратной совместимости с более ранней версией (Visual Basic 6.0). Развитие проектов старых версий (*.vbp) возможно только после предварительной конвертации их в формат VB.NET специальным мастером (Migration Wizard); однако, как правило, после конвертации требуется существенная ручная доработка текстов.

23. Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.

Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски, язык реализован для платформ Java и Java Script. По мнению Джеймса Стрэчена, создателя языка программирования Groovy, Scala может стать преемником языка Java.

24. Transact-SQL (T-SQL) — процедурное расширение языка SQL, созданное компанией Microsoft (для Microsoft SQL Server) и Sybase (для Sybase ASE).

SQL был расширен такими дополнительными возможностями как:

управляющие операторы,

локальные и глобальные переменные,

различные дополнительные функции для обработки строк, дат, математики и т. п.,

поддержка аутентификации Microsoft Windows.

Язык Transact-SQL является ключом к использованию MS SQL Server. Все приложения, взаимодействующие с экземпляром MS SQL Server, независимо от их реализации и пользовательского интерфейса, отправляют серверу инструкции Transact-SQL.

25. D (Ди) — мультипарадигмальный компилируемый язык программирования, созданный Уолтером Брайтом из компании Digital Mars. Начиная с 2006 года соавтором также является Андрей Александреску. Изначально D был задуман как реинжиниринг языка C++, однако, несмотря на значительное влияние С++, не является его вариантом. Также язык испытал влияние концепций из языков программирования Python, Ruby, C#, Java, Eiffel.

При создании языка D была сделана попытка соединить производительность компилируемых языков программирования с безопасностью и выразительностью динамических.

Стабильная версия компилятора 1.0 вышла 2 января 2007.

Следующая версия компилятора 2.0 (последняя на сегодняшний день мажорная версия) начала развитие 17 июня 2007 года и развивается и по сей день.

D доступен для операционных систем Windows, Linux, Mac OS, FreeBSD. Ведётся работа по портированию на Android.

26. Скретч (англ. Scratch) — визуальная событийно-ориентированная среда программирования, созданная для детей и подростков. Название произошло от слова scratching — техники, используемой хип-хоп-диджеями, которые крутят виниловые пластинки вперед-назад руками для того, чтобы смешивать музыкальные темы.

Скретч создан как продолжение идей языка Лого и конструктора Лего. Скретч 1.4 был написан на языке Squeak, Скретч 2.0 и 3.0 ориентированы на работу онлайн. Скретч 2.0 был переписан на Flash и ActionScript. Скретч 3.0 (текущая версия) является улучшенной версией Скретч 2.0 и сделана на HTML5, используя движок WebGL, что даёт ему возможность работать на мобильных устройствах и планшетах. Скретч разрабатывается небольшой командой программистов для детей в Массачусетском технологическом институте. Текущая версия — Скретч 3.0, выпущена в январе 2019 года. В 2008 году Скретч был портирован для микроконтроллерного модуля Arduino. Проект носит название S4A.

Программы на Скретче состоят из графических блоков, подписи к которым зависят от выбранного для интерфейса языка. Может быть выбран один из 50 языков интерфейса, включая русский. Для подключения интерфейса на новом языке используются стандартные gettext-файлы.

27.Go (часто также Golang) — компилируемый многопоточный язык программирования, разработанный внутри компании Google. Разработка Go началась в сентябре 2007 года, его непосредственным проектированием занимались Роберт Гризмер, Роб Пайк и Кен Томпсон, занимавшиеся до этого проектом разработки операционной системы Inferno. Официально язык был представлен в ноябре 2009 года. На данный момент поддержка официального компилятора, разрабатываемого создателями языка, осуществляется для операционных систем FreeBSD, OpenBSD, Linux, macOS, Windows, DragonFly BSD, Plan 9, Solaris, Android, AIX. Также Go поддерживается набором компиляторов gcc, существует несколько независимых реализаций. Ведётся разработка второй версии языка.

28. Dart — язык программирования, созданный Google. Dart позиционируется в качестве замены/альтернативы Java Script. Один из разработчиков языка Марк Миллер (Mark S. Miller) написал, что Java Script «имеет фундаментальные изъяны» («Javascript has fundamental flaws…»), которые невозможно исправить. Поэтому и был создан Dart.

Первая общедоступная информация об этом языке программирования появилась 12 сентября 2011 года на конференции разработчиков Goto. 10 октября 2011 была проведена официальная презентация языка Google Dart.

Задачи, поставленные перед разработчиками языка:

Создать структурированный и в то же время гибкий язык для веб-программирования

Сделать язык похожим на существующие для упрощения обучения

Высокая производительность получаемых программ как в браузерах, так и в иных окружениях, начиная от смартфонов и заканчивая серверами.

Изначально было предложено два способа исполнения Dart-программ: с использованием виртуальной машины (в поддерживающих язык браузерах) или с промежуточной трансляцией в java script (универсальный).

15 ноября 2013 года Google выпустили первую стабильную версию своего языка программирования — Dart SDK 1.0 .

4 июля 2014 года ECMA одобрили первую редакцию стандарта языка, стандарт получил название ECMA-408.

29. Swift — открытый мультипарадигмальный компилируемый язык программирования общего назначения. Создан компанией Apple в первую очередь для разработчиков iOS и macOS. Swift работает с фреймворками Cocoa и Cocoa Touch и совместим с основной кодовой базой Apple, написанной на Objective-C. Swift задумывался как более лёгкий для чтения и устойчивый к ошибкам программиста язык, нежели предшествовавший ему Objective-C[7]. Программы на Swift компилируются при помощи LLVM, входящей в интегрированную среду разработки Xcode 6 и выше. Swift может использовать рантайм Objective-C, что делает возможным использование обоих языков (а также С) в рамках одной программы.

Заключение

ЯВУ — объемная и многофункциональная область знаний. Для подробной классификации каждого языка, а так же выбора параметров может уйти колоссальное количество времени.

Основной целью моей работы было создание таблицы классификаций по парадигмам. Для этого были рассмотрены семантика ЯВУ, парадигмы и стили с последующим их кратким разбором, и представлена хронология выбранных языков с краткими их характеристиками.

Как мы видим по таблице 1 в приложении многие языки попадают одновременно под несколько параметров, что зависит от постоянной модернизации, введения новых функций и нововведений в различные языки. Каждый язык программирования сам по себе уникален. Группа создателей каждого конкретного языка в течении времени совершенствуют и искореняют недостатки своего детища. Каждый программист выбирает наиболее удобный и подходящий язык программирования для работы с поставленной целью, или задачей. Грамотная классификация могла бы помочь определиться с выбором необходимых «инструментов» - языков для выполнения требуемых действий и задач. К сожалению на данный момент такой классификации не существует, а даже если такая классификация появится, она будет требовать постоянной доработки, видоизменений в внесения новых данных. Создание программы — абсолютно творческая работа, ведь каждый человек от природы уникален, как и каждый язык программирования, у нас есть широкий выбор для нашей работы.

  1. Библиография

С.З. Свердлов Языки программирования и методы трансляции / С.З. Свердлов. - М.: У. П., 2007. - С. 299

А.Л. Марченко Введение в программирование / А.Л. Марченко. - М.: У. П., 2005. - С. 135

А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С. 36-45

А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С. 102-103

Н. В. Макарова В.Б. Волков Информатика / Макарова Н.В. Волков В.Б. - М.: У.П., 2018 — С. 554-557

Проект центра верификации OC Linux Теоретическое введение [http://astraver.linuxtesting.org/ ]

А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С.36

А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С.38

Введение в теорию программирования. Функциональный подход. Вступительная лекция [https://www.intuit.ru/studies/courses/39/39/info]

С. А. Орлов Теория и практика языков программирования / Орлов С.А. - М.: У.П.,2013 — С. 189

Т. Пратт, М. Зелковец Языки программирования разработка и реализация 4е издание / Пратт Т., Зелковец М. - М.: У.П. 2002 — С. 322

Р.В. Себеста Основные концепции языков программирования / Себеста Р.В. - М.: У.П. 2001 — С. 123

Т. Пратт, М. Зелковец Языки программирования разработка и реализация 4е издание / Пратт Т., Зелковец М. - М.: У.П. 2002 — С. 322

А. Сериков. Основы функционального программирования / Сериков А. - М.: У.П. - Лекция 15

Л. В. Городняя , Парадигмы программирования / Городняя Л. В. - М.: У.П. - С. 12

Белов М.П. Основы алгоритмизации в информационных системах / М.П. Белов. - М.: Учебное пособие, 2003. - С. 25.

Д. Мигинский Аспектно — ориентированное программирование / Мигинский Д. - М.: У.П. - С. 3

Е. Милош , С. Джорупбеков Парадигмы программирования / Милош Е., Джорупбеков С. - М.: У.П. -2009

Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 67

Т.Н. Глебова, Н.А Зайцева Информатика / Глебова Т.Н., Зайцева Н.А. - М.: У.П. - 2011 — С. 18

И.Г. Головин, И.А. Волкова Языки и методы программирования / Головин И.Г., И.А. Волкова — М.: У.П. -2012 — С 8

В.Д. Бердоносов, А. А. Животова Объектно — ориентированное программирование / Бердоносов В.Д., Животова А.А — М.: У.П. - 2015 — С. 18

В.Э. Вольфенгаген Комбинаторная логика в программировании / Вольфенгаген В.Э. - М.: У.П. - 2000

D.Crockford Javascript the good parts / Crockford D. - М.: У.П. - 2012 — С.39

М.В. Голуб Ленивые вычисления в системе компьютерной алгебры / Голуб М.В. - М.: У.П. - 2014

МУСТ Модели и средства моделирования для многопроцессорных вычислительных машин — М.:У.П.-Лекция 1 — С. 2

И.С. Болдасов Исследование систем управления / Болдасов И.С. - М.: У.П. - 1998 — С. 12

М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова Основы алгоритмизации и программирования. Язык Си — С. 50

Кубенский А.А. Функцилональное программирование / А.А. Кубенский — М.: У.П. - 2010 — С. 110

НОУ ИНТУИТ Автоматное программирование — Лекция 10 — С.2

Sebastian Morr Esoteric Programming Languages

Богачёв К.Ю. Основы параллельного программирования. - М.: У.П., 2003. - С. 342

Lankford D.S. On proving term rewriting systems are Noetherian. - М.: У.П., - 1979 — С. 21

Приложение

Топ языков программирования высокого уровня 2019 г.

1JAVA1991, 2C1972, 3PYTHON1989, 4C++1980, 5VISUAL 6BASIC.NET2002, 7JAVASCRIPT1996, 8C#2000, 9PHP1995, 10SQL1974, 11OBJECTIVE-C1983, 12MATLAB1984, 13PERL, 14DELPHI/OBJECT PASCAL, 15R, 16RUBY, 17VISUAL BASIC, 18GO, 19GROOVY, 20SWIFT, 21PL/SQL, 22SAS, 23D, 24LUA, 25DART, 26FORTRAN1968, 27COBOL, 28SCRATCH, 29SCALA, 30ABAP, 31LISP, 32LOGO, 33ADA, 34TRANSACT-SQL, 35PROLOG, 36SCHEME, 37RUST, 38KOTLIN, 39HASKELL, 40LABVIEW, 41JULIA, 42TCL, 43POSTSKRIPT, 44LADDER LOGIC, 45PL/I, 46HACK, 47ERLANG, 48STANDARD ML, 49RPG, 50BASH, 51ABC, 52ActionScript, 53Alice, 54Apex, 55APL, 56Awk, 57BBC BASIC, 58BC, 59Bourne shell, 60C shell, 61CL (OS/400), 62Clojure, 63Common Lisp, 64Crystal, 65cT, 66Elixir, 67Elm, 68EXEC, 69F#, 70Forth, 71Icon, 72IDL, 73Inform, 74Io, 75J#, 76Korn 77shell, 78LiveCode, 79Maple, 80ML, 81Modula-2, 82Monkey, 83MQL4, 84MS-DOS batch, 85NATURAL, 86OpenCL, 87OpenEdge ABL, 88Oz, 89PILOT, 90PowerShell, 91Processing, 92Q, 93Ring, 94S, 95Smalltalk, 96Snap!, 97SPARK, 98Tex, 99TypeScript, 100VBScript, 101VHDL.

Таблица 1

Классификация языков программирования высокого уровня по парадигмам

Парадигмы программирования:

Процедурные языки

Логические языки

Объектно –ориентированные

Языки

Аспектно-ориентированное

LUA

Python, LUA

Визуальная (диаграммная)

MATLAB

SCRATCH

Вычисление с откатами

Декларативная

SQL

Императивная

PHP, GO, PL/SQL, SAS, D, LUA, FORTRAN, COBOL, LISP

SCRATCH

Python, Java Script(JS), PHP, Delphi, RUBY, GROOVY, SWIFT, D, LUA, DART, SCALA, ABAP, LISP, ADA

Конкатенативный

VISUAL BASIC

VISUAL BASIC

Логическая

PHP, D

SQL, SCRATCH

Visual Basic.NET(VB.NET), PHP, D, SCALA

Матричная

MATLAB, FORTRAN

Метапрограммирование

D, LUA, LISP

Python , С++, OBJECTIVE-C, RUBY, D, LUA, LISP

Мультипарадигма

PHP, D, LUA, LISP

Python, C#, PHP, OBJECTIVE-C, Delphi, R, RUBY, GROOVY, SWIFT, D, LUA, DART, SCALA, LISP, ADA

На уровне значений

COBOL, LISP

SQL, SCRATCH, LOGO

SCALA, ABAP, LISP

12На уровне функций

С, PHP, VISUAL BASIC, GO, SAS, D, LUA, FORTRAN, LISP

SQL

С++, Visual Basic.NET(VB.NET), Java Script(JS), C#, R, VISUAL BASIC, GROOVY, SWIFT, D, LUA, DART, SCALA, ABAP, LISP

13Нестрогая

SAS, LUA

SCRATCH

LUA

14Обмен сообщениями

SCRATCH

OBJECTIVE-C

15Обобщенная

GO, PL/SQL, SAS, D, FORTRAN

С++, Delphi, GROOVY, SWIFT, D, DART, SCALA, ADA

16Объектно-ориентированная

C, PHP, PERL, VISUAL BASIC, GO, PL/SQL, D, LUA, FORTRAN, COBOL, LISP

SCRATCH, LOGO

Java, Python, С++, Visual Basic.NET(VB.NET), Java Script(JS), C#, OBJECTIVE-C, Delphi, R, VISUAL BASIC, GROOVY, SWIFT, D, LUA, DART, SCALA, ABAP, LISP

Прототипная

LUA

Java Script(JS), LUA

Процедурная

С, PHP, MATLAB, PERL, VISUAL BASIC, GO, PL/SQL, SAS, D, LUA, FORTRAN, LISP

SQL, SCRATCH

С++, PHP, Delphi, RUBY, VISUAL BASIC, D, LUA, LISP

Рефлексивная

LISP

LOGO

OBJECTIVE-C, RUBY, DART, LISP

Скалярная

PHP, PERL

SCRATCH, LOGO

PHP

Стек-ориентированная

VISUAL BASIC

SCRATCH

Java, R, VISUAL BASIC

Строгая

VISUAL BASIC, GO, PL/SQL, FORTRAN, COBOL

C#, Delphi, VISUAL BASIC, SCALA, ABAP, ADA

Структурная

С, MATLAB, GO, FORTRAN, COBOL, LISP

SCRATCH, LOGO

Python, Visual Basic.NET(VB.NET), C#, Delphi, R, SCALA, ABAP, LISP, ADA

Табличная

SAS, LUA

SQL

R, LUA, ABAP

Функциональная

С, PHP, MATLAB, PERL, VISUAL BASIC, GO, SAS, D, FORTRAN, LISP

SQL, SCRATCH, LOGO

Python, С++, Visual Basic.NET(VB.NET), Java Script(JS), C#, PHP, R, RUBY, VISUAL BASIC, GROOVY, SWIFT, D, DART, SCALA, ABAP, LISP

Эзотерическая

Параллельная

GO, D, LUA, FORTRAN

SCRATCH,

Java, Python, R, RUBY, SWIFT, D, LUA, ADA

Потоковая

GO, LUA

SCRATCH, LOGO

OBJECTIVE-C, R, RUBY, LUA

Правила переписывания

SAS

OBJECTIVE-C

Хронология языков программирования.

1 Lisp 1958

2 Cobol 1959

3 Logo 1967

4 Fortrane 1968

5 prolog 1972

6 C 1972

7 SQL 1974

8 SAS 1976

9 ADA 1980

10 C++ 1980

11 OBJECTIVE-C 1983

12 MATLAB 1984

13 PYTHON 1989

14 JAVA 1991

15 PL/SQL 1992

16 R 1993

17 RUBY 1993

18 DELPHI/OBJECT PASCAL 1995

19 JAVASCRIPT 1996

20 PERL 1996

21 C# 2000

22 VISUAL BASIC.NET 2002

23 SCALA 2004

24 TRANSACT-SQL 2005

25 D 2006

26 SCRATCH 2007

27 GO 2009

28 DART 2011

29 SWIFT 2014

  1. С.З. Свердлов Языки программирования и методы трансляции / С.З. Свердлов. - М.: У. П., 2007. - С. 299

  2. А.Л. Марченко Введение в программирование / А.Л. Марченко. - М.: У. П., 2005. - С. 135

  3. А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С. 36-45

  4. А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С. 102-103

  5. Н. В. Макарова В.Б. Волков Информатика / Макарова Н.В. Волков В.Б. - М.: У.П., 2018 — С. 554-557

  6. Проект центра верификации OC Linux Теоретическое введение [http://astraver.linuxtesting.org/ ]

  7. А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С.36

  8. А.С. Камкин Введение в формальные методы верификации / Камкин А.С. - М.: У. П, 2018. - С.38

  9. Введение в теорию программирования. Функциональный подход. Вступительная лекция.[https://www.intuit.ru/studies/courses/39/39/info]

  10. С. А. Орлов Теория и практика языков программирования / Орлов С.А. - М.: У.П.,2013 — С. 189

  11. С. А. Орлов Теория и практика языков программирования / Орлов С.А. - М.: У.П.,2013 — С. 189

  12. Т. Пратт, М. Зелковец Языки программирования разработка и реализация 4е издание / Пратт Т., Зелковец М. - М.: У.П. 2002 — С. 322

  13. С. А. Орлов Теория и практика языков программирования / Орлов С.А. - М.: У.П.,2013 — С. 189

  14. Р.В. Себеста Основные концепции языков программирования / Себеста Р.В. - М.: У.П. 2001 — С. 123

  15. Т. Пратт, М. Зелковец Языки программирования разработка и реализация 4е издание / Пратт Т., Зелковец М. - М.: У.П. 2002 — С. 300 - 322

  16. А. Сериков. Основы функционального программирования / Сериков А. - М.: У.П. - Лекция 15

  17. Л. В. Городняя , Парадигмы программирования / Городняя Л. В. - М.: У.П. - С. 12

  18. Л. В. Городняя , Парадигмы программирования / Городняя Л. В. - М.: У.П. - С. 12

  19. Л. В. Городняя , Парадигмы программирования / Городняя Л. В. - М.: У.П. - С. 12

  20. Белов М.П. Основы алгоритмизации в информационных системах / М.П. Белов. - М.: Учебное пособие, 2003. - С. 25.

  21. Белов М.П. Основы алгоритмизации в информационных системах / М.П. Белов. - М.: Учебное пособие, 2003. - С. 25.

  22. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 12

  23. Д. Мигинский Аспектно — ориентированное программирование / Мигинский Д. - М.: У.П. - С. 3

  24. Е. Милош , С. Джорупбеков Парадигмы программирования / Милош Е., Джорупбеков С. - М.: У.П. -2009

  25. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 67

  26. Т.Н. Глебова, Н.А Зайцева Информатика / Глебова Т.Н., Зайцева Н.А. - М.: У.П. - 2011 — С. 18

  27. И.Г. Головин, И.А. Волкова Языки и методы программирования / Головин И.Г., И.А. Волкова — М.: У.П. -2012 — С 8

  28. В.Д. Бердоносов, А. А. Животова Объектно — ориентированное программирование / Бердоносов В.Д., Животова А.А — М.: У.П. - 2015 — С. 18

  29. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 185

  30. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 196

  31. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 196

  32. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 197

  33. В.Э. Вольфенгаген Комбинаторная логика в программировании / Вольфенгаген В.Э. - М.: У.П. - 2000

  34. В.Э. Вольфенгаген Комбинаторная логика в программировании / Вольфенгаген В.Э. - М.: У.П. - 2000 — С. 205

  35. М.В. Голуб Ленивые вычисления в системе компьютерной алгебры / Голуб М.В. - М.: У.П. - 2014

  36. МУСТ Модели и средства моделирования для многопроцессорных вычислительных машин — М.:У.П.-Лекция 1 — С. 2

  37. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 160

  38. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 193

  39. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 193

  40. D.Crockford Javascript the good parts / Crockford D. - М.: У.П. - 2012 — С.39

  41. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 156

  42. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 156

  43. И.С. Болдасов Исследование систем управления / Болдасов И.С. - М.: У.П. - 1998 — С. 12

  44. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 200

  45. Л. В. Городняя Парадигмы программирования / Городняя Л. В. - М.: У.П. - 2015 - С. 200

  46. М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова Основы алгоритмизации и программирования. Язык Си — С. 50

  47. Кубенский А.А. Функцилональное программирование / А.А. Кубенский — М.: У.П. - 2010 — С. 110

  48. Кубенский А.А. Функцилональное программирование / А.А. Кубенский — М.: У.П. - 2010 — С. 12

  49. НОУ ИНТУИТ Автоматное программирование — Лексия 10 — С.2

  50. Кубенский А.А. Функцилональное программирование / А.А. Кубенский — М.: У.П. - 2010 — С. 18

  51. Sebastian Morr Esoteric Programming Languages

  52. Sebastian Morr Esoteric Programming Languages

  53. Богачёв К.Ю. Основы параллельного программирования. - М.: У.П., 2003. - С. 342

  54. Йенсен П., Барнес Д. Потоковое программирование . - М.: У.П., 1984. - С. 3

  55. Йенсен П., Барнес Д. Потоковое программирование . - М.: У.П., 1984. - С. 3

  56. Lankford D.S. On proving term rewriting systems are Noetherian. - М.: У.П., - 1979 — С. 21