30 мар. 2012 г.

Понятие модуль и модульное программирование

Модульное программирование осуществляется путём разбиения задачи на некоторое число различных модулей. Под модульным программированием понимают умение широко (всесторонне) использовать стандартные модули путём настройки их параметров; автоматизацию сборки готовых модулей из библиотек, банков модулей. Модуль, в свою очередь, отдельная функционально-законченная программная единица. Как правило, каждый модуль содержит паспорт, в котором указаны все основные его характеристики: язык программирования, объём, входные и выходные переменные, их формат, ограничения на них, точки входа, параметры настройки и так далее. Объём модуля обычно не превышает 1000 команд ЭВМ или операторов языка программирования. В противном случае модуль становится громоздким и трудным к восприятию и использованию. Модуль можно сравнить с устройством, имеющим средства сопряжения (подключения), через которые происходит как управление самим устройством, так и обмен данными. Это своего рода чёрный ящик, для которого импорт и экспорт определяют его интерфейс и зависимость от других устройств. Стандартизация интерфейса между отдельными программными единицами – вот основная черта модульного программирования. Интерфейс в модульном программировании рассматривается как жёсткая спецификация, контракт, который должен неукоснительно соблюдаться клиентами модуля (импортирующими его) и реализацией данного модуля (или несколькими альтернативными реализациями). Основные концепции модульного программирования: - каждый модуль реализует единственную независимую функцию; - каждый модуль имеет единственную точку входа и выхода – на входе программный модуль получает определённый набор исходных данных, выполняет содержательную обработку и возвращает один набор результатных данных, то есть реализуется стандартный принцип IPO (Input-Process-Output – вход-процесс-выход); - размер модуля по возможности должен быть минимизирован; - каждый модуль может быть разработан и закодирован различными членами бригады программистов и может быть отдельно протестирован; - вся система построена из модулей; - модуль не должен давать побочных эффектов; - каждый модуль не зависит от того, как реализованы другие модули. В результате такого подхода сложная система разделяется на несколько частей, одновременно создаваемых различными программистами. Каждый модуль реализует единственную функцию. Размер модуля не велик, поэтому тестирование управляемо и может быть проведено тщательным образом. После кодирования и тестирования всех модулей происходит их интеграция, и тестируется вся система. При сопровождении тестируется и отлаживается только тот модуль, который плохо работает. Очевидны преимущества в облегчении написания и тестирования программ, уменьшается стоимость их сопровождения. Модульная структура программных продуктов Принципы модульного программирования программных продуктов строятся на такой системе: сначала определяются состав и подчинённость функций, а затем – набор программных модулей, реализующих эти функции. Однотипные функции реализуются одними и теми же модулями. Функция верхнего уровня обеспечивается главным модулем; он управляет выполнением нижестоящих функций, которым соответствуют подчинённые модули. При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее: - каждый модуль вызывается на выполнение вышестоящим модулем и, закончив работу, возвращает управление вызвавшему его модулю; - принятие основных решений в алгоритме выносится на максимально «высокий» по иерархии уровень; - для использования одной и той же функции в разных местах алгоритма создаётся один модуль, который вызывается на выполнение по мере необходимости. В результате дальнейшей детализации алгоритма создаётся функционально-модульная схема (ФМС) алгоритма приложения, которая является основой для программирования. Пример такой схемы можно увидеть в приложении, где видно, что функция Ф1 реализуется в виде последовательности выполнения программных модулей. Функция Фm реализуется с помощью иерархии связанных модулей. Модуль n управляет выбором на выполнение подчинённых модулей. Функция Фх реализуется одним программным модулем. Чтобы более подробно разобраться в природе модульного программирования, обратимся к истории. До начала 1970-х годов программы создавались в виде монолитных блоков, либо делались из независимых частей, сопряжение которых было достаточно примитивным – на уровне вызовов подпрограмм (процедур). Отсюда появились два понятия – цельная компиляция и независимая компиляция. В свою очередь, под компиляцией понимают трансляцию программы или отдельного программного модуля, составленных на языке программирования высокого уровня (исходная программа, исходный модуль) в программу или модуль на машинном языке или языке, близком к машинному (объектная программа, объектный модуль). Первый случай, то есть цельная компиляция – простой: транслируется вся программа целиком. Во втором случае, при независимой компиляции каждый блок (файл) транслируется отдельно, фактически без наличия информации о точках сопряжения. Все проблемы увязки возлагались на компоновщик. Именно он состыковывал оттранслированные части, соединял программу с библиотеками, которые та использовала. В процессе компиляции программа преобразуется в промежуточную форму, к которой впоследствии необходимо присоединить библиотечные средства, содержащие стандартные подпрограммы и процедуры, а если нужно, то можно добавить любые другие модули, написанные самим пользователем, и скомпилированные в объектные модули, возможно, с иных языков высокого уровня. Для модульного программирования характерно использование раздельной компиляции, когда компиляция интерфейса и реализации модуля делается отдельно от реализации других модулей, но с обязательным участием интерфейсов всех прямо и косвенно импортируемых модулей. Если нет возможности отделить интерфейс в текстовом или бинарном виде от реализации модуля, то такую систему программирования нельзя считать системой раздельной компиляции, ибо нарушается главный принцип – компиляции модуля при отсутствии в пределах досягаемости компилятора реализаций импортируемых им модулей. Все ошибки несостыковки обнаруживаются на этапе трансляции (причём даже до реализации других модулей, ведь нужны только контракты-интерфейсы). Более примитивная и распространённая схема независимой компиляции не использует эту информацию и вынуждена заниматься выявлением расхождений в сопряжении файлов лишь на этапе компоновки. Высокая гибкость в модульном программировании достигается за счёт совмещения фазы компоновки и загрузки. А в некоторых случаях совмещается на этом этапе (перед компоновкой) и фаза генерирования машинного кода для конкретной целевой архитектуры. То есть безо всякой виртуальной машины достигается эффективное выполнение модулей на любой операционной платформе.
Share:

Related Posts:

0 коммент.:

Отправить комментарий

Общее·количество·просмотров·страницы

flag

free counters

top

Технологии Blogger.