Файл: «Классификация языков программирования высокого уровня» _.pdf
Добавлен: 17.06.2023
Просмотров: 159
Скачиваний: 2
СОДЕРЖАНИЕ
1. ПОНЯТИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
1.1. Понятие языка программирования. Эволюция развития языков программирования
1.2. Общие особенности языков программирования высокого уровня
2. ВИДЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
2.1. Процедурные языки программирования
2.2. Непроцедурные языки программирования
2.3. Классификация языков программирования высокого уровня по уровню специализации
3. ХАРАКТЕРИСТИКА НЕПРОЦЕДУРНЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
3.1. Функциональные языки программирования
3.2. Логические языки программирования
Еще одно достоинство декларативных языков - пригодность для формальных рассуждений, которые, в частности, могли бы поднять методы обеспечения надежности и безошибочности в программировании на новый уровень (известно, что тестирование может помочь обнаружить ошибки в программах, но не может гарантировать их отсутствия). К сожалению, существующие методы формального анализа программ чрезвычайно трудоемки. Много усилий было направлено на создание более простых и строгих языков, а также совершенствование методов анализа, но результаты не обнадеживают [12, с.336].
Декларативная программа обладает также следующим преимуществом. Она может быть подвергнута логическому анализу в своих собственных понятиях, для чего не требуется привлечение дополнительных формализмов, таких как предикаты на состояниях. Более того, возникает возможность создания инструментальных средств, позволяющих автоматизировать процессы анализа, преобразования и синтеза программ. Появление таких средств может в корне изменить программирование. При программировании на традиционном (императивном) языке у программиста нет иного выбора, кроме как вникать в низкоуровневые подробности выполнения программ. В декларативных языках логика и управление отделены друг от друга. Декларативную программу проще написать и, что немаловажно, проще понять, чем эквивалентную императивную программу. Помимо этого возникает возможность переложить ответственность за реализацию порядка выполнения операций на компьютер. Более того, становится возможным использовать нетривиальные алгоритмы планирования вычислений, такие как недетерминированные, «ленивые» и параллельные подходы [7, с.94].
На начальном этапе развития декларативным языкам программирования было сложно конкурировать с императивными в силу объективных трудностей при создании эффективной реализации трансляторов. Программы работали медленнее, однако, они могли решать с меньшими трудозатратами более абстрактные задачи. В частности, язык SML был разработан как средство доказательства теорем [21].
Наиболее распространённым декларативным языком является язык Prolog. Основными областями его применения являются экспертные системы, системы обработки текста на естественных языках и системы управления реляционными базами данных. Различные диалекты языка LISP, возникли потому, что ядро и идеология этого языка оказались весьма эффективными при реализации символьной обработки (анализе текстов). Другой характерный пример декларативных языков программирования - Haskell [14].
Наиболее существенными классами декларативных языков являются функциональные, называемые также аппликативными, и логические, они будут подробно рассмотрены в главе 3.
Важным шагом на пути к совершенствованию языков программирования стало появление в 1970-х гг. объектно-ориентированного подхода к программированию и соответствующего класса языков. Наиболее ранними объектно-ориентированными языками программирования стали Simula 67 и Smalltalk; примерами более поздних объектно-ориентированных языков программирования являются C++, С#, Java и др. В основе этих языков лежит понятие объекта, сочетающего в себе данные и действия над ними. Описание действительности в форме системы взаимодействующих объектов естественнее, чем в форме взаимодействующих процедур [19]. Данный вид программирования также будет рассмотрен в главе 3.
Здесь же необходимо отметить, что, по своей сущности, большинство ныне существующих языков являются комбинированными либо смешанными. Справедливо отмечается, что на практике языки программирования не являются чисто процедурными, функциональными или логическими, а содержат в себе черты языков различных типов. С точки зрения практики, это приводит к тому, что на процедурном языке можно написать функциональную программу либо ее часть и наоборот. Все это связано с тем, что большинство языков высокого уровня учитывают разные стили и методы программирования [1, с.33].
Отметим, что в функциональном программировании высший приоритет отдается понятию функции и предполагает жесткое структурирование данных (последовательность последовательностей), что создает сложности для представления привычных для программистов данных в виде массивов, записей и тому подобных структур данных. В свою очередь, логическое программирование акцентирует внимание на средствах логики. Но эти средства ограничены возможностями чисто декларативных логик. В результате была сделана попытка объединения логического программирования с функциональным. Примером такого подхода является создание языка Логлисп, который реализует парадигму логического программирования в рамках языка Лисп [5, с.171].
2.3. Классификация языков программирования высокого уровня по уровню специализации
С расширением областей применения вычислительной техники возникла необходимость формализовать представление постановки и решение новых классов задач. Необходимо было создать такие языки программирования, которые, используя в данной области обозначения и терминологию, позволили бы описывать требуемые алгоритмы решения для поставленных задач, ими стали проблемно – ориентированные (специализированные) языки [2, с.98].
Проблемно-ориентированные (или предметно-ориентированные) языки программирования (англ. DSL - Domain Specific Language) подразумевают, что в языке наряду с универсальными управляющими конструкциями и типами данных присутствуют встроенные средства для описания понятий, характерных для конкретной предметной области, для решения задач которой предназначается данный язык. Предметно-ориентированные языки программирования используются в различных сферах — атомной энергетике, космических исследованиях, радиотехнике и пр.
Проблемных языков очень много, например: Фортран, Алгол – языки, созданные для решения математических задач; Simula, Слэнг - для моделирования; Лисп, Снобол – для работы со списочными структурами [2, с.99].
Весьма популярны встроенные проблемно-ориентированные языки в мощных информационных системах. Яркий пример - системы автоматизации управления предприятием, в которых поддерживаются такие понятия, как документ, бухгалтерский счет, проводка и пр. Встроенный язык программирования системы SAP/R3 называется ABAP, язык белорусской системы «Галактика» - VIP, есть свой язык в известном в нашей стране пакете 1C. Система автоматизации проектирования AutoCAD позволяет писать дополнительные приложения на специально адаптированной версии языка программирования Лисп - AutoLiSP. В системе управления базами данных Oracle для написания программ применяется язык PL/SQL. Все это позволяет значительно быстрее и удобнее создавать прикладные программы и повысить качество разработки [13, с.43].
Универсальные языки были созданы для широкого круга задач: коммерческих, научных, моделирования и т.д. Первый универсальный язык был разработан фирмой IBM, ставший в последовательности языков Пл/1. Второй по мощности универсальный язык называется Алгол-68. Он позволяет работать с символами, разрядами, числами с фиксированной и плавающей запятой. Пл/1 имеет развитую систему операторов для управления форматами, для работы с полями переменной длины, с данными организованными в сложные структуры, и для эффективного использования каналов связи. Язык учитывает включенные во многие машины возможности прерывания и имеет соответствующие операторы. Предусмотрена возможность параллельного выполнение участков программ. Программы в Пл/1 компилируются с помощью автоматических процедур. Язык использует многие свойства Фортрана, Алгола, Кобола [2, с.9101].
Здесь отметим, что языки четвёртого поколения – это именно языки программирования, разработанные для специализированных областей применения, где хороших результатов можно добиться, используя не универсальные, а проблемно-ориентированные языки, оперирующие конкретными понятиями узкой предметной области. Все языки программирования четвёртого поколения разработаны для снижения временных затрат на разработку программ. К четвёртому поколению обычно относят: языки запросов к базам данных (SQL, Informix-4GL и т.д.), языки обработки данных (Visual DataFlex, FoxPro, XBase++ и т.д.), а также средства генерации программного кода на языках третьего поколения, встраиваемые в системы программирования [13, с.44].
Таким образом, мы рассмотрели процедурные (императивные) и непроцедурные языки программирования. Основными понятиями языков первой группы являются «оператор» и «данные». При процедурном подходе операторы объединяются в процедуры. Принципиально иные направления в программировании относятся к непроцедурным парадигмам. К ним можно отнести объектно-ориентированное и декларативное программирование.
Декларативный подход к программированию означает, что программисту необходимо лишь выполнить постановку задачи некоторым формальным образом, задав существующие ограничения. Наиболее существенными классами декларативных языков являются функциональные, называемые также аппликативными, и логические. В основе объектно-ориентированных языков лежит понятие объекта, сочетающего в себе данные и действия над ними.
Также языки программирования принято делить на проблемно–ориентированные (специализированные) и универсальные языки.
3. ХАРАКТЕРИСТИКА НЕПРОЦЕДУРНЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
3.1. Функциональные языки программирования
Одним из путей развития декларативного стиля программирования стал функциональный подход, возникший с появлением и развитием языка LISP. На практике наибольшее распространение получили и два его диалекта: Common Lisp и Scheme [3, с.14].
LISP (LISt Processing) – язык программирования высокого уровня, разработанный в 1960 году Джоном Маккарти и предназначенный для манипулирования перечнями элементов данных. Использовался в университетских лабораториях США для решения задач, связанных с искусственным интеллектом. Основной структурой данных языка функционального программирования Lisp являются связные списки, элементами которых могут быть либо идентификаторы и числовые константы, либо другие связные списки. Областью применения этого языка являются системы искусственного интеллекта.
Другими известными языками функционального программирования являются ML, Miranda, Erlang и Haskell и др. Время появления отдельных функциональных языков показано на рис.5.
Рисунок 5 – Функциональные языки программирования [20]
В языках функционального программирования вычисления в основном производятся путём применения функций к заданному набору данных. Таким образом, любая программа, написанная на таком языке, может интерпретироваться как функция с одним или несколькими аргументами. Такой подход дает возможность прозрачного моделирования текста программ математическими средствами, а, значит, весьма интересен с теоретической точки зрения.
Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. Наличие стройной математической основы обеспечивает возможность использования алгебраических методов создания структуры, преобразования и исследования программ. Это в какой-то мере приближает их к описанию структуры мышления человека [21].
Сложные программы при таком подходе строятся посредством агрегирования функций. Разработка программы заключается в создании из простых функций более сложных, которые последовательно применяются к начальным данным до тех пор, пока не получится конечный результат. При этом текст программы представляет собой функцию, некоторые аргументы которой можно также рассматривать как функции. Таким образом, повторное использование кода сводится к вызову ранее описанной функции, структура которой, в отличие от процедуры императивного языка, прозрачна математически [21].
Более того, типы отдельных функций, используемых в функциональных языках, могут быть переменными. Таким образом обеспечивается возможность обработки разнородных данных (например, упорядочение элементов списка по возрастанию для целых чисел, отдельных символов и строк) или полиморфизм [3, с.27].