Модульное программирование
Сегодня термин «информатика» принято употреблять в двух смыслах:
- отдельное научное направление, изучающее информацию и информационные процессы, реализующее разработку и создание новых средств для работы с информацией;
- практическая область деятельности людей, непосредственно связанная с использованием компьютеров при обработке информации.
Одним из направлений информатики как науки является программирование – наука, которая изучает теорию и методы разработки, производства и эксплуатации программного обеспечения ЭВМ.
Грамотное написание компьютерных программ подразумевает не только хорошее знание различных языков и средств разработки, но и достаточно развитое алгоритмическое мышление. На протяжении последних десятилетий сложилась специальная практика обучения программированию. Согласно этой практике основной причиной неудач в процессе обучения является именно недостаток алгоритмического мышления.
Алгоритмическим мышлением называется умение выстраивать логически безупречную последовательность действий для получения решения поставленной задачи. Многолетний опыт показывает, что для развития алгоритмического мышления в первую очередь требуется тщательно прорабатывать алгоритмы для небольших, но полезных программ, которые формируют базовые приемы программирования. Таких приемов достаточно немного, однако их обобщение, накопление, и умение осознанно применять при решении практических задач дает возможность научиться писать программы практически любому человеку [3].
#Архитектура приложения и кода
Все вышесказанное объясняет актуальность выбранной темы – разработка программного обеспечения для различных устройств сегодня является одним из основных направлений в области информатики. Однако, не зная базовых основ алгоритмов, очень сложно преуспеть в этом деле и быть хорошим специалистом в сфере программирования.
Объект исследования данной работы – языки программирования.
Предмет исследования –языки программирования высокого уровня.
Целью работы является классификация языков программирования.
Для достижения поставленной цели предстоит решить ряд задач:
- проанализировать литературу по заданной теме;
- дать определения основным терминам;
- привести классификацию языков программирования.
В качестве опорных источников при написании работы были использованы следующие: А.Ф. Новиков – «Учебно-методическое пособие по дисциплине «Технологические подходы к разработке программного обеспечения»» и В.В. Ммухортов – «Объектно-ориентированное программирование, анализ и дизайн»
1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ
На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:
- смещение акцентов от частного к общему – переход от программирования мелких деталей к программированию более крупных компонентов;
- совершенствование и развитие прикладного инструментария программиста – создание новых методологий, языков программирования и рабочей среды;
- увеличение объема и сложности информационных и программных систем.
Именно расширение области использования вычислительной техники и информационных технологий являетсяс основной движущей силой прогресса в сфере программирования. На протяжении всей истории развития информационных технологий проводилось огромное множество прикладных исследований по методологии проектирования, декомпозиции, абстрагированию и иерархиям. Результатом данных исследований стало создание новых, более выразительных языков программирования [7].
Структура программы и проекта на C#
Обычно под программированием понимается процесс разработки программ. Однако к этому же термину относятся и некоторые виды человеческой деятельности. Например, «политическое программирование» – термин, который часто используется в средствах массовой информации, или «математическое программирование» – специальный раздел математики. Применимо к созданию программ обычно используется выражение «разработка программного обеспечения» [14].
Таким образом, программированием (computer programming) называется процесс создания человеком-программистом информационной структуры — программы, целью которой является исполнение на компьютере.
В большинстве случаев в программировании важным является не только факт исполнения программы компьютером, но и факт использования полученного результата человеком. Однако, бываете и ряд исключений, примером которого является программа первоначальной загрузки операционной системы [12].
Таким образом, в процессе программирования выделяются следующие элементы:
- цель – выполнение программы, которое приводит к решению поставленной задачи или публикация ее текста;
- субъект – человек, осознанно ведущий процесс программирования, или другая программа (в случае автоматического синтеза программы, при этом процесс не является осознанным, а программа может быть выражена на языке нейрокомпьютера или не иметь материального носителя);
- объект – текст, записанный на формальном языке [10].
Сегодня результативность и эффективность программирования в целом оставляет желать лучшего. Несмотря на массовое распространение компьютеров и быстрый рост характеристик их программного и аппаратного обеспечения, весьма значительной остается доля неудачных проектов, целью которых является разработка программного обеспечения. Наряду с эффектными достижениями имеются и сравнительно многочисленные досадные неудачи. К сожалению, до сих пор слишком часто приходится делать вывод, что программирование рискованно, программы ненадежны, а программисты неуправляемы [6].
Нельзя отрицать существование проблем в области программирования. Лучшие программисты, ведущие предприятия и компьютерное сообщество в целом постоянно тратят значительные и все возрастающие усилия на решение этих проблем. Результатом этой деятельности стало создание нескольких специализированных отраслей науки. Дисциплина, главной задачей которой является решение внутренних проблем программирования, называется технологией программирования, или инженерии программных систем. Последний термин является точным переводом английского термина «software engineering».
Технология программирования (software engineering) представляет собой совокупность средств и методов, которая позволяет налаживать производственный процесс создания программного обеспечения.
Ключевым словом в данном определении является «производственный», так как оно отражает главную особенность технологии программирования. Например, с точки зрения информатики (computer science), указание на производственный характер дисциплины отсутствует [15].
Информатикой называется дисциплина, предметом изучения которой являются общие свойства информации, а также вопросы, связанные с ее накоплением, хранением и обработкой.
Информатика тесно связана с программированием за счет того, что в современном мире функции накопления, хранения и обработки информации реализуются при помощи программного обеспечения компьютеров.
Соотношение информатики и технологии программирования является сложным вопросом. Информатика представляет собой более общее понятие, однако нельзя считать технологию программирования отдельной частью информатики. В настоящее время вопросы теоретического характера относят к информатике, а практические приемы решения задач считаются элементами технологии программирования. Например, методы математического доказательства правильности программ относятся к теоретической информатике, а методы тестирования – к технологии программирования, хотя это совершенно разные методы решения одной задачи. Важно отметить, что такое отделение технологии программирования от информатики является условным [8].
1.1. Первое поколение
Первые языки программирования были очень сложны. Схема их развития отражена в таблице 1.
Таблица 1 – Первые языки программирования
Источник: www.evkova.org
Тема №3: Разработка структуры программы и модульное программирование
Приступая к разработке каждой программы ПС, следует иметь ввиду, что она является большой системой, поэтому нужно принимать меры для ее упрощения. Для этого программу разрабатывают по частям, которые называются программными модулями. Такой метод программирования называют модульным программированием.
Модуль – это самостоятельная часть программы, имеющая определенное значение и обеспечивающая заданные функции обработки автономно от других программных модулей.
Каждый программный модуль программируется, компилируется и отлаживается отдельно от других модулей программы, и тем самым физически разделен с другими программными модулями.
Каждый программный модуль может включаться в состав разных программ, если выполнены условия его использования, описанные в документации по ее использованию. Т.е. хорошо продуманный модуль позволяет избежать дублирования в программировании.
Любое ПС имеет свою структуру, которая разрабатывается для удобства:
- разработки
- программирования
- отладки
- внесения изменений
Также структуризация ПС позволяет:
- распределить работы по исполнителям, обеспечив их загрузку и требуемые сроки разработки
- построить календарные графики проектных работ и осуществлять их координацию в процессе создания ПИ.
- контролировать трудозатраты и стоимость проектных работ.
При создании ПС выделяются многократно используемые модули, их типизируют и унифицируют, за счет чего сокращаются сроки и трудозатраты на разработку ПС в целом. Некоторые ПС используют готовые модули из библиотек стандартных процедур, функций, объектов и методов обработки данных. Типовая структура ПС: Типы модулей:
Наименование модуля | Описание |
Головной модуль | Управляет запуском ПС (он в единственном числе) |
Управляющий модуль | Обеспечивает вызов других модулей, задает последовательность вызова на выполнение очередного модуля |
Рабочие модули | Выполняют функции обработки |
Сервисные модули | Осуществляют обслуживающие функции |
Свойства модуля:
- один вход и один выход – на входе программный модуль получает определенный набор исходных данных, выполняет обработку данных и возвращает результат
- функциональная завершенность – модуль выполняет перечень операций для реализации каждой отдельной функции в полном составе.
- логическая независимость – результат работы модуля зависит только от исходных данных, и не зависит от работы других модулей.
- слабые информационные связи с другими программными модулями – обмен информации между модулями должен быть по возможности минимизирован.
- обозримый по размеру и сложности.
Каждый модуль состоит из спецификации и тела модуля. Спецификация – правила использования модуля. Тело – способ реализации процесса обработки. Принцип модульного программирования ПС:
- Определение состава и подчиненность функций
- определение набора программных модулей, реализующих эти функции
При составлении алгоритма необходимо учитывать:
- каждый модуль вызывается на выполнение вышестоящим модулем и закончив работу, возвращает управление вызвавшему модулю.
Методы разработки структуры программы. В качестве модульной структуры программы принято использовать древовидную структуру, включая деревья со сросшимися ветвями. В узлах дерева размещаются модули, а стрелки показывают подчиненность модулей (т.е. в тексте модуля, из которого она исходит, имеется ссылка на модуль, в который она входит). Модульная структура программы должна включать и совокупность спецификаций модулей, образующих эту программу. Спецификация программного модуля содержит:
- синтаксическую спецификацию его входов, позволяющую построить обращение к нему на используемом языке программирования
- функциональную спецификацию модуля (описание всех функций, выполняемых этим модулем).
Существуют разные методы разработки структуры программы. Обычно используют 2 метода:
- Метод восходящей разработки
- метод нисходящей разработки
Метод восходящей разработки. Сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модулей самого нижнего уровня, в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке, в каком велось их программирование. На первый взгляд такой порядок разработки программы кажется вполне естественным: каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Не рекомендуется, т.к.:
- для программирования какого-либо модуля совсем не требуется текстов используемых им модулей — для этого достаточно, чтобы каждый используемый модуль был лишь специфицирован (в объеме, позволяющем построить правильное обращение к нему), а для тестирования его возможно используемые модули заменять их имитаторами (заглушками).
- каждая программа в какой-то степени подчиняется некоторым внутренним для нее, но глобальным для ее модулей соображениям (принципам реализации, предположениям, структурам данных и т.п.), что определяет ее концептуальную целостность и формируется в процессе ее разработки. При восходящей разработке эта глобальная информация для модулей нижних уровней еще не ясна в полном объеме, поэтому очень часто приходится их перепрограммировать.
- при восходящем тестировании для каждого модуля (кроме головного) приходится создавать ведущую программу (модуль), которая должна подготовить для тестируемого модуля необходимое состояние информационной среды и произвести требуемое обращение к нему. Это приводит к большому объему «отладочного» программирования и в то же время не дает никакой гарантии, что тестирование модулей производилось именно в тех условиях, в которых они будут выполняться в рабочей программе.
Методнисходящей разработки. Сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), переходя к программированию какого-либо другого модуля только в том случае, если уже запрограммирован модуль, который к нему обращается. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) порядке. Положительные стороны
- При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т.е. ликвидируется весьма неприятный источник просчетов при программировании модулей.
- Существенно облегчается и тестирование модулей, производимое при нисходящем тестировании программы. Первым тестируется головной модуль программы, который представляет всю тестируемую программу и поэтому тестируется при «естественном» состоянии информационной среды, при котором начинает выполняться эта программа. При этом все модули, к которым может обращаться головной, заменяются на их имитаторы. Имитатор модуля — простой программный фрагмент, сигнализирующий, о самом факте обращения к имитируемому модулю с необходимой для правильной работы программы обработкой значений его входных параметров и с выдачей, если это необходимо, заранее запасенного подходящего результата. После завершения тестирования и отладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами, если таковые имеются. Для этого имитатор выбранного для тестирования модуля заменяется на сам этот модуль и добавляются имитаторы тех модулей, к которым может обращаться выбранный для тестирования модуль. При этом каждый такой модуль будет тестироваться при «естественных» состояниях информационной среды, возникающих к моменту обращения к этому модулю при выполнении тестируемой программы. Таким образом большой объем «отладочного» программирования заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для подыгрывания процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами.
Рассмотренные методы называются классическими. В них модульная древовидная структура программы должна разрабатываться до начала программирования модулей. Однако такой подход вызывает ряд возражений: маловероятно, чтобы до программирования модулей можно было разработать структуру программы достаточно точно и содержательно. При конструктивном и архитектурном подходах к разработке программ модульная структура формируется в процессе программирования модулей. Конструктивный подход (Модификация нисходящей разработки) Модульная древовидная структура программы формируется в процессе программирования модуля. Сначала программируется головной модуль, исходя из спецификации программы в целом, причем спецификация программы является одновременно и спецификацией ее головного модуля, так как последний полностью берет на себя ответственность за выполнение функций программы. В процессе программирования головного модуля, в случае, если эта программа достаточно большая, выделяются внутренние функции, в терминах которых программируется головной модуль. Это означает, что для каждой выделяемой функции создается спецификация реализующего ее фрагмента программы, который в дальнейшем может быть представлен некоторым поддеревом модулей. Важно заметить, что здесь также ответственность за выполнение выделенной функции берет головной (может быть, и единственный) модуль этого поддерева, так что спецификация выделенной функции является одновременно и спецификацией головного модуля этого поддерева. В головном модуле программы для обращения к выделенной функции строится обращение к головному модулю указанного поддерева в соответствии с созданной его спецификацией. Таким образом, на первом шаге разработки программы (при программировании ее головного модуля) формируется верхняя начальная часть дерева, например, такая, которая показана на рис. 7.1. Рис. 7.1. Первый шаг формирования модульной структуры программы при конструктивном подходе. Аналогичные действия производятся при программировании любого другого модуля, который выбирается из текущего состояния дерева программы из числа специфицированных, но пока еще не запрограммированных модулей. В результате этого производится очередное доформирование дерева программы, например, такое, которое показано на рис. 7.2. Архитектурный подход (модификация восходящей разработки) Модульная структура программы формируется в процессе программирования модуля. Но при этом ставится другая цель разработки: повышение уровня используемого языка программирования, а не разработка конкретной программы. Это означает, что для заданной предметной области выделяются типичные функции, каждая из которых может использоваться при решении разных задач в этой области, и специфицируются, а затем и программируются отдельные программные модули, выполняющие эти функции. Так как процесс выделения таких функций связан с накоплением и обобщением опыта решения задач в заданной предметной области, то обычно сначала выделяются и реализуются отдельными модулями более простые функции, а затем постепенно появляются модули, использующие ранее выделенные функции. Такой набор модулей создается в расчете на то, что при разработке той или иной программы заданной предметной области в рамках конструктивного подхода могут оказаться приемлемыми некоторые из этих модулей. Это позволяет сократить трудозатраты на разработку конкретной программы путем подключения к ней заранее заготовленных и проверенных на практике модульных структур нижнего уровня. Так как такие структуры могут многократно использоваться в разных конкретных программах, то архитектурный подход может рассматриваться как путь борьбы с дублированием в программировании. В связи с этим программные модули, создаваемые в рамках архитектурного подхода, обычно параметризуются для того, чтобы усилить применимость таких модулей путем настройки их на параметры.
Рис. 7.2. Второй шаг формирования модульной структуры программы при конструктивном подходе. Метод нисходящей реализации. Каждый запрограммированный модуль начинают сразу же тестировать до перехода к программированию другого модуля.
Источник: studfile.net
Модульная структура программы
Аннотация: Методы работы с модулями. Стандартные модули языка Pascal. Создание модульных программ. Передача в программу аргументов из командной строки.
Модульность программ
Модуль — это кусок программы, компилируемый отдельно от остальных ее частей. Именно возможность раздельной компиляции и является основным преимуществом модулей .
Простейшая модульность программы может достигаться за счет применения процедур и функций, однако этого не всегда достаточно. Если все подпрограммы содержатся в одном файле, то исправление единственной ошибки в какой-либо подпрограмме приведет к неизбежной перекомпиляции всего кода. А при современных размерах программ компиляция может длиться даже не минуты, а часы.
Кроме того, если коллектив программистов пишет одну большую программу (а именно в таких условиях работают сегодня все производители программного обеспечения), то каждому из них нужно обеспечить более или менее независимый «фронт работ «. Даже два человека не могут одновременно исправлять один и тот же файл , иначе конфликт обновлений будет гарантирован. Что уж тут говорить о проектах, над которыми работают десятки и даже сотни человек! В такой ситуации модули , которые хранятся каждый в отдельном файле и могут быть отредактированы, откомпилированы и протестированы независимо от остальных частей программы, являются наилучшим решением этой проблемы.
Несколько модулей , являющихся составными частями одной программы, объединяются в библиотеку . Например, вместе с компилятором языка Pascal поставляются стандартные библиотеки , содержащие важнейшие подпрограммы обработки данных.
Стандартные модули языка Pascal
Перечислим самые распространенные модули , входящие в состав стандартных библиотек языка Pascal. Подробное описание этих библиотек можно найти в любом справочном издании 1 Например, «Справочник по процедурам и функциям Borland Pascal with Objects 7.0» (сост. И.И. Дериев, С.В. Токарь.
Киев: Диалектика , 1993) или «Программирование на языке Turbo Pascal (версии 6.0 и 7.0). Справочник по процедурам, функциям, диагностическим сообщениям » (сост. В.С. Зубов, М., 1997). .
System
Модуль System является основным: в нем содержатся все изученные нами стандартные процедуры и функции обработки арифметических выражений , множеств, строк и т.п. Специального подключения этот модуль не требует: его содержимым можно пользоваться по умолчанию.
Напомним, что этот модуль содержит следующие типы подпрограмм:
- подпрограммы для обработки величин порядковых типов данных ( dec , inc , odd , pred , succ );
- арифметические функции ;
- функции преобразования типов данных ( chr , ord , round , trunc );
- процедуры управления процессом выполнения программы ( break , continue , exit , halt );
- подпрограммы обработки строк ( concat , copy , delete , insert , length , pos , str , val );
- подпрограммы файлового ввода и вывода ;
- подпрограммы динамического распределения памяти ( dispose , freemem , getmem , new );
- функции для работы с указателями и адресами ( addr );
- а также некоторые другие подпрограммы (например, exclude , include , random , randomize , upcase ).
Crt
Модуль Crt служит для организации «хорошего» вывода на экран. Подробнее о содержимом этого модуля мы расскажем в следующей лекции.
Wincrt
Модуль WinCrt предназначен для создания программ, поддерживающих простейший оконный интерфейс .
Printer
Модуль Printer позволяет производить вывод информации не на консоль, а на принтер (под операционной системой DOS).
Winprn
Модуль WinPrn является аналогом модуля Printer для операционной системы Windows.
Dos
Модуль Dos позволяет обмениваться информацией с операционной системой. Системное время, прерывания, состояния параметров окружения, процедуры обработки процессов, работа с дисковым пространством — всем этим занимается модуль Dos .
Windos
Модуль WinDos является аналогом модуля Dos для операционной системы Windows.
Strings
Модуль Strings позволяет перейти от стандартных строк языка Pascal к строкам, ограниченным нулем. В отличие от обычных строк, чья длина не может превышать 255 символов, эти строки могут состоять из 65 535 символов, причем конец каждой такой строки помечен символом #0 .
Graph
Модуль Graph содержит разнообразнейшие подпрограммы, которые позволяют создавать на экране различные рисунки из многоцветных геометрических фигур . Модуль управляет также палитрами, фактурами фона и шрифтами.
Overlay
Модуль Overlay предоставляет возможность делать большие программы оверлейными (многократно использующими одну и ту же область памяти).
Winapi
Модуль WinApi отвечает за создание динамических библиотек . Этот модуль свойственен лишь поздним версиям языка Pascal (например, Turbo Pascal 7.0).
Источник: intuit.ru
Модульная структура программных продуктов
Модульная структура программы представляет собой древовидную структуру, в узлах которой размещаются программные модули, а направленные дуги показывают статическую подчиненность модулей. Если в тексте модуля имеется ссылка на другой модуль, то их на структурной схеме соединяет дуга, которая исходит из первого и входит во второй модуль. Другими словами, каждый модуль может обращаться к подчиненным ему модулям. При этом модульная структура программной системы, кроме структурной схемы, должна включать в себя еще и совокупность спецификаций модулей, образующих эту систему [37].
Функция верхнего уровня обеспечивается главным модулем; он управляет выполнением нижестоящих функций, которым соответствуют подчиненные модули.
При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее:
- 1) модуль вызывается на выполнение вышестоящим по иерархии модулем и, закончив работу, возвращает ему управление;
- 2) принятие основных решений в алгоритме выносится на максимально высокий по иерархии уровень;
- 3) если в разных местах алгоритма используется одна и та же функция, то она оформляется в отдельный модуль, который будет вызываться по мере необходимости.
Состав, назначение и характер использования программных модулей в значительной степени определяются инструментальными средствами.
Например, при разработке СУБД используются следующие программные модули:
- 1) экранные формы ввода и/или редактирования информации базы данных;
- 2) отчеты;
- 3) макросы;
- 4) стандартные средства для обработки информации;
- 5) меню для выбора функции обработки и др.
Источник: studref.com