Файл: Классификация языков программирования высокого уровня (Обзор современных языков программирования).pdf
Добавлен: 27.05.2023
Просмотров: 172
Скачиваний: 4
Структурное программирование
Методология структурного программирования основана на использовании подпрограмм и независимых структур данных, объединяющих связанные между собой совокупности данных. Подпрограммы позволяют заменять в тексте программ упорядоченные блоки команд, отчего программный код становится более компактным. Структурный подход обеспечивает создание более понятных и легко читаемых программ, упрощает их тестирование и отладку. В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой).
Декларативное программирование
Декларативные (непроцедурные) языки - языки, оперирующие инструкциями данных и отношениями между ними. Алгоритм скрывается семантикой языка. Программа на декларативном языке программирования является сочетанием формализованной в рамках языка программирования задачей и всех необходимых для ее решения теорем, проще говоря, ответ на вопрос «что делать?». Декларативное программирование – термин с двумя различными значениями. Согласно первому определению, программа «декларативна», если она описывает каково нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают что должна содержать страница, а не как отображать страницу на экране. Этот подход отличается от языков императивного программирования, требующих от программиста указывать алгоритм для исполнения. В типично декларативном языке программирования XSLT, последовательность исполнения зависит, как правило, от входящего XML (в случае с использованием push-модели – «проталкивание»), в случае использования pull-модели (вытягивания), XSLT вырождается в частный случай функционального программирования и легко может быть заменена на аналогичный код в XQuery. Согласно второму определению, программа «декларативна», если она написана на исключительно функциональном, логическом или языке программирования с ограничениями. Выражение «декларативный язык» иногда употребляется для описания всех таких языков программирования как группы, чтобы подчеркнуть их отличие от императивных языков.
Функциональное программирование
Суть функционального (аппликативного) программирования определена А.П. Ершовым как «способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени функции, а единственным правилом композиции - оператор суперпозиции функций. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни, тем более, блок-схем, ни передачи управления». Ключевым понятием в функциональных языках является выражение. К ним относятся константы, структурированные объекты, функции, их тела и вызовы функций.
Функциональный язык программирования состоит из:
- совокупности базовых функций;
- классов констант, действия над которыми могут производить функции;
- предписаний, устанавливающих правила построения выражений и новых функций на основе базовых или рекурсивно через себя.
Программа, написанная на функциональном языке, напоминает определение и перечень специфических особенностей задачи и представляет собой последовательность описаний функций и выражений. Выражение вычисляется редукционным способом, т.е. сведением сложного к простому. Обращения к базовым функциям приводят к их замене соответствующими значениями. Вызовы функций, не являющихся базовыми, заменяются их телами, а их параметры фактическими аргументами. Функциональное программирование не рассматривает память как место для хранения данных, в нем используется математическое понятие переменной и функции. Переменные временно обозначаю объекты программы. Как и в математике, функции функциональных языков отображают одни объекты в другие, аргументы – в значения. Нет принципиальных различий между константами и функциями, т.е. между операциями и данными. Функция может быть результатом обращения к другой функции и может быть элементом структурированного объекта. При обращении к функции число ее аргументов не обязательно должно совпадать с числом параметров, определенных при ее описании.
Функциональные языки в какой-то мере приближаются к описанию структуры мышления человека. Первым таким языком стал LISP , созданный в 1959 г. Джоном Маккарти. Этот язык ориентирован на структуру данных в форме списка и позволяет организовать эффективную обработку больших объемов текстовой информации. Существенная черта языка – единообразие программных структур и структур данных: все выражения записываются в виде списков. Рассматривается специалистами как основной язык программирования систем искусственного интеллекта.
Логическое программирование
Концепция логического программирования базируется на понятии отношение. Логическая программа – это совокупность аксиом правил, определяющих отношения между объектами и целью. Выполнение программы представляет собой попытку доказательства логического утверждения, построенного из программы по правилам, определенным семантикой используемого языка. Результатом вычислений является вывод следствий из аксиом. Алгоритм логической программы предполагает определение и перечень специфически свойств объектов и отношений между ними, а не определение порядка выполнения отдельных шагов. Это подтверждает декларативный характер логического языка программирования. Логические программы не отличаются высоким быстродействием, так как процесс их выполнения сводится к построению прямых и обратных цепочек рассуждений разнообразными методами поиска. Программа на языке Prolog, в основу которой положена математическая модель теории исчисления предикатов, строится из последовательности фактов и правил, затем формулируется утверждение, которое Prolog будет пытаться доказать с помощью введенных правил. Пользователь только описывает структуру задачи, а внутренний механизм Prolog сам ищет решение с помощью методов поиска и сопоставления. Примеры языков: Prolog, Lisp, Oz, Mercury и др.
Объектно-ориентированное программирование
Также можно выделить языки, сочетающие подходы императивного и декларативного программирования, т. н. объектно-ориентированные языки - языки, в которых данные и функции, имеющие доступ к ним рассматриваются как один модуль. Пример: С++, Java, Python. Основой объектно-ориентированного программирования (ООП) является понятие объект. Его суть состоит в том, что объект объединяет в себе совокупность атрибутов (данных), методов их обработки и событий, на которые объект может реагировать. Другим фундаментальным понятием ООП является класс. Класс есть шаблон, на основе которого может быть создан конкретный программный объект, он описывает свойства и методы, определяющие поведение объектов этого класса. В ООП класс представляет собой абстрактный тип данных и является механизмом для создания объектов. Объявление класса есть логическая абстракция, определяющая новый тип объекта, а определение объекта как экземпляра класса создает этот объект физически, т.е. размещает объект в памяти. Выделяют следующие основные понятия объектно-ориентированного программирования:
- полиморфизм – означает свойство переопределять методы наследуемого класса и корректно их использовать в различных контекстах;
- инкапсуляция – означает свойство скрывать внутреннюю структуру класса, в которой описываются его методы и атрибуты, значения которых в промежутках между вызовами методов класса могут меняться;
- наследование – означает возможность создавать новые классы на основе существующих с наследованием всех их свойств и методов и добавлением собственных. Класс, не имеющий предшественника, называют базовым [6. C.323-331];
Примеры языков: Object Pascal, C++, Java и др.
Во многих средах объектно-ориентированного программирования используется визуальный подход к созданию программ. При этом многие стандартные операции выполняются не путем ручного программирования, а с по- мощью готовых визуальных компонентов. Их свойства и поведение настраиваются с помощью редакторов, визуально показывающих характеристики соответствующих элементов. При этом исходный текст программы генерируется автоматически.
На практике языки программирования не являются чисто процедурными, функциональными, логическими, или объектно-ориентированными. Они содержат в себе черты различных языков. Поэтому зачастую на процедурном языке можно написать функциональную или объектно-ориентированную программу. Из-за этого вместо типа языка точнее говорить о стиле (или методе) программирования. Конечно не все языки поддерживают вышеперечисленные стили в равной степени. Miranda и Haskell, например, созданные в 1985-87 гг., определяются именно как чисто функциональные (purely functional).
В [2] языки программирования высокого уровня подразделяют на:
- процедурно-ориентированные;
- проблемно-ориентированные;
- объектно-ориентированные.
К первому классу языков, который используется для записи процедур или алгоритмов обработки информации относят:
а) язык Фортран (Fortran). Является одним из первых языков программирования высокого уровня. К его основным достоинствам относится наличие огромного числа математических библиотек, поддержка работы с целыми, вещественными и комплексными числами высокой точности [3], встроенных средств обработки массивов.
К недостаткам можно отнести отсутствие средств отладки и анализа поведения программы, сложность понимания исходного кода. По сути, на данный момент Фортран является узкоспециализированным языком, применяемым для научных и инженерных вычислений.
б) язык Бейсик (Basic). Был разработан в 1964 г. в качестве языка для обучения программированию.
Основными достоинствами этого языка являются, простой синтаксис, который позволяет в кратчайшие сроки освоить этот язык программирования, простота реализации графического интерфейса, возможность использования WinAPI функций, что значительно расширяет возможности языка.
Одним из основных недостатков языка является то, что он поддерживает только операционные системы семейства Windows, DOS и Mac OS X, что значительно сужает сферы его применения. Также к недостаткам можно отнести низкую скорость работы и отсутствие механизма наследования реализации объектов.
в) язык Си (С) был создан в 1969–1973 годах в качестве языка системного программирования и первоначально предназначался для написания ОС UNIX [4,6]. В 1980-е гг. язык С был дополнен инструментами объектно-ориентированного программирования и на основе него был создан язык C++.
Одним из главных достоинств является кроссплатформенность, а также минимальные аппаратные требования для запуска скомпилированных программ, широкий набор средств для реализации как прикладных, так и системных задач.
К недостаткам языка можно отнести отсутствие четкой стандартизации. В ходе исторического развития языка его элементы зачастую заимствовались из других языков, вне зависимости от наличия других элементов. Это привело к наличию дублирующих и иногда противоречащих друг другу элементов. Данные аспекты привели к тому, что язык стал чрезвычайно сложным для восприятия.
г) язык Паскаль (Pascal). Был создан математиком Н. Виртом специально для обучения программированию. Однако со временем стал широко применяться для разработки программных средств в профессиональном программировании.
Самая первая версия была создана в 1968 году профессором кафедры вычислительной техники Швейцарского федерального института технологии Никласом Виртом [3]. Основной целью, при создании нового языка, является его простота, с сохранением всех достоинств уже имеющихся языков высокого уровня программирования.
Популярность созданного языка стала столь высокой, что уже к 1980 году насчитывалось более восьми десятков его трансляторов. В начале 80-х годов язык программирования Паскаль еще более усилил свои позиции после создания трансляторов Turbo-Pascal для персональных компьютеров. С этого момента язык смело вышел за рамки узкого использования программистами-профессионалами. Он начал использоваться как рабочий инструмент пользователей и как средство обучения языков программирования.
Одним из главных достоинств языка Паскаль является четкая структуризация, удобная среда разработки и отладки, позволяющая пользователю обнаружить логические и синтаксические ошибки в программе. Также к достоинствам можно отнести высокую скорость компиляции программ, возможность использования вставок языка Ассемблер.
В отличие от языка С (С++) в при использовании Паскаль сведены к минимуму возможные синтаксические неоднозначности [1,2], синтаксис языка является интуитивно понятным и доступным, поскольку, как уже было отмечено выше, язык изначально разрабатывался для обучения студентов программированию.
К недостаткам первоначально разработанного компилятора можно бы отнести ряд ограничений: невозможность передачи функциям массивов переменной длины, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций написанных на других языках и раздельной компиляции.
Несмотря на долгую историю, Паскаль является динамично развивающимся языком программирования высокого уровня. Современные версии компилятора ликвидировали большинство перечисленных выше недостатков.
Рассмотрим особенности языков другого класса. Основным достоинством проблемно-ориентированных языков программирования является минимизация трудозатрат программиста при решении задач принадлежащих некоторому четко выделяемому классу [3]. К проблемно-ориентированным относят следующие языки программирования:
а) язык Лисп. Считается вторым после Фортрана старейшим высокоуровневым языком программирования. Данный язык наиболее часто применяется при разработке экспертных систем и систем аналитических вычислений. Существуют современные версии этого языка, которые активно применяются при разработке новейших web-технологий. Также модификации данного языка используются в качестве встроенных языков программирования в САПР. Примером может послужить AutoLISP – язык для разработки надстроек в продуктах компании AutoDesk.