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

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

Содержание:

ВВЕДЕНИЕ

Сегодня термин «информатика» принято употреблять в двух смыслах:

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

Одним из направлений информатики как науки является программирование – наука, которая изучает теорию и методы разработки, производства и эксплуатации программного обеспечения ЭВМ.

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

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

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

Объект исследования данной работы – языки программирования.

Предмет исследования –языки программирования высокого уровня.

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

Для достижения поставленной цели предстоит решить ряд задач:

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

В качестве опорных источников при написании работы были использованы следующие: А.Ф. Новиков – «Учебно-методическое пособие по дисциплине «Технологические подходы к разработке программного обеспечения»» и В.В. Ммухортов – «Объектно-ориентированное программирование, анализ и дизайн»

1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ

На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:

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

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

Обычно под программированием понимается процесс разработки программ. Однако к этому же термину относятся и некоторые виды человеческой деятельности. Например, «политическое программирование» – термин, который часто используется в средствах массовой информации, или «математическое программирование» – специальный раздел математики. Применимо к созданию программ обычно используется выражение «разработка программного обеспечения» [14].

Таким образом, программированием (computer programming) называется процесс создания человеком-программистом информационной структуры - программы, целью которой является исполнение на компьютере.

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

Таким образом, в процессе программирования выделяются следующие элементы:

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

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

Нельзя отрицать существование проблем в области программирования. Лучшие программисты, ведущие предприятия и компьютерное сообщество в целом постоянно тратят значительные и все возрастающие усилия на решение этих проблем. Результатом этой деятельности стало создание нескольких специализированных отраслей науки. Дисциплина, главной задачей которой является решение внутренних проблем программирования, называется технологией программирования, или инженерии программных систем. Последний термин является точным переводом английского термина «software engineering».

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

Ключевым словом в данном определении является «производственный», так как оно отражает главную особенность технологии программирования. Например, с точки зрения информатики (computer science), указание на производственный характер дисциплины отсутствует [15].

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

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

Соотношение информатики и технологии программирования является сложным вопросом. Информатика представляет собой более общее понятие, однако нельзя считать технологию программирования отдельной частью информатики. В настоящее время вопросы теоретического характера относят к информатике, а практические приемы решения задач считаются элементами технологии программирования. Например, методы математического доказательства правильности программ относятся к теоретической информатике, а методы тестирования – к технологии программирования, хотя это совершенно разные методы решения одной задачи. Важно отметить, что такое отделение технологии программирования от информатики является условным [8].

1.1. Первое поколение

Первые языки программирования были очень сложны. Схема их развития отражена в таблице 1.

Таблица 1 – Первые языки программирования

Поколение

Язык

Характеристики

Первое (1954-1958)

FORTRAN I

Математические формулы

ALGOL-58

Flowmatic

IPL V

Второе (1959-1961)

FORTRAN II

Подпрограммы, раздельная компиляция

ALGOL-60

Блочные структуры, типы данных

COBOL

Описание данных, работа с файлами

Lisp

Обработка списков, указатели, сборка мусора

Третье (1962-1970)

PL/1

FORTRAN+ALGOL+COBOL

ALGOL-68

Более простые преемники ALGOL-60

Pascal

Simula

Классы, абстрактные данные

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

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

К характерным чертах этих машин относятся:

  • малое количество оперативной памяти;
  • несовершенство системы ввода-вывода данных.

Эти ограничения и высокая стоимость машин позволяли работать на них только высококвалифицированным специалистам, которые были способны создавать программы на уровне двоичных кодов. Для облегчения процесса программирования вскоре были созданы языки первого поколения. Их задачей было приблизить программирование к предметной области, отдаляя тем самым от конкретной ЭВМ. Словарь таких языков по большей части состоял из математических функций. Топология языков первого и второго поколений представлена на рисунке 1 [13].

Рисунок 1 – Топология языков программирования первого и начала второго поколений

1.2. Второе поколение

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

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

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

Топология языков конца второго и начала третьего поколений, поддерживающих использование подпрограмм, представлена на рисунке 2 [13].

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

1.3. Третье поколение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Однако есть и недостатки:

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

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

Основные характеристики модулей:

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

