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

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

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

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

Добавлен: 06.04.2023

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

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

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

Изначально языки программирования не обладали достаточно развитыми механизмами защиты данных одного модуля от использования их процедурами другого. Чаще всего решение данного вопроса ложилось на плечи самих разработчиков.

Наиболее ярким представителем языков третьего поколения является ALGOL-68 – универсальный язык программирования, в котором были реализованы практически все существующие к тому времени механизмы. Данный язык позволял создавать системы корпоративного масштаба для больших ЭВМ. Однако, он был достаточно сложен для первоначального обучения[18].

Распространение малых ЭВМ позволило обрести популярность потомкам языка ALGOL-60. Так, например, язык программирования Pascal, до сих пор является наиболее популярным в учебной среде, а созданный во второй половине 70-х годов язык C, завоевал популярность среди профессиональных программистов.

Основной задачей создания Pascal являлась именно задача обучения структурному программированию, а цель разработки языка C – написание операционной системы Unix.

Одним из потомков языка Pascal, ориентированным на профессиональную разработку, стал язык Ada, обладающий встроенной поддержкой модульности и абстрактных типов данных. Язык C, характеризующийся гибким лаконичным синтаксисом и простой алгоритмической структурой, стал популярным как в системном, так и прикладном программировании.

Топология языков программирования конца третьего поколенеия представлена на рисунке 3[19].

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

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

Рисунок 3 – Топология языков программирования конца третьего поколения

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


Таким образом любая программа, написанная на объектном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу) и имеет интерфейс в виде набора методов для взаимодействия друг с другом[21].

В терминах ООП объектом называется нечто, обладающее четкими границами. Объект обладает рядом свойств:

  • состоянием, поведение и идентичность;
  • структура и поведение схожих объектов определяет общий для них класс;
  • термин «объект» синонимичен термину «экземпляр класса».

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

Топология языков объектно-ориентированного программирования представлена на рисунке 4[22].

Рисунок 4 – Топология объектно-ориентированных языков программирования

2. КЛАССИФИКАЦИЯ

2.1. Структурное программирование

Структурное программирование является первым направлением, которое оформилось в виде парадигмы. Предпосылкой этого был тот факт, что Э. Дейкстра выявил обратную зависимость между числом неограниченных операторов перехода go to и качеством программы. Качество программы в данном случае определялось двумя показателями – скоростью отладки и степенью надежности. Так появилась парадигма структурного программирования, которое многие имеют просто как «программирование без go to»[23].

В основе данной технологии лежит простой факт, гласящий о том, что любая структура управления может быть функционально эквивалентно выражена суперпозицией последовательного выполнения, ветвления по условию и цикла с предусловием (см. рисунок 5)[24].

Рисунок 5 – Базовые структуры управления

Характерной чертой всех базовых структур является свойство – «один вход – один выход», которое сохраняется при суперпозиции двух базовых структур. Можно сделать вывод, что любая суперпозиция обладает свойством «один вход – один выход», следовательно, и любая структура обладает данным свойством. Наличие этого свойства позволяет легко устанавливать соответствие между статическим текстом программы и динамическим протоколом ее выполнения. Для линейных программ взаимно-однозначное соответствие очевидно; для линейно ветвящихся программ очевидно однозначное соответствие из текста в протокол, для циклических программ соответствие устанавливается, если добавить к естественной координате в тексте (от начала к концу) еще по одной целочисленной координате (обычно называемой счетчиком цикла) для каждого уровня вложенности циклов. Таким образом, программирование без использования оператора go to разрешает существующее противоречие между статикой и динамикой[25].


Иерархическая структура вложенности позволяет последовательно развертывать структуру вложенности, обеспечивая, таким образом, деление крупной задачи на ряд подзадач. За счет этого на каждом последующем шаге ограничивается комбинаторная сложность алгоритма. Данный подход называется программированием методом пошагового уточнения[26].

Все существующие сегодня системы, так или иначе, используют понятие модуля. В различных языках программирования модули могут называться и определяться по-разному: функция, процедура, подпрограмма, класс, компонента и т.д. Важно понимать, что модульность реализует средство преодоления количественных ограничений. Модульная структура программы допускает вложение модулей, а также существование ссылок между модулями (или то и другое), поэтому каждый отдельно взятый модуль может быть сделан обозримым для программиста. Таким образом, модульное программирование представляет собой непосредственную реализацию принципа «разделяй и властвуй» в области программировании.

Модули служат для хранения готовых программ. Фактически, модуль не является программой. К характерным чертам модуля относятся:

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

В состав любого модуля входит две части:

  • спецификация – набор правил по использованию модуля;
  • тело – реализация процесса обработки данных.

При работе с модулями важно учитывать следующие правила:

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

Кроме разбиения программного текста на модули различные системы программирования также предоставляют дополнительные функции:

  • уменьшение объема кода;
  • ограничение областей действия переменных;
  • инкрементальная компиляция;
  • раннее (статическое) и позднее (динамическое) связывание;
  • инкапсуляция данных и пр.[28]

Обобщающее название модульного программирования бз использования оператора go to методом пошагового уточнения - программирование сверху вниз (Top-down approach). Данный термин более четко акцентирует внимание на сути описанного подхода: разработка и кодирование программы представляют собой две неразрывно связанные фазы одного процесса. Важно понимать, что этап проектирования первичен, а этап реализации вторичен. Процесс программирования сверху вниз говорит о том, что исходная задача разбивается на более мелкие подзадачи до тех пор, пока каждая из этих подзадач не станет до такой степени простой, что ее реализация становится очевидной[29].

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

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

Еще один вид программирования – программирование вширь. Данный термин был введен С.С. Лавровым. Суть данного метода заключается в том, что начиная с самого первого шага, создается и на всех последующих шагах поддерживается работоспособная версия будущей программы. Естественно, на первом этапе работы программа не способна выполнять требуемых от нее функций, однако при этом она не содержит лишних модулей и уже способна удовлетворять требованию демонстрируемости (см. рисунок 6)[31].

Рисунок 6 – Методологии программирования

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


Важно отметить, что свойство структурности программы не предопределяется системой программирования – оно вносится самим программистом. Любая программа в любой системе программирования может быть написано структурно, а может и не структурно (например, с использованием оператора безусловного перехода go to)[33].

2.2. Модульное программирование

Модульное программирование на сегодняшний день является одним из основных способов разработки программного обеспечения, проектирующееся из нескольких частично независимых друг от друга частей – модулей. В процессе разработки программных продуктов, принцип модульности является основополагающим[34].

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

Основным принципом модульности является тот факт, согласно которому любое программное средство может быть разделено на самостоятельные единицы - модули. Таким образом обычно модульный подход упрощает задачи проектирования и распределения процесса разработки. Разбивая большой программный продукт на отдельные модули, мы видим, что каждый модуль имеет собственное описание, отражающее его назначение и функциональные возможности, а также связи с другими модулями[35].

Разработку и структуризацию программы в виде комплекса отдельных независимых блоков - модулей, поведение и структура которых подчиняются определенным установленным правилам, принято называть модульным программированием. Также упростить процесс тестирования программы позволяет применение модульного программирования. А улучшить мобильность разрабатываемых программ позволяют аппаратно-зависимые подзадачи, которые отделяются от других задач и дают возможность повторного использования готовых модулей в других проектах[36].

Главные достоинства модульного программирования:

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