stringtranslate.com

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

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

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

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

История

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

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

В 1980-х и 1990-х годах модульное программирование было в тени объектно-ориентированного программирования и часто смешивалось с ним , особенно из-за популярности C++ и Java. Например, семейство языков C поддерживало объекты и классы C++ (первоначально C with Classes , 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 . , Язык управления (CL), IBM RPG , Java , [a] Julia , MATLAB , ML , Modula , Modula-2 , Modula-3 , Morpho, NEWP , Oberon , Oberon-2 , Objective-C , OCaml , несколько производных от Паскаль ( Компонентный Паскаль , Объектный Паскаль , Турбо Паскаль , UCSD Паскаль ), 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, их можно организовать в виде иерархии, в которой модули самого низкого уровня независимы и не зависят ни от каких других модулей, а модули более высокого уровня зависят от модулей более низкого уровня. Конкретная программа или библиотека является модулем верхнего уровня своей собственной иерархии, но, в свою очередь, может рассматриваться как модуль более низкого уровня программы, библиотеки или системы более высокого уровня.

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

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

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

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

Примечания

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

Рекомендации

  1. ^ Линдси, Чарльз Х. (февраль 1976 г.). «Предложение по созданию модулей в АЛГОЛе 68» (PDF) . Бюллетень Алгола (39): 20–29. Архивировано из оригинала (PDF) 3 марта 2016 г. Проверено 1 декабря 2014 г.
  2. ^ Дэвид МакКуин (август 1984 г.). «Модули для стандартного ML, LFP '84. Материалы симпозиума ACM 1984 года по LISP и функциональному программированию»: 198–207. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  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) .

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