Cтраница 4
В связи с требованиями, предъявляемыми конструкторами систем с разделением времени, проблема повторной загрузки в памяти стояла при развитии концепции виртуальной памяти столь же остро, как и проблема разбиения программы на части. Первый шаг в этом направлении был сделан фирмой IBM [ 18J и Массачусетсом технологическим институтом [19] при разработке совместимых систем с разделением времени. Во время выполнения этой программы содержимое регистра загрузки складывается с каждым исполнительным адресом для определения соответствующей ячейки основной памяти. Хотя использование регистра загрузки и помогает решить проблему загрузки в память, проблема разбиения программы на части остается нерешенной, поскольку программа пользователя должна полностью находиться в основной памяти. [46]
При разработке первой очереди драйверных программ для программно-управляемых средств АСЭТ, применяемых в ИВК-7 и ИВК-8, с ориентацией в качестве типового ПО на интерпретатор ДС СМ ЭВМ и на расширенные версии ДС ИВК в качестве основных были приняты следующие положения: наличие драйверных функций, позволяющих обращаться к каждому прибору в отдельности, обеспечивающих большую гибкость; простота и наглядность при обращении к драйвер-ным функциям; наличие средств контроля правильности обращения к драйверным функциям с диагностикой возможных ошибок; слежение за текущим состоянием приборов с выдачей соответствующих диагностических сообщений в случае их сбоев или отказов; максимальное использование средств интерпретатора с целью экономии оперативной памяти; разбиение программ, реализующих драиверные функции, на модули для выделения частей общих программных, связанных с согласованием специальных форматов данных с типовым машинным форматом и независимых от применяемого типового ПО; применение, где это возможно, буферизации данных для исключения простоев процессора; введение драйверных функций по устойчивым алгоритмам массовых измерений, повышающих эффективность ИВК; возможность генерации набора драйверных функций для заданного состава приборов. [47]
Другим аспектом структурного программирования является такое написание программы, которое позволило бы людям легко ее прочесть и понять. Разбиение программы на модули и присвоение каждому модулю и переменной имени, соответствующего выполняемой функции, помогает сделать программу более читабельной. [48]
На этом этапе осуществляется разбиение общей задачи, которую необходимо решить, на отдельные фрагменты путем выделения взаимодействующих между собой программных модулей. Разбиение программ на модули может иллюстрироваться и документироваться блок-схемой, которая показывает взаимосвязи между модулями. После того как определена структура программы и структуры ее данных, можно приступить к детальной проработке алгоритмов и наборов данных. [49]
Поэтому желательно, чтобы каждый оператор анализируемой схемы представлял достаточно крупное задание, например вычисление процедуры или подпрограммы. Такое естественное разбиение программы не всегда возможно, приходится разбивать программу на некоторые произвольные части. [50]
Именно на таких читателей рассчитана эта книга, именно на такой подход к отладке указывает термин индивидуальная в названии книги. Вопросы разбиения программ на независимые части, особенности комплексной отладки затрагиваются лишь по отношению к работе одного программиста. [51]
![]() |
Структурная схема системы ПАРИС. [52] |
Выбор такой структуры определяется, прежде всего, стремлением к максимальному использованию оперативной памяти машины. Метод разбиения программы на блоки ( или сегменты) появился в программировании как прием, позволяющий в определенной мере преодолеть ограничения на размеры памяти, с которыми приходится сталкиваться в процессе реализации больших систем. Ограниченные размеры пцмяти приводят к необходимости сегментации не только самой системы, но и исходной информации, так как все данные, подлежащие обработке, обычно не помещаются в МОЗУ одновременно. Следующий блок считывает эти данные в МОЗУ и выполняет свой этап преобразования, подготавливая материал для работы очередного блока. Так продолжается до тех пор, пока не будет решена вся задача. Само собой разумеется, что сами блоки системы не находятся в оперативной памяти и, в свою очередь, поочередно вызываются туда, так что никакие два блока одновременно в МОЗУ находиться не могут. [53]
Перед программистом задача разбиения программы на части встает в том случае, когда объем его программы превосходит объем основной памяти. Часто используют схему разбиения программы на части [17], в которой объем основной памяти распределяется между отдельными сегментами программной иерархии. [54]
Когда назначены уровни прерывания, разработчики могут перейти к распределению функций между подпрограммами. Существует две причины для разбиения программы на части или подпрограммы. Первая причина состоит в применении принципа разделяй и властвуй; сложные функции выполняются группой программ, реализующих частные задачи. Вторая причина заключается в том, что для реализации некоторых функций необходимо выполнение сходной последовательности операций, возможно, над различными исходными данными. Часто можно уменьшить затраты памяти, создав-подпрограммы, которые собирают все необходимые данные, а затем выполняют требуемые операции. В настоящем разделе излагаются соображения, влияющие на разделение программы на подпрограммы. [55]
Разбиение программы на операторы не является однозначным; чрезмерное дробление операторов нецелесообразно, так как это усложняет логическую схему программы. Чаще всего выбирают такое разбиение программы на операторы, при котором логическая схема проще и требует меньших затрат труда программиста. [56]
Бейсик не является модульным языком. Большинство версий Бейсика предусматривает разбиение программ на процедуры, называемые подпрограммами. Однако многие из этих версий требуют при этом, чтобы все подпрограммы обрабатывались одновременно с целью уменьшения потоков информации между подпрограммами. Таким образом, программа состоит из единственного модуля и все данные являются модульными по определению. Следовательно, описания модуля не требуется. [57]
Для того чтобы структурное программирование достигло своей цели, программа должна иметь модульную струк туру. Модульное программирование заключается в разбиении программы на логические части и в последовательном программировании каждой части. После разделения большой монолитной задачи на меньшие логические части, которые более удобны для работы, ее легче понять, прочитать и запрограммировать. [58]