|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
编程范型 |
| --- |
|  |
| 指令式 | 
* 过程式
* 块结构
* 例外处理
* 结构化
* 模块化

 |
|  |
| 函数式 | 
* 头等函数
* 纯函数式
* 隐式
* 模式匹配
* 推导式

 |
|  |
| 面向对象 | 
* 基于类
* 基于原型
* 契约式
* 面向方面
* 面向代理

 |
|  |
| 数据流程 | 
* 同步式
* 响应式
	+ 函数式响应式
* 串流处理
* 基于流程

 |
|  |
| 宣告式 | 
* 逻辑式
	+ 回答集
* 约束式
* 数据查询
* 框架本体

 |
|  |
|  | 
* 协程
* 演员模型
* 通信顺序进程
* future/promise
* 分叉会合
* 整体同步
* 映射归约

 |
|  |
| 其他 | 
* 递归
* 阵列式
* 多态
	+ 运算符重载
	+ 泛型
	+ 多分派
* 面向堆栈
* 非确定性
* 数据驱动
* 事件驱动
* 自动机
* 可微分
* 概率式

 |
|  |
| 按语言比较（英语：） |

 |

**模块化编程**（英語：），是强调将计算机程序的功能分离成独立的、可相互改变的"模块"（module）的软件设计技术，它使得每个模块都包含着执行预期功能的一个唯一方面（aspect）所必需的所有东西。

简介
--

模块接口表达了这个模块所提供的和所要求的元素。这些在接口中定义的元素可以被其他模块检测到。模块实现包含了工作代码，它们对应于在接口中声明的元素。

模块化编程密切相关于结构化编程和面向对象编程，它们有着相同目标，即通过分解成更小部份的方式，促进大型软件和系统的建构，并且都大致起源于1960年代。尽管这些术语在历史上的用法曾经是不相容的，在现代的术语运用中：

* 模块化编程，指称将整个程序的代码分开成各部份的高层分解。
* 结构化编程，是采用结构化控制流的低层代码使用。
* 面向对象编程，是对象的"数据"使用，对象是某种数据结构。

在面向对象编程中，使用接口作为一种架构上的模式（pattern）来构造模块叫做基于接口编程 。

历史
--

模块没有包括在最初的ALGOL 68（1968年）规定中，但是作为扩展被包括于早期的实现中，如ALGOL 68-R（英语：）（1970年）和ALGOL 68C（英语：）（1970年），并在此后进行了形式化。开始就设计为模块化编程的第一个语言是Niklaus Wirth的短寿的Modula（1975年）。另一个早期模块化语言是Xerox PARC的Mesa（1976年），Wirth提出了Modula和Mesa的继任者Modula-2（1978年），它影响了以后的语言，特别是通过它的后继者Modula-3（1988年）。

模块化编程从1980年代开始广泛传播：最初的Pascal语言（1970年）不包括模块，但是后来的版本特别是UCSD Pascal（1978年）和Turbo Pascal（1983年），以"单元"的形式包括了它们，受Pascal影响的Ada（1980年）也是如此。扩展Pascal ISO 10206:1990标准，在模块支持上保持接近于Modula-2。Standard ML（1984年）是有着最完全的模块系统的语言之一，包括了在模块间映射的函子（参数化模块）。

在1980年代和1990年代，模块化编程被遮盖于并经常被混淆于面向对象编程，特别是由于C++和Java的流行。例如，C语言家族中的C++（最初在1980年是具有类的C）和Objective-C（1983年）很早就已经支持了对象和类，只在30年后甚至更久之后才支持模块。Java（1995年）以包的形式支持模块，然而代码组织的主要单元是类。但是Python（1991年）从开始就突出的使用模块和对象二者，使用模块作为代码组织的主要单元，使用包作为大尺度的单元；而Perl 5（1994年）包括了对模块和对象二者的支持，具有能从CPAN（1993年）获得的大量的模块。

模块化编程现在已经普及了，自从1990年代以来，它能在几乎所有主要语言的开发中找到。模块的相对重要性因语言而异，并在基于类的面向对象语言中，仍与作为组织和封装的单元的类存在重叠和混淆，尽管它们都被良好的确立为独立的概念。

术语
--

术语汇集（assembly），比如用于.NET语言C#、F#或Visual Basic .NET，或者包（package），比如用于Dart、Go或Java，有时用来替代"模块"。在其他实现中，它们是不同的概念；在Python中，包是模块的搜集，而在Java 9中，介入并实现了新的模块概念（具有增强访问控制的包搜集）。

进一步的，术语"包"在软件中有其他用途（例如.NET NuGet包）。组件（component）是类似的概念，但是典型的用于高层；组件是整个系统的一部份，而模块是个别程序的一部份。术语"模块"的尺度在不同语言之间差异巨大；在Python中它是小尺度的，而每个文件是一个模块；在Java 9中它被规划为是大尺度的，这里的模块是包的搜集，而包是文件的搜集。

其他用于模块的术语包括"单元"（unit），它用于Pascal方言中。

语言支持
----

正式支持模块概念的语言包括：

* Ada
* Algol
* BlitzMax
* C#
* Clojure
* COBOL
* D
* Dart
* eC（英语：）
* Erlang
* Elixir
* Elm
* F（英语：）
* F#
* Fortran
* Go
* Haskell
* IBM/360（英语：）汇编
* 控制语言（英语：）（CL）
* IBM RPG（英语：）
* Java
* MATLAB
* ML
* Modula
* Modula-2
* Modula-3
* Morpho
* NEWP（英语：）
* Oberon
* Oberon-2（英语：）
* Objective-C
* OCaml
* Component Pascal（英语：）
* Object Pascal
* Turbo Pascal
* UCSD Pascal
* Perl
* PL/I
* PureBasic
* Python
* Ruby
* Rust
* JavaScript
* Visual Basic .NET
* WebDNA

参见
--

* 架构描述语言
* 內聚性 (計算機科學)
* 基于组件的软件工程
* 康威定律
* 耦合性 (計算機科學)
* 函式库
* 模組化設計
* 插件
* 片段
* 结构化分析
* 结构化编程

参考文献
----

1. ↑  Lindsey, Charles H.  (PDF). ALGOL Bulletin. Feb 1976, (39): 20–29  [2014-12-01]. （原始内容 (PDF)存档于2016-03-03）.
2. ↑  David MacQueen. : 198–207. August 1984.
3. ↑  James Gosling, Bill Joy, Guy Steele, Gilad Bracha, *The Java Language Specification, Third Edition*, ISBN 0-321-24678-0, 2005. In the Introduction, it is stated "Chapter 7 describes the structure of a program, which is organized into packages similar to the modules of Modula." The word "module" has no special meaning in Java.
4. ↑ .  [2020-04-21]. （原始内容存档于2015-01-05）.
5. ↑ .  [2020-04-21]. （原始内容存档于2019-05-05）.

外部链接
----

* How To Decompose a System into Modules （页面存档备份，存于）

|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| 规范控制 編輯維基數據鏈接 | 
* BNF: cb133251240 (data)
* J9U: 987007541016305171
* LCCN: sh85086464
* NDL: 00567885

 |

 |