Диаграмма размещения (Deployment Diagram)

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

Модульное программирование Мо́дульное программи́рование — это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определённым правилам.[1] Использование модульного программирования позволяет упростить тестирование программы и обнаружение ошибок. Аппаратно-зависимые подзадачи могут быть строго отделены от других подзадач, что улучшает мобильность создаваемых программ. Мо́дуль — функционально законченный фрагмент программы. Во многих языках (но далеко не обязательно) оформляется в виде отдельного файла с исходным кодом или поименованной непрерывной её части. Некоторые языки предусматривают объединение модулей в пакеты.   Глава 9. Модульное программирование Архитектура ЭВМ тесно связана со способами выполнения программ на компьютере, поэтому сейчас необходимо перейти к изучению большого раздела под названием "Введение в системы про- граммирования" (само это понятие будет изучено в следующей главе). Будет рассмотрен весь путь, который проходит новая программа – от написания текста на некотором языке программирования, до этапа счета этой программы. Первая тема в этом разделе называется "Модульное программирова- ние". Модульное программирование является особым способом разработки программы, которая стро- ится при этом из нескольких относительно независимых друг от друга частей – модулей. Понятие модуля является одним из центральных при разработке программного обеспечения, и сейчас будет начато изучение этого понятия. Известно, что при разработке программ в основном используется метод, который называется "программирование сверху-вниз" или "пошаговая детализация". Суть этого метода совсем проста: исходная задача сначала разбивается на достаточно большие относительно независимые друг от дру- га подзадачи. В том случае, когда полученные подзадачи достаточно просты, то для каждой из них разрабатывается соответствующий алгоритм, иначе каждая такая все ещѐ сложная подзадача снова разбивается на более простые и т.д. Далее приступают к реализации каждой из полученных таким образом относительно простых подзадач на некотором языке программирования, и каждая такая реализация подзадачи и называется чаще всего (программным) модулем. Таким образом, использо- вание модулей является естественным способом разработки и построения сложных программ. Заме- тим, что и сам программный модуль допускает дальнейшую пошаговую детализацию, однако полу- ченные подзадачи реализуются уже в виде процедур и функций. Таким образом, процедуры и функ- ции являются инструментом пошаговой детализации при разработке программ на нижнем, более де- тальном уровне, а модули – на верхнем. Модули задачи могут писаться как на одном языке программирования, так и на разных языках, в этом случае говорят, что используется многоязыковая система программирования. Что такое система программирования, как уже говорилось, более строго определено несколько позже, а пока изучим общее понятие модульного программирования и программного модуля. Вам уже известно одно из полезных свойств программы, отдельные части (модули) которой на- писаны на разных языках программирования – это позволяет нам из программ на языках высокого уровня вызывать процедуры на Ассемблере (и, вообще говоря, наоборот). Далее в этой книге, одна- ко, будем знакомиться со свойствами модульной программы, написанной целиком на одном языке программирования (в нашем случае на Ассемблере). Перечислим сначала те преимущества, которые предоставляет модульное программирование. Во-первых, как уже отмечалось, это возможность писать модули на разных языках программирова- ния. Во-вторых, модуль является естественной единицей локализации имен: как уже говорилось, внутри модуля на Ассемблере все имена должны быть различны (уникальны),1 что не очень удобно, особенно когда модуль большой по объему или совместно пишется разными программистами. А вот в разных модулях Ассемблера имена могут совпадать, так как имена, как и в блоках программы на языке Паскаль, локализованы в модуле на Ассемблере и не видны из другого модуля, если только это не указано явно с помощью специальных директив. Следующим преимуществом модульного программирования является локализация места ошиб- ки: обычно исправление ошибки внутри одного модуля не влечет за собой исправление других мо- дулей (разумеется, это свойство будет выполняться только при хорошем разбиении программы на модули, с малым числом связей между модулями, о чем будет говориться далее). Это преимущество особенно сильно сказывается во время отладки программы. Например, при внесении изменений только в один из нескольких десятков или сотен модулей программы, только он и должен быть зано- во проверен компилятором и переведен на язык машины.2 Обычно говорят о малом времени пере- 1 Из этого правила совсем немного исключений, это, например, повторение имен сегментов и процедур в начале и в конце их описания (ведь это, в принципе, описание одного имени). С другими исключениями уни- кальности имѐн в ассемблерном модуле Вы познакомитесь при изучении макросредств языка Ассемблера. 2 Точнее на объектный язык, о чем будет говориться далее. 2 компиляции всей программы при исправлении ошибки в одном модуле, что сильно ускоряет про- цесс отладки программы. Следует отметить и такое хорошее свойство модульного программирования, как возможность повторного использования (reuse) разработанных модулей в других программах.1 Очевидно, что для повторного использования программных модулей их лучше оформлять в виде наборов процедур и функций со стандартными соглашениями о связях. И, наконец, ещѐ об одном преимуществе модуль- ного программирования будет говориться позже при рассказе о схеме счѐта с динамической загруз- кой и динамическом связывании модулей. Разумеется, за все надо платить, у модульного программирования есть и свои слабые стороны, перечислим основные из них. · Во-первых, модули не являются совсем уж независимыми друг от друга: между ними суще- ствуют связи, то есть один модуль иногда может использовать переменные, константы и программный код другого модуля. Необходимость связей между модулями естественно вы- текает из того факта, что модули совместно решают одну общую задачу, при этом каждый модуль выполняет свою часть задачи, получая от других модулей входные данные и пере- давая им результаты своей работы. · Во-вторых, теперь перед счетом программы необходим особый этап сборки программы из составляющих еѐ модулей. Этот процесс достаточно сложен, так как кроме собственно объ- единения всех модулей в одну программу, необходимо проконтролировать и установить все связи между этими модулями.2 Сборка программы из модулей производится специальной системной программой, которая называется редактором внешних связей между модулями (по-английски связь называется link, поэтому жаргонное название этой программы – линкер или линковщик). · В-третьих, так как теперь компилятор не видит всей исходной программы одновременно, то, следовательно, и не может получить полностью готовый к счету модуль на машинном языке. Более того, так как в каждый момент времени он видит только один модуль, он не может проконтролировать, правильно ли установлены связи между модулями. Ошибка в связях теперь выявляется на этапе сборки программы из модулей, а иногда только на этапе счета, особенно если используется так называемое динамическое связывание модулей, обо всем этом будем говорить далее. Позднее обнаружение ошибок связи между модулями мо- жет существенно усложнить и замедлить процесс отладки программы. Несмотря на отмеченные недостатки, преимущества модульного программирования так велики, что сейчас это основной способ разработки сложного программного обеспечения. Теперь начнѐм знакомиться с особенностями написания модульной программы на языке Ассемблера.   Модульное программирование — это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Единственная альтернатива модульности — монолитная программа, что, конечно, неудобно. Таким образом, наиболее интересный вопрос при изучении модульности — определение критерия разбиения на модули. Концепции модульного программирования.В основе модульного программирования лежат три основных концепции: Принцип утаивания информации Парнаса. Всякий компонент утаивает единственное проектное решение, т. е. модуль служит для утаивания информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений. Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям: · блочность организации, т. е. возможность вызвать программную единицу из блоков любой степени вложенности; · синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами; · семантическая независимость, т. е. независимость от места, где программная единица вызвана; · общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении; · полнота определения, т. е. самостоятельность программной единицы. Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:   · стремление к выделению независимой единицы программного знания. В идеальном случае всякая идея (алгоритм) должна быть оформлена в виде модуля; · потребность организационного расчленения крупных разработок; · возможность параллельного исполнения модулей (в контексте параллельного программирования). Определения модуля и его примеры.Приведем несколько дополнительных определений модуля. · Модуль — это совокупность команд, к которым можно обратиться по имени. · Модуль — это совокупность операторов программы, имеющая граничные элементы и идентификатор (возможно агрегатный). Функциональная спецификация модуля должна включать: · синтаксическую спецификацию его входов, которая должна позволять построить на используемом языке программирования синтаксически правильное обращение к нему; · описание семантики функций, выполняемых модулем по каждому из его входов. Разновидности модулей.Существуют три основные разновидности модулей: 1) "Маленькие" (функциональные) модули, реализующие, как правило, одну какую-либо определенную функцию. Основным и простейшим модулем практически во всех языках программирования является процедура или функция. 2) "Средние" (информационные) модули, реализующие, как правило, несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Примеры "средних" модулей в языках программирования: a)задачи в языке программирования Ada; b)кластер в языке программирования CLU; c)классы в языках программирования C++ и Java. 3) "Большие” (логические) модули, объединяющие набор "средних" или "маленьких" модулей. Примеры "больших" модулей в языках программирования: a)модуль в языке программирования Modula-2; b)пакеты в языках программирования Ada и Java. Набор характеристик модуля предложен Майерсом [Майерс 1980]. Он состоит из следующих конструктивных характеристик: 1) размера модуля; В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в "чанки" — наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обрабатывать не более 7 чанков. Модуль (функция) не должен превышать 60 строк. В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора. 2) прочности (связности) модуля; Существует гипотеза о глобальных данных, утверждающая, что глобальные данные вредны и опасны. Идея глобальных данных дискредитирует себя так же, как и идея оператора безусловного перехода goto. Локальность данных дает возможность легко читать и понимать модули, а также легко удалять их из программы. Связность (прочность) модуля (cohesion) — мера независимости его частей. Чем выше связность модуля — тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить типы связности, приведенные ниже. Функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же типами связностей. Последовательная связность. Модуль с такой связностью может быть разбит на последовательные части, выполняющие независимые функции, но совместно реализующие единственную функцию. Например, один и тот же модуль может быть использован сначала для оценки, а затем для обработки данных. Информационная (коммуникативная) связность. Модуль с информационной связностью — это модуль, который выполняет несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Эта информационная связность применяется для реализации абстрактных типов данных. Обратим внимание на то, что средства для задания информационно прочных модулей отсутствовали в ранних языках программирования (например, FORTRAN и даже в оригинальной версии языка Pascal). И только позже, в языке программирования Ada, появился пакет — средство задания информационно прочного модуля. 3) сцепления модуля с другими модулями; Сцепление (coupling) — мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы сцепления. Независимые модули — это идеальный случай. Модули ничего не знают друг о друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и соответствующим образом перенаправив выходные данные одного модуля на вход другого. Достичь такого сцепления сложно, да и не нужно, поскольку сцепление по данным (параметрическое сцепление) является достаточно хорошим. Сцепление по данным (параметрическое) — это сцепление, когда данные передаются модулю, как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Этот вид сцепления реализуется в языках программирования при обращении к функциям (процедурам). Две разновидности этого сцепления определяются характером данным. · Сцепление по простым элементам данных. · Сцепление по структуре данных. В этом случае оба модуля должны знать о внутренней структуре данных. 4) рутинности (идемпотентность, независимость от предыдущих обращений) модуля. Рутинность — это независимость модуля от предыдущих обращений к нему (от предыстории). Будем называть модуль рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений). Модуль должен быть рутинным в большинстве случаев, но есть и случаи, когда модуль должен сохранять историю. В выборе степени рутинности модуля пользуются тремя рекомендациями. · В большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений. · Зависящие от предыстории модули следует использовать только в тех случаях, когда это необходимо для сцепления по данным. · В спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость, чтобы пользователи имели возможность прогнозировать поведение такого модуля. Назначение программного обеспечения компьютера, особенности функционирования   6.1. Что такое программное обеспечение?
Под программным обеспечением (Software) понимается совокупность программ, выполняемых вычислительной системой.

К программному обеспечению (ПО) относится также вся область деятельности по проектированию и разработке ПО:





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

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

Сам по себе компьютер не обладает знаниями ни в одной области применения. Все эти знания сосредоточены в выполняемых на компьютерах программах.

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

Наши рекомендации