Semenalidery.com

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Модульное программирование поддерживают языки

Модульное программирование

Материал из ПИЭ.Wiki

Суть модульного программирования состоит в разбиении сложной задачи на некоторое число более простых подзадач и составлении программ для решения достаточно независимо друг от друга. Модульность является одним из основных принципов построения программных проектов. В общем случае модуль — отдельная функционально законченная программная единица, некоторым образом идентифицируемая и объединяемая с другими, средство определения логически связанной совокупности объектов, средство их выделения и изоляции. Модуль является средством декомпозиции не только структур управления, но и структур данных. Этому в значительной мере способствовало развитие понятия «тип данных».

Модуль является единицей компиляции, хранения, а также единицей проектирования и раздельной разработки программного проекта коллективом разработчиков. Таким образом, модуль понимается как средство определения логически связанной совокупности объектов, средство их выделения и изоляции.

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

Во-первых, в модуле обычно определяются объекты, являющиеся носителями базовых понятий некоторой «предметной» области, так что модуль задает контекст этой предметной области. Поэтому программы, которые будут выполнять различные алгоритмы обработки в этой области, смогут воспользоваться готовыми и, что важно, одинаковыми определениями базовых объектов.

Во-вторых, и модули, и использующие их программы компилируются независимо (модуль должен быть откомпилирован раньше использующей его программы). Благодаря этому время компиляции большой программы использующей готовые модули, существенно сокращается, что важно при отладке программ, когда приходится их компилировать многократно.

Третьим важным свойством модуля является то, что он скрывает, «инкапсулирует» представление и реализацию экспортируемых им объектов, так что их возможные изменения в модуле (при его настройке или адаптации к новым аппаратным возможностям) не требуют никаких переделок пользовательских программ.

Все модули используют мнемонические имена для определяемых ими объектов (констант, переменных, типов и подпрограмм), что облегчает понимание их назначения и запоминание, удовлетворяет требованию наглядности текста программ.

Языки программирования, поддерживающие модульный подход, описывают модуль как программную единицу, состоящую из двух основных частей — спецификации (интерфейса) и реализации. В спецификации приводятся такие характеристики объектов модуля, которые необходимы и достаточны для использования этих объектов в других модулях и программах. Это позволяет использовать объекты модулей только на основе информации об их интерфейсе (не ожидая их полного описания). В реализационной части модуля описывается представление и алгоритмы обработки, связанные с теми или иными объектами модуля.

Модуль является одним из средств, облегчающих верификацию программ. Модуль, как средство создания абстракции, выделяет спецификацию и локализует сведения о реализации.

Модули служат также целям создания проблемно-ориентированного контекста и локализации машинной зависимости.

Концепция модульного программирования

Концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений:

  • Функциональная декомпозиция задачи — разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач — модулей. Модули связаны между собой только по входным и выходным данным.
  • Модуль — основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой «черный ящик» с одним входом и одним выходом. Модульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение. Дополнительно модульный подход позволяет разрабатывать части программ одного проекта на разных языках программирования, после чего с помощью компоновочных средств объединять их в единый загрузочный модуль.
  • Реализуемые решения должны быть простыми и ясными. Если назначение модуля непонятно, то это говорит о том, что декомпозиция начальной или промежуточной задачи была проведена недостаточно качественно. В этом случае необходимо еще раз проанализировать задачу и, возможно, провести дополнительное разбиение на подзадачи. При наличии сложных мест в проекте их нужно подробнее документировать с помощью продуманной системы комментариев. Этот процесс нужно продолжать до тех пор, пока действительно не удастся добиться ясного понимания назначения всех модулей задачи и их оптимального сочетания.
  • Назначение всех переменных модуля должно быть описано с помощью комментариев по мере их определения.

Модуль (программирование)

Модуль — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части (например, Active Oberon), предназначенный для использования в других программах. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с принципом модульности. Обычно проектируются таким образом, чтобы предоставлять программистам удобную для многократного использования функциональность (интерфейс) в виде набора функций, классов, констант. Модули могут объединяться в пакеты и, далее, в библиотеки. Удобство использования модульной архитектуры заключается в возможности обновления (замены) модуля, без необходимости изменения остальной системы. В большинстве случаев различные модули могут запускаться как на одном сервере, так и на разных, для распределения нагрузки и создания распределенной архитектуры.

История концепции модулей

История концепции модулей, как единиц компиляции, восходит к языкам Фортран II и Кобол, то есть к концу 1950-х годов [1] [2] . В 1976 году появилась публикация, в которой была развита концепция модульности — о языке Mesa (англ.), который был разработан в Xerox PARC. В 1977 году подробно ознакомился с этой концепцией ученый Никлаус Вирт, общаясь с разработчиками в Xerox PARC. [3] Эти идеи были использованы Виртом при создании языка Модула-2, публикация о котором вышла в 1977 году [4] .

Поддерживающие языки

Языки формально поддерживающие концепцию модулей: IBM S/360 Assembler, Кобол, RPG, ПЛ/1, Ада, D, F (англ.) , Фортран, Haskell, Blitz BASIC, OCaml, Паскаль, ML, Модула-2, Оберон, Компонентный Паскаль, Zonnon, Erlang, Perl, Python и Ruby. В IBM System i использовались «модули» от языков RPG, Кобол и CL, когда программировалась в среде ILE.

Модульное программирование может быть осуществлено, даже когда синтаксис языка программирования не поддерживает явное задание имён модулям.

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

Примечания

  1. A brief history of FORTRAN
  2. COBOL Subprograms
  3. Никлаус Вирт. Краткая история Modula и Lilith, перевод с англ. с комментариями в тексте Р. Богатырева
  4. The History of Modula-2 and Oberon

Wikimedia Foundation . 2010 .

Смотреть что такое «Модуль (программирование)» в других словарях:

Модуль — (от лат. modulus «маленькая мера»): В Викисловаре есть статья «модуль» Мо … Википедия

Модуль (значения) — Модуль (от лат. modulus «маленькая мера») составная часть, отделимая или хотя бы мысленно выделяемая из общего. Модульной обычно называют вещь, состоящую из чётко выраженных частей, которые нередко можно убирать или добавлять, не разрушая вещь… … Википедия

Контрактное программирование — (design by contract (DbC), programming by contract, contract based programming) это метод проектирования программного обеспечения. Он предполагает, что проектировщик должен определить формальные, точные и верифицируемые спецификации… … Википедия

Связанность (программирование) — Связанность (англ. coupling) или зависимость (англ. dependency) характеристика взаимосвязи модуля с другими модулями. Это степень, в которой каждый программный модуль полагается на другие модули. Связанность обычно… … Википедия

Функциональное программирование на Питоне — Функциональное программирование является одной из парадигм, поддерживаемых языком программирования Python. Основными предпосылками для полноценного функционального программирования в Python являются: функции высших порядков, развитые средства… … Википедия

Функциональное программирование на Python — Функциональное программирование является одной из парадигм, поддерживаемых языком программирования Python. Основными предпосылками для полноценного функционального программирования в Python являются: функции высших порядков, развитые средства… … Википедия

Объектно-ориентированное программирование на Python — Объектно ориентированное программирование на Python программирование на Python с использованием парадигмы ООП: с самого начала Python проектировался как объектно ориентированный язык программирования[1]. Содержание 1 Введение 1.1 … Википедия

Читать еще:  Разработчик языка программирования паскаль

Аспектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия

Эволюционное программирование — Содержание 1 Эволюционное программирование 2 Современное эволюционное программирование … Википедия

Компонентно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия

C++ и не только

Страницы

среда, 11 декабря 2013 г.

Парадигмы программирования в C++

Парадигмы программирования и их поддержка в разных языках программирования

Парадигма программирования — это стиль написания программ, который подчиняется определенным идеям и правилам.

Объектно-ориентированное программирование является техникой программирования — парадигмой для написания «хороших» программ, решающих различные задачи. Если термин «объектно-ориентированный язык программирования» вообще что-либо означает, он должен означать язык программирования, который предоставляетудобные механизмы поддержки объектно-ориентированного стиля программирования.