Принцип информационной закрытости является одним из основных принципов разработки модулей. Согласно этому принципу содержание модулей должно быть скрыто друг от друга. Модуль определяется и проектируется таким образом, чтобы его содержимое (данные и функции) были недоступны тем модулям(клиентам), которые не нуждаются в такой информации. Такой принцип характеризует рисунок 7.

Модуль

Рисунок 7 – Информационная закрытость модуля

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

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

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

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

  • функциональная связность – вместе отдельные части модуля реализуют одну проблемную задачу (операцию). Например, к ним можно отнести вычисление тангенса угла, проверку орфографии, расчет заработной платы сотрудника и т.п. Модуль исполняет только ту функцию, для которой он предназначен. Поэтому важно понимать, что модуль вычисления тангенса не должен печатать его значение;
  • информационная связность - выходные данные одной части модуля применяются в качестве входных данных другой его части. Порядок выполнения действий при этом четко определен и подобен конвейеру;
  • коммуникативная связность - в данном случае отдельные части модуля связаны по данным. Это говорит о том, что они работают с одним и тем же типом структуры данных, порядок действий при этом совершенно безразличен;
  • процедурная связность - этот тип связности относится к ситуации, в которой отдельные части модуля связаны между собой порядком выполняемых ими действий, реализующих некоторый сценарий поведения. Зависимость по данным между отдельными частями модуля при этом отсутствует;
  • временная связность - различные части модуля не связаны между собой ни по данным, ни по порядку выполнения, но необходимы в один и тот же период работы системы;
  • логическая связность - в данной ситуации отдельные части модуля объединяются по принципу функционального подобия. Например, модуль включает в себя различные функции обработки ошибок. К серьёзным недостаткам таких модулей относится сложное сопряжение с другими модулями, а также большая вероятность внесения ошибок в случае внесения изменений;
  • связность по совпадению – характеризует ситуацию, при которой в модуле отсутствуют явно выраженные внутренние связи вообще.

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

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

Фундаментом модульного программирования являются следующие принципы:

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

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

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

Основой подхода служит функционально-модульная схема алгоритма всего приложения, которая получается в результате детализации алгоритма (см. рисунок 8).

Функция 1

Функция 2

Модуль 1

Функция 3

Модуль V

Функция 4

Модуль P

Функция 5

Модуль M

Модуль 2

Модуль 3

Модуль K

Модуль N

Модуль P

Модуль Q

Рисунок 8 – Функционально-модульная схема алгоритма

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

2.3. Объектно-ориентированное программирование

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

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

Можно выделить три основные причины, благодаря которым объектно-ориентированная технология получила массовое признание и широкую популярность:

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

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

Место объектно-ориентированной технологии в рамках всех парадигм программирования изображено на рисунке 9.

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ

ПРОЦЕДУРНОЕ ПРОГРАММИРОВАНИЕ

ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ

ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ

АССЕМБЛИРОВАНИЕ

МАШИННОЕ КОДИРОВАНИЕ

Рисунок 9 – Эволюция парадигм программирования

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

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

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

  • объект – некоторое явление или предмет, обладающий четко определяемым поведением. Объект характеризуется состоянием, поведением и индивидуальностью. Поведение и структура похожих объектов определяют для них общий класс. Другое название объекта – экземпляр класса. Состояние объекта определяется при помощи различных свойств этого объекта. Поведение характеризует воздействие объекта на другие объекты и наоборот относительно изменения состояния этих объектов и передачи сообщений. Индивидуальностью называется свойство объекта, которое отличает его на множестве всех остальных объектов;
  • класс – множество объектов, обладающих общей структурой и поведением.

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

  • абстрагирование – представляет собой определение отличительных характеристик некоторого объекта. Данные характеристики определяют концептуальные границы объекта с точки зрения стороннего наблюдателя. За счет абстракции концентрируется внимание на внешнем представлении объекта, отделяя особенности поведения от их реализации. Другое название принципа абстрагирования – принцип минимальных обязательств, согласно которого интерфейс объекта должен реализовывать только существенные моменты его поведения. Наряду с данным принципом рассматривается еще один принцип – наименьшего удивления, согласно которому абстракция должна полностью описывать поведение объекта, не порождая сюрпризов и побочных эффектов, выходящих за пределы абстракции;
  • инкапсуляция – представляет собой процесс выделения отдельных элементов объекта, которые отвечают за его поведение и устройство. Инкапсуляция предназначена для изоляции контрактных обязательств, полученных на уровне абстракции, от их реализации. Инкапсуляция и абстракция дополняют друг друга. Центром абстракции является поведение объекта, в то время как в центре инкапсуляции расположена реализация данного поведения. В большинстве случаев инкапсуляция реализуется при помощи сокрытия информации – всех несущественных элементов объекта. Допускается скрывать не только структуру объекта, но и реализацию его поведения;
  • полиморфизм – обозначение различных действий одним и тем же именем и свойство объекта обрабатывать посылаемые ему запросы согласно установленных типов. Благодаря данному принципу появляется возможность отказаться от операторов выбора, при этом связь метода и имени будет определяться только в ходе исполнения программы;
  • наследование – принцип, благодаря которому можно создавать новые типы данных на основе уже имеющихся таким образом, что все данные и методы являются членами наследуемых классов.

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

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

