【发布时间】:2011-05-05 05:44:40
【问题描述】:
在流行的编程语言中,这些术语有什么区别,又有哪些重叠?
我遗漏了任何相关术语吗?
【问题讨论】:
-
@gavenkoa:请检查问题的日期。这个问题与这个问题重复。
-
这不是一个可以回答的问题。这些术语用于许多不同的事物。
标签: frameworks module
在流行的编程语言中,这些术语有什么区别,又有哪些重叠?
我遗漏了任何相关术语吗?
【问题讨论】:
标签: frameworks module
什么是模块?
这可能因上下文而异,但我相信模块通常只是库的一部分,因为它包含许多对开发人员同样有用的工具(请参阅下面的库说明)。
什么是图书馆?
库是由开发人员构建的代码块(可以是变量、函数、类、接口等形式)的集合,以简化其他开发人员发现其相关性的软件开发过程。
什么是框架?
参考库的定义,我们可以将框架定义为一种工具,通过在受控的开发环境中为开发人员提供必要的库,帮助开发人员解决大量特定领域的问题。
【讨论】:
包 vs 模块 vs 库 vs 框架:
包 - 类似功能的类/文件的集合。
模块 - 它是最小的软件。它是一组可以在其他地方使用的方法/函数。
库 - 它是一个包的集合。它提供了一组随时可用的功能,而无需担心它的编写方式。我们只关心输入/输出。
框架 - 它是一组库。除了功能之外,它还提供架构设计或线框。它为您的项目提供精心设计的模式。我们不包括框架。我们将代码集成到其中。
【讨论】:
图书馆: 命名空间/模块化代码的集合。
框架: 框架是可重用的一段代码(无论是编译器、设计模式还是其他东西),从而使开发人员的生活更轻松,因此他们不必重新发明轮子。
模块: 例如,在 JavaScript 中,模块只是具有公共属性的对象。我不确定,但我认为模块一词没有通用答案。
【讨论】:
module 是modular design 的输出,是一个不同粒度的组件。
在modular programming 的上下文中,模块是可由将可编程性(通常是编程语言或硬件描述语言)引入解决方案的编码语言表达的实体。
某些语言明确支持模块的概念并将其作为语言特性提供。一个值得注意的早期实例是Modular-2。尽管有这个功能,用户仍然可以在软件设计和项目管理中通过不同粒度的约定来指定其他类型的模块,如源文件和源文件目录。内置的语言特性并没有消除对不同粒度模块的需求,但人们可能会使用不同的术语来避免语言特性可能产生的歧义。
其他一些语言不提供名为模块的特定功能,但用户可以选择将程序的一部分指定为模块。例如,C 语言没有模块,但用户可以根据需要将一个函数、一个源文件、一个翻译单元(一个包含头文件的源文件)甚至一堆文件指定为一个模块。在这种情况下,模块可以使用不同形式的代码:源代码、来自源代码的二进制代码或在其他地方提供链接兼容性保证的代码,甚至可以混合使用。
如果有的话,“模块”唯一真正的限制是它应该反映一些模块化设计的结果,因此模块中的组件应该共享一些相似性以使边界清晰。一个模块通常应该为用户提供一些exported接口;它可以选择性地导入来自外部程序组件的依赖项。一些模块可以是其他模块的子模块。
代码管理工具可以利用与模块相关的概念。比如Git就有子模块的概念,本质上是版本库中代码的版本化子目录。
库是一种特殊的程序模块,包含(更具体地说,拥有)一组(子)模块,这些模块将在某些封装中使用(即,不允许在以后使用时直接修改)方式。通常,库被设计为可重复使用并部署在非易失性存储中。通常,一个库以一个或多个磁盘文件的形式以一些稳定的持久格式提供。这样的库被称为档案、动态对象、包等。在外部程序数据库的支持下,库也可以通过文件名或其他基于文件的属性以外的方式来识别。例如,CLI 在GAC 的帮助下提供library assemblies。
框架是另一种特殊的程序模块,它包含各种预先设计的代码功能。一个框架可以以一个或多个库的形式部署。框架与程序中其他种类的模块的区别在于,前者强调一些常见工作的大部分是完整的、冻结的但自适应和可扩展的解决方案,因此框架的用户可以专注于领域特定和项目特定的问题,而不是编写胶水代码来将不同的库放在一起并使它们流畅地工作。但是,这会在整个项目中以设计复杂性为代价。值得注意的是,许多(但不是全部)框架将强制用户的代码遵循IoC 样式。结果,几乎不可能以惯用和自然的方式将相同类型但不同的框架平滑地组合在一起。使用 first-class control effects 的语言,框架中没有明确要求 IoC。然而这意味着普通库与框架功能的组合更容易实现,因此不需要像传统框架那样组织程序模块,这往往容易破坏灵活性。
【讨论】:
在我看来framework 包含libraries 并且两者都是modules。
例如在 Swift 中,module 是单个代码分发单元 — framework 或作为单个单元构建和交付的应用程序。
【讨论】:
我从其他答案中理解的 ASCII 艺术解释:
+-----------------------------------------------+
| ........................... .............. |
| : f1() f2() : f3() : : f4() f5() : |
| : : : : : |
| : l1_module1 : l1_module2 : : l2_module3 : |
| : : : : : |
| --library1----------------- --library2---- |
| |
| application.c |
| |
| #include l1_module2 |
| #include l2_module3 |
| |
| int main() { |
| # case 'reload' |
| f5(); |
| # case 'start' |
| f1(); |
| # case 'stop' |
| f4(); |
| } |
| |
+-----------------------------------------------+
.................................................
: FRAMEWORK_X :
: :
: application start :
: ... :
: application reload :
: application stop :
: ... :
:...............................................:
会发生什么:
开发者安装 library1 和 library2 以便他们可以 使用这些模块内部提供的功能。
然后它们包括 l1_module1 和 l2_module3。 (他们不需要 l1_module2 暂时)。
现在他们可以使用f1、f2、f4和f5的功能, 所以他们编写了他们的应用程序。
现在,因为他们想在某些应用程序中使用 FRAMEWORK_X,他们必须实现这个接口 框架需求:让框架可以调用 申请。
一些注意事项:
main() 的原因)!
或者您可以说引导加载程序是您的操作系统的框架,并且
BIOS 是引导加载程序等的框架。【讨论】:
我相信框架和库都是模块。由于模块是从您的代码导入或导出的代码。 正如他们所说,框架调用你的代码,你的代码调用库。无论哪种方式,都涉及一个模块
【讨论】:
所有这三个都提供功能。
但是,有一些重要的区别。
库只是相关功能的集合。仅此而已,但也仅此而已。库的定义特征是你在控制,你调用库。
框架的定义特征是控制反转。框架调用you,而不是反过来。 (这被称为好莱坞原则:“不要打电话给我们,我们会打电话给你。”)框架在控制之中。控制流和数据流由框架管理。
你可以这样想:在这两种情况下,你都有一个应用程序,而这个应用程序中存在漏洞,其中代码被遗漏了,这些漏洞需要填补。库和库之间的区别一个框架是
使用库,您编写应用程序,而您省略无聊由库填充的细节。
使用框架,框架编写者编写应用程序,并省略您填写的有趣细节。
这有时会有点令人困惑,因为框架本身也可能包含无聊的细节,框架作者填写了库,您编写的部分可能包含无聊的细节,您填写了库,以及框架可能会提供一组捆绑的库,这些库要么与框架很好地配合,要么经常需要与框架一起使用。例如,在使用 Web 框架编写 Web 应用程序时,您可能会使用 XML 生成器库,而该 XML 库可能已由框架提供,甚至是框架的一个组成部分。
但这并不意味着库和框架之间没有区别。区别非常明显:控制反转就是它的全部意义所在。
模块的定义特征是信息隐藏。一个模块有一个接口,它明确地但抽象地指定了它提供的功能以及它所依赖的功能。 (通常称为 exported 和 imported 功能。)这个接口有一个 implementation (或多个实现,实际上),从用户一个模块就是一个黑盒子。
此外,库是相关功能的集合,而模块仅提供单个功能。这意味着,如果您的系统同时包含模块和库,则库通常包含多个模块。例如,您可能有一个集合库,其中包含一个 List 模块、一个 Set 模块和一个 Map 模块。
虽然您当然可以在没有模块系统的情况下编写模块,但理想情况下,您希望您的模块是可单独编译的(对于这种概念甚至有意义的语言和执行环境),可单独部署,并且您希望模块组合是安全的(即组合模块应该在运行前工作或触发错误,但绝不会导致运行时错误或意外行为)。为此,您需要一个模块系统,例如 Racket 的单元、Standard ML 的模块和函子或 Newspeak 的顶级类。
所以,让我们回顾一下:
【讨论】:
您可以通过这种方式查看模块、库和框架:
你的手指/模块:
你可以移动它们,触摸东西,手有 5 个,所以你可以用它们更轻松地拿东西,这些不是身体最大的部分,但却是最有用的部分之一部分,没有它们你就无法破解!... 模块 是程序的一部分,你可以使用它们,将代码扩展到其他文件(不是包含大量代码的大文件),它们让阅读更轻松。
你的手/图书馆:
手是一组 5 根手指,您可以握住东西、移动东西、与它们互动等等……库也是程序的一部分!它们可以看作是一组模块,您可以使用它们与其他程序交互或与您的程序进行相关的事情。
你的身体/框架:
你的身体是一个完整的系统,你可以用你的身体做任何你想做的事(即使是飞,只要走进飞机就可以了,飞机是另一个系统),你是独一无二的...... 框架 是你的身体,一个完整的系统,它不能为自己工作(你需要编写 herpderp 代码) 但你可以通过一些黑客运行来制作一个完整的程序......
只是我的解释......如果我错了,请纠正我。
【讨论】:
大致上,我会这样考虑:模块是功能的可导入“原子”;它定义了可以使用的分组功能的最小子集(请注意,它不是最小的功能单元;那将是一个类(或函数,取决于))。在这种方法中,库将是一组模块;您可以在不使用属于该库的所有模块的情况下使用库。框架是库(可能)依赖的环境;它构成了上述所有工作的基线环境。
请注意,这些术语在某种程度上是可替代的,并且这些定义并不总是在每种情况下都是可靠的;这只是我对我遇到的一些常见用法的解释。
【讨论】:
在我看来,模块可以是库的子集,而库又可以是框架的子集。但我敢肯定,这一点以及基于上下文的各种解释是有例外的——尤其是对于术语模块。
【讨论】: