stringtranslate.com

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

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

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

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

История

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

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

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

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

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

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

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

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

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

Языки, которые формально поддерживают концепцию модуля, включают Ada , ALGOL , BlitzMax , C++ , C# , Clojure , COBOL , Common Lisp , D , Dart , eC, Erlang , Elixir , Elm , F , F# , Fortran , Go , Haskell , IBM/360 Assembler , Control Language (CL), IBM RPG , Java , [a] Julia , MATLAB , ML , Modula , Modula-2 , Modula-3 , Morpho, NEWP , Oberon , Oberon-2 , Objective-C , OCaml , несколько производных Pascal ( Component Pascal , Object Pascal , Turbo Pascal , UCSD Pascal ), Perl , PHP , PL/I , PureBasic , Python , R , Ruby , [4] Rust , JavaScript , [5] Visual Basic (.NET) и WebDNA .

Яркими примерами языков, не поддерживающих модули, являются C , а также C++ и Pascal в их первоначальной форме, однако C и C++ позволяют указывать отдельные компиляционные и декларативные интерфейсы с помощью заголовочных файлов . Модули были добавлены в Objective-C в iOS 7 (2013); в C++ с C++20 [ 6] , а Pascal был заменен Modula и Oberon , которые включали модули с самого начала, и различными производными, которые включали модули. У JavaScript есть собственные модули с ECMAScript 2015.

Модульное программирование может выполняться даже там, где язык программирования не имеет явных синтаксических возможностей для поддержки именованных модулей, как, например, в C. Это делается с использованием существующих языковых возможностей, вместе, например, с соглашениями о кодировании , идиомами программирования и физической структурой кода. IBM i также использует модули при программировании в интегрированной языковой среде (ILE).

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

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

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

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

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

Смотрите также

Примечания

  1. ^ Термин «пакет» используется для аналога модулей в JLS; [3] — см. пакет Java . « Модули », своего рода набор пакетов, планируются для Java 9 как часть проекта Jigsaw; ранее они назывались «суперпакетами» и планировались для Java 7.

Ссылки

  1. ^ Линдси, Чарльз Х. (февраль 1976 г.). «Предложение о модульном устройстве в АЛГОЛЕ 68» (PDF) . ALGOL Bulletin (39): 20–29. Архивировано из оригинала (PDF) 2016-03-03 . Получено 2014-12-01 .
  2. ^ Дэвид Маккуин (август 1984 г.). «Модули для стандартного ML». Труды симпозиума ACM 1984 г. по LISP и функциональному программированию . стр. 198–207. doi :10.1145/800055.802036.
  3. ^ Джеймс Гослинг, Билл Джой, Гай Стил, Гилад Браха, Спецификация языка Java, Третье издание , ISBN 0-321-24678-0 , 2005. Во введении говорится: «Глава 7 описывает структуру программы, которая организована в пакеты, подобные модулям Modula». Слово «модуль» не имеет специального значения в Java. 
  4. ^ «Класс: Модуль (Ruby 2.0.0)».
  5. ^ Спецификация языка ECMAScript® 2015, Модули 15.2
  6. ^ «N4720: Рабочий проект, Расширения C++ для модулей» (PDF) .

Внешние ссылки