Кроме четырех базовых принципов ООП есть еще и несколько дополнительных:

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

Данные принципы являются важными, но не обязательными.

Алан Кей, создатель первого объектно-ориентированного языка программирования Smalltalk выделял несколько ключевых положений в определении ООП:

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

ЗАКЛЮЧЕНИЕ

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

Первая глава работы носит теоретический характер, описывая эволюцию языков программирования.

На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:

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

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

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

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

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

Дальнейшим развитием модулей стало появление объектно-ориентированной технологии.

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

  • функциональные;
  • модульные;
  • объектно-ориентированные.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Берг О.Ю. Метрики оценки качества программного обеспечения // Труды международного симпозиума надежность и качество. - Пенза: Пензенский государственный университет, 2005. - Т.1. - С. 321-322.
  2. Благодатских В.А. Стандартизация разработки программных средств / Благодатских В.А., Волнин В.А., Поскакалов К.Ф. - М.: Финансы и статистика, 2005. - 288 с.
  3. Валова О.В. Программная инженерия. - Чита: Читинский гос. ун-т, 2009. - 175 с.
  4. Захарова А.А. Информатика и программирование: программные средства реализации информационных процессов / А.А. Захарова, Е.В. Молнина, Т.Ю. Черныева. – Томск: Изд-во ТПУ, 2013. – 318 с.
  5. Звездин С.В. Проблемы измерения качества программного кода // Вестник Южно-Уральского государственного университета. Серия: Компьютерные технологии, управление, радиоэлектроника. - 2010. - № 2. - С. 62-66.
  6. Иванова Г.С. Технология программирования. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2014. – 56 с.
  7. Кознов Д.В. Введение в программную инженерию. - М.: Национальный открытый университет «Интуит», 2016. - 307 с.
  8. Константайн Л., Локвуд Л. Разработка программного обеспечения. - СПб: Питер, 2004. - 592 с.
  9. Липаев В.В. Качество программных средств. - М.: Янус-К, 2002. - 400 с.
  10. Макарова Н.В. Основы программирования. - М.: КНОРУС, 2016. - 454 с.
  11. Мухортов В.В. Объектно-ориентированное программирование, анализ и дизайн / В.В. Мухортов, В.Ю. Рылов. – Новосибирск: Изд-во ООО «Новософт», 2012. – 108 с.
  12. Назаров С.В., Белоусова С.Н., Бессонова И.А., Гиляревский Р.С., Гудыно Л.П. Введение в программные системы и их разработку. - М.: Интернет-Университет Информационных Технологий (ИНТУИТ), 2012. - 456 с.
  13. Назаров С.В. Архитектуры и проектирование программных систем. - М.: ИНФРА-М, 2013. - 413 с.
  14. Новиков Ф.А. Технологические подходы к разработке программного обеспечения. – СПб.: Изд-во ИТМО, 2014. -137 с.
  15. Соловьев С.В. Технология разработки прикладного программного обеспечения / С.В. Соловьев, Л.С. Гринкруг, Р.И. Цой. – М.: БИНОМ, 2012. – 321 с.
  16. Степович-Цветкова Г.С. Стандарты качества компьютерных программ // Наука сегодня. Сборник научных трудов по материалам VII международной научно-практической конференции: в 4 частях. Научный центр «Диспут». - Вологда: ООО «Маркер», 2015. - С. 96-97.