Отметим следующий существенный момент. Можно сказать, что язык поддерживает данный стиль, если он предоставляет средства, которые делают использование стиля удобным (достаточно простым, надежным и эффективным). Язык не поддерживает технику программирования, если для написания соответствующей программы требуются чрезмерные усилия либо мастерство. Такой язык просто предоставляет возможности для использования данной техники. Например, можно написать структурную программу на языке Fortran77 или объектно-ориентированную программу на С, но это неоправданно сложно, потому что упомянутые языки не поддерживают соответствующие техники непосредственно.

Поддержка парадигмы проявляется не только в наличии средств языка, позволяющих непосредственно использовать парадигму, но и (более тонко) в виде проверок в момент компиляции и/или выполнения на неумышленное отклонение от парадигмы. Наиболее очевидной иллюстрацией является проверка соответствия типов. Выявление неоднозначности pi проверка во время выполнения также используются для расширения поддержки парадигмы. Дополнительные внеязыковые средства, такие как стандартные библиотеки и среды программирования, также могут существенно улучшить поддержку парадигмы.

Один язык, имеющий некоторое средство, не обязательно лучше другого языка, не имеющего его. Тому есть множество подтверждений. Важным является не то, какие в языке есть средства, а то, что средства, которыми он располагает, достаточны для поддержки соответствующего стиля программирования в требуемых прикладных областях:

  1. Все средства должны быть встроены в язык понятным и элегантным образом.
  2. Должна существовать возможность комбинирования средств для решения задач, которые в противном случае потребовали бы дополнительных, отдельных средств.
  3. Должно быть как можно меньше неестественных средств «специального назначения».
  4. Реализация средства не должна приводить к значительным накладным расходам в не использующих его программах.
  5. Пользователь не обязан знать ничего, кроме того подмножества языка, которое он явно применяет при написании программы.

Первый принцип апеллирует к эстетике и логике, два следующих отражают концепцию минимализма, а два последних могут быть сформулированы так: «то что вам не нужно, не должно мешать».

С++ создавался с целью добавления поддержки абстракции данных, объектно-ориентированного и обобщенного программирования к традиционному языку С с учетом указанных ограничений. Не подразумевалось принуждение всех пользователей к какому-либо конкретному стилю программирования.

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

Парадигмы программирования в C++

Процедурное программирование

Модульное программирование

Парадигмой программирования становится:
Реши, какие требуются модули;разбей программу так, чтобы скрыть данные в модулях. Эта парадигма также известна как «принцип сокрытия данных».

С++ предоставляет механизм группировки связанных данных, функций и т. д. в пространства имен (namespace).

Так как данные — это только часть того, что хочется «спрятать», понятие «сокрытие данных» тривиальным образом расширяется до понятия «сокрытие информации». А именно, имена переменных, констант, функций и типов также могут быть сделаны локальными в модуле. Соответственно, С++ позволяет поместить любое объявление в пространство имен.

Абстракция данных

Модульность — фундаментальный аспект всех успешно работающих крупных систем. Она остается в центре внимания при обсуждении вопросов проектирования. Однако, только модулей недостаточно для ясного представления сложных систем.

С++ стремится решить задачу, позволяя пользователю непосредственно определять типы, которые ведут себя (почти) также, как и встроенные. Такой тип часто называютабстрактным типом данных. Я предпочитаю термин тип, определяемый пользователем (пользовательский тип). Достаточно точное определение абстрактного типа данных потребовало бы «абстрактной» математической формулировки. При ее наличии то, что здесь называется типами, служило бы конкретными примерами таких истинно абстрактных сущностей. Парадигма программирования становится такой:

Объектно-ориентированное программирование

Если рассматривать сущность фигуры Shape и сущность окружности Circle, то можно сделать вывод, что эти сущности обладают общими свойствами: цвет, возможность отрисовки и т.п. И что окружность является частным случаем фигуры Shape, как например квадрат, прямоугольник, треугольник и т.д. При этом Circle обладает своими отличительными свойствами (радиус), сохраняя общие (такие как цвет).

В терминах С++ мы скажем, что класс Circle является производным от Shape, а класс Shape является базовым для класса Circle. Альтернативная терминология называет Circle и Shape подклассом и суперклассом (или надклассом) соответственно. Говорят, что производный класс наследует члены от базового класса, поэтому применение и базового и производного класса в совокупности обычно называют наследованием. Парадигма программирования теперь звучит так:

Реши, какие требуются классы;обеспечь полный набор операций для каждого класса;явно вырази общность через наследование. В тех случаях, когда такой общности нет, достаточно абстракции данных. Степень общности между типами, которую можно выделить, использовав наследование и виртуальные функции, является лакмусовой бумажкой для определения, применим ли объектно-ориентированный подход к данной задаче. В некоторых областях, таких как интерактивная графика, очевидно, что объектно-ориентированное программирование весьма полезно. В других задачах, таких как классические арифметические типы и вычисления, основанные на них, похоже, трудно найти применение чему-то большему, чем абстракция данных, а средства, необходимые для поддержки объектно-ориентированного программирования, выглядят бесполезными.

Выявление общности между типами в системе является нетривиальным процессом. Степень общности, которою можно выделить, зависит от способа организации системы. Когда система проектируется, и даже когда только пишутся технические требования, нужно активно искать общность. Классы можно спроектировать так, чтобы использовать их как строительные блоки для других типов. Следует также проверять, не проявляют ли существующие классы сходства, которые можно выделить в базовый класс.

Обобщенное программирование

Вообще, если алгоритм можно выразить независимо от деталей представления и если это можно сделать приемлемым (с точки зрения накладных расходов) способом и без логических искажений, то так и нужно поступить.

Парадигма программирования для этого стиля звучит та к:

Итоги

Не существует идеальных языков программирования. К счастью, язык программирования и не обязан быть идеальным, чтобы быть хорошим инструментом для написания даже огромных систем. В действительности, язык общего применения не может быть идеальным для всех задач. То, что является совершенством для одной задачи, очень часто оказывается недостатком для другой, потому что достижение совершенства в конкретной области подразумевает специализацию. С++ создавался в качестве удобного инструмента для решения широкого круга задач и для более непосредственного выражения разнообразных идей.

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

Читать еще:  Как включить ноутбук в безопасном

При практическом программирования мало толку от знания самых «тайных» средств языка или от использования максимально возможного количества средств. То или иное средство языка само по себе не представляет большого интереса. Только в контексте общей технологии и других средств оно приобретает смысл и значение. Поэтому пожалуйста помните, что подлинной целью глубокого проникновения в С++ должно быть стремление научиться использовать средства языка в комплексе, опираясь на хороший стиль программирования и выверенные методы проектирования.

Модульное программирование — Modular programming

Модульное программирование является разработка программного обеспечения методами , который подчеркивает , отделяя функциональность программы в независимые, сменные модули , таким образом, что каждый из них содержит все необходимые , чтобы выполнить только один аспект желаемой функциональности.

Интерфейс модуля выражает элементы, которые предусмотрены и требуемые модуль. Элементы , определенные в интерфейсе могут быть обнаружены другими модулями. Реализация содержит рабочий код , который соответствует элементам , объявленных в интерфейсе. Модульное программирование тесно связано с структурного программирования и объектно-ориентированного программирования , все с той же целью содействия строительству крупных программ и систем путем разложения на более мелкие куски, и все происходящие вокруг 1960 — х годов. В то время как историческое использование этих терминов противоречиво, «модульное программирование» относится теперь к разложению высокого уровня кода целой программы на часть: Структурное программирование для использования коды низкоуровневой структурированного потока управления , а также объектно-ориентированный программирование на данных использования объектов , своего рода структуры данных .

В объектно-ориентированном программировании, использование интерфейсов в качестве архитектурного шаблона для построения модулей известно как интерфейс программирования на основе .

содержание

терминология

Термин сборки (как в .NET языках , как C # , F # или Visual Basic .NET ) или пакет (как в Dart , Go или Java ) иногда используется вместо модуля . В других реализациях, это понятие принципиально отличается; в Python пакет представляет собой набор модулей, в то время как в Java- введение новой концепции модуля (сборник пакетов с улучшенным контролем доступа) планируются.

Кроме того, термин «пакет» имеет другое применение в программном обеспечении (например , пакеты .NET NuGet ). Компонент представляет собой аналогичную концепцию, но , как правило , относится к более высокому уровню; компонент является частью целой системы , в то время как модуль является частью индивидуальной программы. Масштаб термина «модуль» существенно различается между языками; в Python очень мелкосерийное и каждый файл представляет собой модуль, в то время как в Java 9 планируется быть крупномасштабными, где модуль представляет собой набор пакетов, которые в свою очередь , коллекции файлов.

Другие термины для модулей включают в себя блок , используемый в Pascal диалектах.

Языковая поддержка

Заметные примеры языков , которые не имеют поддержки модулей C , C ++ и Pascal (в его исходной форме). По состоянию на 2014 год , модули были предложены для C ++; модули были добавлены в Objective-C в IOS , 7 (2013 г. ); и Паскаль был заменен Modula и Oberon, который включал модули с самого начала, а также различные производные , которые включены модули. JavaScript была родных модулей так ECMAScript 2015.

Модульное программирование может выполняться , даже если язык программирования не хватает явных синтаксических функций для поддержки названных модулей, как, например, в С. Это делается за счет использования существующих возможностей языка, а также , например, кодирование конвенций , программирования идиомы и физические структура кода. IBM System я также использует модули при программировании в Integrated Language Environment (ILE).

Ключевые аспекты

С модульным программированием, проблемы разделены таким образом, что модули выполняют логически дискретные функции, взаимодействующие через четко определенные интерфейсы. Часто модули образуют ориентированный ациклический граф (DAG); в этом случае циклическая зависимость между модулями рассматриваются как указывающие , что они должны быть один модулем. В случае , когда модули действительно образуют DAG они могут быть организованы в виде иерархии, где модули низшего уровня являются независимыми, в зависимости от каких — либо других модулей, и модули более высокого уровня , зависит от них более низкого уровня. Особая программа или библиотека представляет собой модуль верхнего уровня иерархии своей собственной, но может , в свою очередь , можно рассматривать как модуль нижнего уровня программы более высокий уровня, библиотеку или систему.

При создании модульной системы, вместо того , чтобы создать монолитное приложение (где наименьший компонент является в целом), несколько небольших модулей записываются отдельно , так когда они сложены вместе, они строят исполняемую прикладную программу. Как правило , они также составлены по отдельности, с помощью отдельной компиляции , а затем соединены линкером . Точно в момент компилятор может выполнить некоторые из этой конструкции «на лету» в момент запуска .

Это делает модульную конструкцию системы, если правильно построить, гораздо более многоразовые , чем традиционные монолитные конструкции, так как все (или многие) из этих модулей могут быть затем повторно (без изменений) в других проектах. Это также облегчает «разрушение» проектов на несколько более мелких проектов. Теоретически, модульный программный проект будет более легко собрать большие командами, поскольку ни один из членов команды не создавать всю систему, или даже нужно знать о системе в целом. Они могут быть направлены только на назначенном меньшую задачу (это, как утверждается, счетчики ключевое предположение о Мифический человеко — месяц , делая это на самом деле можно добавить больше разработчиков к концу программного проекта , не делая его еще позже).

история

Модульное программирование в виде подсистем ( в частности , для I / O) библиотек программного обеспечения и, относится к ранним системам программного обеспечения, где она была использована для повторного использования кода . Модульное программирование сами по себе, с целью модульности, разработанной в конце 1960 — х и 1970 — х года, как более масштабного аналог концепции структурного программирования (1960). Термин «модульное программирование» относится , по крайней мере национальный симпозиум по модульному программированию, организованном в информации и систем Институте в июле 1968 года Ларри Константином ; другие ключевые понятия были скрытие информации (1972) и разделение интересов (SoC, 1974).

Модули , не были включены в оригинальной спецификации для Алгола 68 (1968), но были включены в качестве расширений в ранних реализациях, Алгол 68-R (1970) и Алгол 68C (1970), а позднее формализованы. Одним из первых языков , разработанных с самого начала для модульного программирования был недолгим Modula (1975), по Никлаус Вирт . Другой ранний модульный язык был Mesa (1970 — е годы), по Xerox PARC , и Вирт опиралась на Mesa, а также оригинальной Modula в его преемника, Modula-2 (1978), что повлияло на более поздние языки, в частности , через его преемника, Modula-3 ( 1980 — е годы). Использование Modula по dot- уточненных имен , любят M.a ссылаться на объект a из модуля M совпадает с обозначениями , чтобы получить доступ к области записи (и аналогично для атрибутов или методов объектов), и в настоящее время широко распространены, видели в C #, Dart, Go, Java и Python, среди других. Модульное программирование стало широко распространенным из 1980 — х годов: оригинальный Pascal язык (1970) , не включают в себя модули, но более поздние версии, в частности , UCSD Pascal (1978) и Turbo Pascal (1983) включил их в виде «единиц», как это сделал Паскаль -influenced Ада (1980). Extended Pascal ISO 10206: 1990 стандарт хранится ближе к Модуле-2 в своей модульной поддержке. Standard ML (1984) имеет один из самых полных модульных систем, в том числе функторов (параметризованных модулей) для сопоставления между модулями.

В 1980 — х и 1990 — х годах, модульного программирования был омрачен и часто сплавлены с объектно-ориентированного программирования , в частности , из — за популярности C ++ и Java. Например, семейство C языков была поддержка объектов и классов в C ++ (первоначально C с классами , 1980) и Objective-C (1983), которые поддерживают только модули 30 лет или более поздними. Java (1995) поддерживает модули в виде пакетов, хотя основной единицей организации кода является классом. Тем не менее, в Python (1991) заметно использовал как модули и объекты с самого начала, используя модули в качестве основного блока организации коды и «пакеты» в качестве более масштабного блока; и Perl , 5 (1994) включает в себя поддержку для обоих модулей и объектов, с широким набором модулей будут доступны из CPAN (1993).

Читать еще:  Код безопасности гугл

Модульное программирование в настоящее время широко распространено, и нашло практически во всех основных языках, разработанных с 1990 годом. Относительное значение модулей варьируется между языками, так и в объектно-ориентированных языках на базе классов есть еще перекрывает друг друг и путаницы с классами как единица организации и инкапсулирования, но они оба хорошо установлены в различных концепциях.

Модульное программирование

Параметры процедурного типа

Все рассмотренные параметры подпрограмм позволяли выполнять один и тот же алгоритм с различными данными. В Паскале есть и другая возможность — параметризовать алгоритм функциями и процедурами. Это может пригодиться, если требуется выполнить одну и ту же последовательность действий, внутри которой выполняется обращение к разным функциям или процедурам.

Описание параметра подпрограммы в большинстве случаев состоит из имени и типа. Имя функции является константой процедурного ( функционального ) типа, который требуется описать в разделе type , например:

Здесь вводится описание трех типов. Первый из них соответствует любой функции с одним аргументом вещественного типа, возвращающей вещественное значение, второй — процедуре без параметров, а третий — процедуре с тремя параметрами типа word . Как видно из примеров, описание процедурного (функционального) типа соответствует заголовку подпрограммы без имени. Имя типа используется затем в списке параметров подпрограммы аналогично другим типам.

Пример. Программа, вычисляющая определенные интегралы методом прямоугольников для двух функций

на интервале [a, b] с заданным количеством его разбиений ( пример 4.5).

Вычисление определенного интеграла методом прямоугольников состоит в приближенном подсчете площади, ограниченной осью абсцисс, графиком функции и границами интервала. Интервал разбивается на заданное количество промежутков, и площади получившихся фигур заменяются площадями прямоугольников.

Итак, чтобы передать имя функции или процедуры в подпрограмму, необходимо:

  1. Определить соответствующий процедурный тип.
  2. Задать для функций и процедур, предназначенных для передачи в подпрограмму, ключ компилятора <$F +>, определяющий дальнюю адресацию. При этом компилятор формирует полный адрес, состоящий из сегмента и смещения. Альтернативный способ — указать в заголовке каждой функции директиву far :

function Q(x : real) : real; far;

Рекурсивные подпрограммы

Рекурсивной называется подпрограмма, в которой содержится обращение к самой себе. Такая рекурсия называется прямой. Есть также косвенная рекурсия, когда две или более подпрограмм вызывают друг друга.

При обращении подпрограммы к самой себе происходит то же самое, что и при обращении к любой другой функции или процедуре: в стек записывается адрес возврата, резервируется место под локальные переменные, происходит передача параметров, после чего управление передается первому исполняемому оператору подпрограммы. При повторном вызове этот процесс повторяется. Для завершения вычислений каждая рекурсивная подпрограмма должна содержать хотя бы одну нерекурсивную ветвь, заканчивающуюся возвратом в вызывающую программу.

При завершении подпрограммы область ее локальных переменных освобождается, а управление передается на оператор, следующий за рекурсивным вызовом.

Простой пример рекурсивной функции — вычисление факториала (это не означает, что факториал следует вычислять именно так). Чтобы получить факториал числа n, требуется умножить на n факториал ( n – 1)!. Известно также, что 0! = 1 и 1! = 1.

Рекурсивные подпрограммы чаще всего применяют для компактной записи рекурсивных алгоритмов, а также для работы со структурами данных, описанными рекурсивно, например с двоичными деревьями. Любую рекурсивную функцию можно реализовать без применения рекурсии: для этого программист должен сам обеспечить распределение памяти под необходимое количество копий параметров.

Достоинством рекурсии является компактная запись. К недостаткам относятся расход времени и памяти на повторные вызовы функции и передачу ей параметров, а главное, опасность переполнения стека.

Модули

Модуль — это подключаемая к программе библиотека ресурсов. Он может содержать описания типов, констант, переменных и подпрограмм. В модуль обычно объединяют связанные между собой ресурсы: например, в составе оболочки есть модуль Graph для работы с экраном в графическом режиме. Модули применяются как библиотеки, которые могут использоваться различными программами, и для разбиения сложной программы на составные части.

Чтобы использовать модуль , достаточно знать только его интерфейс: детали реализации модуля скрыты от его пользователя. Это позволяет успешно создавать программы большого объема, поскольку мозг человека может хранить одновременно довольно ограниченный объем информации. Кроме того, использование модулей позволяет преодолеть ограничение в один сегмент на объем кода исполняемой программы, поскольку код каждого подключаемого к программе модуля содержится в отдельном сегменте.

Модули можно разделить на стандартные, которые входят в состав системы программирования, и пользовательские, то есть создаваемые программистом. Чтобы подключить модуль к программе, его требуется предварительно скомпилировать. Результат компиляции каждого модуля хранится на диске в отдельном файле с расширением .tpu.

Описание модулей

Исходный текст каждого модуля хранится в отдельном файле с расширением .pas. Модуль состоит из секций (разделов). Общая структура модуля:

Модуль может использовать другие модули, для этого их надо перечислить в операторе uses , который может находиться только непосредственно после ключевых слов interface или implementation . Если модули подключаются к интерфейсной части, все константы и типы данных, описанные в интерфейсной секции этих модулей, могут использоваться в любом описании в интерфейсной части данного модуля. Если модули подключаются к части реализации, все описания из этих модулей могут использоваться только в секции реализации.

В интерфейсной секции модуля определяют константы, типы данных, переменные, а также заголовки процедур и функций. Полностью же подпрограммы описываются в секции реализации, скрытой от пользователя модуля. Это естественно, поскольку для применения подпрограммы требуется знать только информацию, которая содержится в ее заголовке.

В секции реализации описываются подпрограммы, заголовки которых приведены в интерфейсной части. Заголовок подпрограммы должен или быть идентичным указанному в секции интерфейса, или состоять только из ключевого слова procedure или function и имени подпрограммы. Для функции также указывается ее тип.

Кроме того, в этой секции можно определять константы, типы данных, переменные и внутренние подпрограммы. Они используются внешними элементами модуля и видны только в секции реализации.

Секция инициализации предназначена для присваивания начальных значений переменным, используемым в модуле или в программе, к которой он подключен. Операторы, расположенные в секции инициализации модуля, выполняются перед операторами основной программы. Если к программе подключено более одного модуля, их секции инициализации вызываются на выполнение в порядке, указанном в операторе uses .

В оболочках Borland Pascal и Turbo Pascal результат компиляции по умолчанию размещается в оперативной памяти и на диск не записывается. Поэтому для сохранения скомпилированного модуля на диске требуется установить значение пункта Compile ( Destination в значение Disk. Компилятор создаст файл с расширением .tpu, который надо переместить в специальный каталог, путь к которому указан в пункте меню Options ( Directories в поле Unit Directories.

В качестве примера оформим в виде модуля подпрограмму вычисления среднего арифметического значения элементов массива из пример 4.1 ( пример 4.6).

Список параметров подпрограммы в разделе реализации указывать не обязательно.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector