Способ программирования при котором вся программа разбивается на группу компонентов
Способ программирования , при котором вся программа разбивается на группу компонентов, называемых модулями, каждый со своими контролируемыми размерами, четким назначением и хорошо определенным интерфейсом с внешней средой. Поскольку единственная альтернатива - это создание монолитной программы, что крайне неудобно, вопрос заключается не в том, должны ли программы разбиваться на модули, а в том, каким должен быть критерий разбиения. [1]
Способ программирования , обсуждаемый до сих пор, относительно труден для изучения: вводятся новые понятия, а окончательная программа не имеет ничего похожего на исходную математическую символику. Нужно запомнить код операций машины. Кроме того, в некоторых машинах большое внимание должно быть уделено относительному порядку команд, чтобы уменьшить время выборки из памяти, а масштабы для всех чисел должны быть выбраны так, чтобы они находились в определенных конкретных пределах. [2]
Способ программирования , при котором поля микрокоманды соответствуют микрооперациям или регистрам процессора и каждая микрокоманда управляет всеми элементами процессора. [3]
Способ программирования , обсуждаемый до сих пор, относительно труден для изучения: вводятся новые понятия, а окончательная программа не имеет ничего похожего на исходную математическую символику. Нужно запомнить код операций машины. Кроме того, в некоторых машинах большое внимание должно быть уделено относительному порядку команд, чтобы уменьшить время выборки из памяти, а масштабы для всех чисел должны быть выбраны так, чтобы они находились в определенных конкретных пределах. [4]
Способ программирования , который мы обсудили, называется линейным программированием. Название это связано с тем, что отыскиваются значения переменных, при которых достигается экстремум линейной функции этих переменных, то есть функции, в выражение которой все переменные входят в первой степени, и одновременно удовлетворяется система линейных неравенств. [5]
Способ программирования , при котором поля микрокоманды соответствуют микрооперациям или регистрам процессора и каждая микрокоманда управляет всеми элементами процессора. [6]
Способ программирования операций , используемый для компенсации низ кой и в некоторых случаях нерегулярной скорости, с которой периферийное устройство передает или принимает данные. Если устройство напрямую обменивается данными с программой, то программа должна работать в синхронизме с этим устройством; буферизация позволяет программе и уст ройству функционировать независимо друг от друга. Рассмотрим программу, выдающую данные на устройство с низким быстродействием. Для обмена дан ными выделяется определенная область памяти [ буфер ( В. [7]
Способ программирования операций , используемый для компенсации низко-либо нерегулярной скорости, с которой периферийное устройство передает ( принимает) данные. [8]
Способ программирования произведения матриц основан на том, что каждый элемент с1 матрицы С является скалярным произведением i - й строки матрицы А на j - й столбец матрицы В. [9]
Этот способ программирования удобен и надежен, если не приходится часто изменять программу и условия работы. Если условия работы изменяются, то этот способ недостаточно совершенен даже для осуществления работы в полуавтоматическом режиме. Это наглядно видно на примере работы портальных кранов, работа механизмов поворота которых зависит от силы и направления ветра, состояния тормоза и др. В большинстве подобных случаев необходимо серьезное усложнение схемы, введение обратных связей и следящих систем. [10]
Второй способ программирования заключается в том, что отдельные части программ сохраняют и как целое применяют при составлении новых программ. При втором способе заново программируют лишь такие части программ, которые еще не были запасены. [11]
Второй способ программирования сложных логических операторов основан на использовании следующих трех правил программирования. [12]
Усовершенствование способа программирования обучением путем управления приводами манипулятора через его устройство управления обычно с помощью переносного пульта состоит в следующем. На время программирования на рабочий орган манипулятора укрепляется передающая телевизионная камера, выводящая крупным планом на экран персонального компьютера изображение объектов внешней среды, с которыми манипулятор должен взаимодействовать. Управление манипулятором осуществляется через компьютер с помощью мыши или такой же задающей рукоятки, как в предыдущей системе. Преимущество этого варианта системы программирования - в значительно больших быстродействии и точности. [13]
По способу программирования различают микропроцессоры, функционирование которых определяется программой или микропрограммой, записанной в ЗУ. В первом случае устройство управления содержит дешифратор команды, который в каждом такте машинного времени вырабатывает совокупность микрокоманд, определяющих работу всех устройств микропроцессора. За несколько тактов выполняется последовательность микрокоманд, обеспечивающая реализацию поступившей команды. Во втором случае набор микрокоманд соответствует более простым действиям и поэтому более эффективен для решения определенного класса задач, так как обеспечивает более высокое быстродействие. [14]
Модульное программирование — это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Единственная альтернатива модульности — монолитная программа, что, конечно, неудобно. Таким образом, наиболее интересный вопрос при изучении модульности — определение критерия разбиения на модули.
Концепции модульного программирования. В основе модульного программирования лежат три основных концепции.
1. Принцип утаивания информации Парнаса. Всякий компонент утаивает единственное проектное решение, т. е. модуль служит для утаивания информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.
2. Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:
· блочность организации, т. е. возможность вызвать программную единицу из блоков любой степени вложенности;
· синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами;
· семантическая независимость, т. е. независимость от места, где программная единица вызвана;
· общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении;
· полнота определения, т. е. самостоятельность программной единицы.
3. Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:
· стремление к выделению независимой единицы программного знания. В идеальном случае всякая идея (алгоритм) должна быть оформлена в виде модуля;
· потребность организационного расчленения крупных разработок;
· возможность параллельного исполнения модулей (в контексте параллельного программирования).
Определения модуля и его примеры.Приведем несколько дополнительных определений модуля.
Модуль — это совокупность команд, к которым можно обратиться по имени.
Модуль — это совокупность операторов программы, имеющая граничные элементы и идентификатор (возможно агрегатный).
Функциональная спецификация модуля должна включать:
· синтаксическую спецификацию его входов, которая должна позволять построить на используемом языке программирования синтаксически правильное обращение к нему;
· описание семантики функций, выполняемых модулем по каждому из его входов.
Разновидности модулей. Существуют три основные разновидности модулей:
· функциональные модули, реализующие, как правило, одну какую-либо определенную функцию. Основным и простейшим модулем практически во всех языках программирования является процедура или функция;
· информационные модули, реализующие, как правило, несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля;
· логическиемодули, объединяющие набор функциональных и информационных модулей.
Набор характеристик модуля предложен Майерсом (1980). Он состоит из следующих конструктивных характеристик.
1. Размер модуля.
В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в "чанки" — наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обрабатывать не более 7 чанков.
Модуль (функция) не должен превышать 60 строк. В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора.
2. Прочность (связность) модуля.
Существует гипотеза о глобальных данных, утверждающая, что глобальные данные вредны и опасны. Идея глобальных данных дискредитирует себя так же, как и идея оператора безусловного перехода goto. Локальность данных дает возможность легко читать и понимать модули, а также легко удалять их из программы.
Прочность (связность) модуля — мера независимости его частей. Чем выше связность модуля — тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить следующие типы связности:
· функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на два модуля с теми же типами связностей;
· последовательная связность. Модуль с такой связностью может быть разбит на последовательные части, выполняющие независимые функции, но совместно реализующие единственную функцию. Например, один и тот же модуль может быть использован сначала для оценки, а затем для обработки данных;
· информационная (коммуникативная) связность. Модуль с информационной связностью — это модуль, который выполняет несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля. Эта информационная связность применяется для реализации абстрактных типов данных.
Средства для создания информационно прочных модулей отсутствовали в ранних языках программирования (например, FORTRAN и даже в оригинальной версии языка Pascal). И только позже, в языке программирования Ada, появился пакет — средство задания информационно прочного модуля.
3. Сцепление модуля с другими модулями.
Сцепление — мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Различают следующие типы сцепления:
· независимые модули — это идеальный случай. Модули ничего не знают друг о друге. Организовать взаимодействие таких модулей можно, зная их интерфейс и соответствующим образом перенаправив выходные данные одного модуля на вход другого. Достичь такого сцепления сложно, да и не нужно, поскольку сцепление по данным (параметрическое сцепление) является достаточно хорошим;
· сцепление по данным (параметрическое) — это сцепление, когда данные передаются модулю, как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Этот вид сцепления реализуется в языках программирования при обращении к функциям (процедурам). Две разновидности этого сцепления определяются характером данным.
4. Рутинность (независимость от предыдущих обращений) модуля.
Рутинность — это независимость модуля от предыдущих обращений к нему (от предыстории). Модуль называется рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений).
Модуль должен быть рутинным в большинстве случаев, но есть и случаи, когда модуль должен сохранять историю. В выборе степени рутинности модуля пользуются тремя рекомендациями.
В большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений.
Зависящие от предыстории модули следует использовать только в тех случаях, когда это необходимо для сцепления по данным.
В спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость, чтобы пользователи имели возможность прогнозировать поведение такого модуля.
Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки.
Однотипные функции реализуются одними и теми же модулями. Функция верхнего уровня обеспечиваются главным модулем, который управляет выполнением нижестоящих функций, которым соответствуют подчиненные модули.
При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее:
· каждый модуль вызывается на выполнение вышестоящим модулем и, закончив работу, возвращает управление вызвавшему его модулю;
· принятие основных решений в алгоритме выносится на максимально высокий по иерархии уровень;
· для использования одной и той же функции в разных местах алгоритма создается один модуль, который вызывается на выполнение по мере необходимости.
Модульное программирование – это такой способ
программирования, при котором вся программа
разбивается на группу компонентов, называемых модулями,
причем каждый из них имеет свой контролируемый размер,
четкое назначение и детально проработанный интерфейс с
внешней средой.
Альтернатива модульности – монолитная программа
3. Основные концепции:
В основе модульного программирования лежат три основные
концепции:
Принцип утаивания информации Парнаса
При разработке программ формируется список проектных решений,
которые особенно трудно понять или которые , скорее всего, будут
меняться. Затем определяются отдельные модули, каждый из
которых реализует одно из указанных решений.Большие программы
должны использовать модули без каких-либо предварительных
знаний об их внутренней структуре. Примерами удачных модулей
могут служить программы ППП (пакетов прикладных программ) и
стандартные процедуры.
Сборочное программирование Цейтина.
Модули – это программные «кирпичи», из которых строится
программа.
4. Основные концепции:
Аксиома модульности Коуэна
Модуль – независимая программная единица,
служащая для выполнения некоторой
определенной функции программы и для связи с
остальной частью программы. Программная
единица должна удовлетворять следующим
условиям:
Блочность организации
Синтаксическая обособленность
Семантическая независимость
Общность данных
Полнота определения
5. Характеристики модуля (Майерс, 1980)
Размер модуля
Связность (прочность) модуля
Сцепление модуля с другими модулями
Рутинность (независимость от предыдущих
обращений) модуля
6. Размер модуля
Модуль не должен превышать 60 строк
В результате его можно поместить на одну страницу
распечатки или легко просмотреть на экране монитора
7. Связность модуля
Связность модуля – мера независимости его
частей.
Чем выше связность, тем больше связей он
«упрятывает» в себе
Типы связности:
Функциональная
Модуль с функциональной связностью реализует одну какуюнибудь функцию и не может быть разбит на два модуля с теми
же типами связности
Последовательная
8. Связность модуля
Типы связности:
Последовательная
Модуль с такой связностью может быть разбит на
последовательные части, выполняющие независимые
функции, но реализующие совместно единственную функцию
(например, оценка , а затем обработка данных)
9. Связность модуля
Типы связности:
Информационная
Модуль с информационной связностью – это модуль,
выполняющий несколько операций или функций над одной и
той же структурой данных, которая считается неизвестной вне
этого модуля (применяется для реализации, например,
абстрактных типов данных таких как стек, очередь и др.)
10. Связность модуля: Следует избегать
Временной связности
- когда объединяются действия, связанные со временем
(например, действия, которые должны быть выполнены в один и
тот же момент времени)
Логической связности
- когда в модуль объединяются действия по признаку их
некоторого подобия (например, функции для проверки
корректности входных данных для всей программы)
Случайной связности
- когда действия объединяются произвольным образом
Процедурной связности
- когда действия сгруппированы вместе только потому, что они
выполняются в течение одной и той же части процесса
11. Сцепление модулей
Сцепление – мера относительной независимости
модулей от других модулей.
Независимые модули могут быть модифицированы без
переделки других модулей.
Чем слабее сцепление модуля, тем лучше.
12. Типы сцепления
Независимые модули – идеальный случай.
В этом случае модули ничего не знают друг о друге.
Взаимодействие модулей организуется через их
интерфейсы, когда выходные данные одного модуля
передаются на вход другого.
Достичь такого сцепления очень сложно, и в
большинстве случаев не нужно.
13. Типы сцепления
Сцепление по данным (параметрическое) – это
сцепление, когда данные передаются модулю как
значения его параметров или как результат его
обращения к другому модулю для вычисления некоторой
функции (Этот тип сцепления реализуется в языках
программирования при обращении к функциям)
Разновидности этого сцепления:
Сцепление по простым элементам данных
Сцепление по структуре данных (оба модуля при этом должны
знать о внутренней структуре данных)
14. Типы сцепления Не рекомендуется использовать:
Сцепление по управлению – это сцепление,
в котором один модуль управляет решениями внутри
другого с помощью передачи флагов, переключателей и
т.п.
В этом случае один модуль должен достаточно хорошо
знать структуру вызывающего модуля
Сцепление по внешним ссылкам – возникает, когда у
одного модуля есть доступ к данным другого
Сцепление по кодам – возникает, когда коды
инструкций модулей перемежаются друг с другом
(внутренняя область одного модуля доступна другому)
15. Рутинность модуля
Рутинность модуля – это независимость модуля от
предыдущих обращений к нему.
Будем называть модуль рутинным, если результат его
работы зависит только от количества переданных
параметров (а не от количества обращений)
16. Рутинность модуля
В некоторых случаях возникает необходимость в
создании модулей, которые должны сохранять
предысторию (не рутинные)
В выборе степени рутинности пользуются тремя
рекомендациями:
В большинстве случаев делаем модуль рутинным
Зависящие от предыстории модули следует использовать
только в том случае, когда необходимо сцепление по данным
В спецификации зависящего от предыстории модуля должна
быть сформулирована эта зависимость
17. Свойства модуля
На модуль можно ссылаться с помощью имени
модуля.
Модуль должен иметь один вход и один выход
Модуль должен быть сравнительно невелик
Возможность сепаратной компиляции
Модуль может вызвать другой модуль или сам себя
Модуль должен возвращать управление тому, кто
его вызвал
Модуль не должен сохранять историю своих
вызовов для управления своим функционированием
18. Преимущества модульного программирования:
Функциональные компоненты модульной
программы могут быть написаны и отлажены
порознь
Модульную программу проще проектировать,
легче сопровождать и модифицировать
Становится проще процедура загрузки в
оперативную память боль-шой программы,
требующей сегментации
19. Недостатки модульного программирования:
Может
увеличиться
время
компиляции
и
загрузки.
Может
увеличиться
время
исполнения
программы.
Может возрасти объем требуемой памяти.
Организация межмодульного взаимодействия
может оказаться довольно сложной.
Для современных компьютеров
недостатка несущественны.
первые
три
20. Стандартные модули
Разработка и использование стандартных
библиотечных программ является одним из путей
построения модульного программирования
Преимущества стандартных модулей:
1) стандартные модули экономят время
программирования;
2) они также могут экономить память компьютера и
выполняться максимально быстро;
3) использование стандартных модулей защищает от
ошибок программирования.
21. Стандартные модули
Недостатки:
Нужный стандартный модуль иногда бывает трудно найти. Еще
труднее – подробную документацию к нему
Стандартный модуль может оказаться более универсальным, чем это
нужно пользователю
Стандартный модуль может быть написан на другом языке
Каждый программист решает самостоятельно использовать ему
стандартные модули или разрабатывать свой собственный.
22. Подпрограммы (функции)
Подпрограммы также являются средством для
построения модульных программ
Не всякая подпрограмма является модулем.
Модуль должен удовлетворять перечисленным
выше характеристикам и свойствам.
Классификация по уровню абстрагирования при постановке задачи.
Классификация по функциональному назначению.
Области применения языков программирования
- научные вычисления (языки C++, FORTRAN, Java);
- системное программирование (языки C++, Java);
- обработка информации (языки C++, COBOL, Java);
- искусственный интеллект (LISP, Prolog);
- издательская деятельность (Postscript, TeX);
- удаленная обработка информации (Perl, PHP, Java, C++);
- описание документов (HTML, XML).
Факторы, влияющие на востребованность ЯПВУ
- наличие среды программирования, поддерживающей разработку приложений на конкретном языке программирования;
- удобство сопровождения и тестирования программ;
- стоимость разработки с применением конкретного языка программирования;
- четкость и ортогональность конструкций языка;
- применение объектно-ориентированного подхода.
- Парадигма -- набор теорий, стандартов и методов, которые совместно представляют собой способ организации научного знания, -- иными словами, способ видения мира. парадигма в программировании -- способ концептуализации, который определяет, как следует проводить вычисления, и как работа, выполняемая компьютером, должна быть структурирована и организована.
Директивное программирование (directive programming)
- C и Pascal
- разработчик программы использует процессорно-ориентированная модель, то есть пытается создать код, должным образом воздействующий на данные. Активным началом при этом подходе считается программа (код), которая должна выполнить все необходимые для достижения нужного результата действия над пассивными данными.
объектно-ориентированный (object oriented) подход
Функциональное и логическое программирование
- Lisp, Haskell и Prolog.
- Эта парадигма базируется на принципиально иной трактовке понятия программы. Здесь главным является точная формулировка задачи , а выбор и применение необходимого для ее алгоритма решения -- проблема исполняющей системы, но не программиста.
Читайте также: