在流行的编程术语中,这些术语有什么区别,它们之间有哪些重叠?
还有其他相关的术语吗?
在流行的编程术语中,这些术语有什么区别,它们之间有哪些重叠?
还有其他相关的术语吗?
这三者都提供功能。
然而,它们之间有重要的区别。
库 只是一组相关的功能。没有更多或更少。定义库的特征是 你 控制,你 调用库。
框架 的特征是 控制反转。框架会调用 你,而不是反过来。(这被称为“好莱坞原则”: “别打电话给我们,我们会打电话给你。”) 框架在控制。控制和数据的流动由框架管理。
你可以这样想:在两种情况下,你都有一个应用程序,这个应用程序有空缺,在这些空缺中留下了代码,并且需要填补这些空缺。库和框架的区别在于
使用库时,你 写应用程序,并省略了 无聊的 细节,由 库 填充。
使用框架时,框架作者 编写应用程序,省略了 有趣的 细节,由 你 填写。
这有时可能会有点混淆,因为框架本身可能还包含无聊的细节,框架作者使用库填充了其中的部分,你编写的部分可能也包含无聊的细节,可以使用库填充,框架可能会提供一组捆绑库,这些库要么与框架很好地配合,要么与框架经常需要配合使用。例如,在使用 Web 框架编写 Web 应用程序时,可能会使用 XML 生成器库,该 XML 库可能由框架提供或甚至是其固有部分。
然而,这并不意味着库和框架之间没有区别。区别非常明显:控制反转是关键。
模块的定义特征是信息隐藏。一个模块有一个接口,明确但抽象地指定了它提供的功能以及它依赖的功能(通常称为导出和导入功能)。该接口有一个实现(或多个实现),对于使用模块的用户来说,它们是黑盒。
此外,库是相关功能的集合,而模块仅提供单个功能。这意味着,如果您有一个既包含模块又包含库的系统,则库通常会包含多个模块。例如,您可能会有一个包含List
模块、Set
模块和Map
模块的集合库。
虽然可以编写没有模块系统的模块,但最好让模块能够分别编译(对于那些甚至支持这种概念的语言和执行环境而言)、分别部署,并且希望模块组合是安全的(即,组成模块应该工作或在运行时触发错误,但永远不要导致运行时错误或意外行为)。为此,需要模块系统,例如Racket的单元、标准ML的模块和函数器或Newspeak的顶级类。
因此,让我们回顾一下:
您的手指 / 模块:
您可以移动它们、触摸物品,在一只手中有5个,因此可以更轻松地使用它们来握住物品,尽管它们不是身体最大的部分,但却是最有用的部分之一,没有它们,您将无法进行编程!... 模块是程序的一部分,您可以使用它们,将代码扩展到其他文件(而不是一个包含大量代码的大文件),这样可以使代码更易于阅读。
您的手 / 库:
手是由5个手指组成的,您可以拿着物品、移动物品、与它们交互等... 库也是程序的一部分!它们就像一组模块,您可以使用它们与其他程序进行交互或者在您的程序中实现相关功能。
您的身体 / 框架:
您的身体是一个完整的系统,您可以随心所欲地使用它(甚至可以飞行,只需走进一个飞机上即可,飞机是另一个系统),您是独一无二的... 框架就像您的身体,是一个完整的系统,但它本身并不能工作(您需要编写代码herpderp),但是您可以通过一些编程技巧制作出完整的程序。
这只是我的解释... 如果有错误请指出。
我从其他答案中理解到的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是引导加载程序的框架等。包 vs 模块 vs 库 vs 框架:
包 - 一组具有类似功能的类/文件。
模块 - 它是最小的软件单元。它是一组方法/函数,已准备好在其他地方使用。
库 - 它是一组包的集合。它提供了一组可直接使用的功能,而不必担心它是如何编写的。我们所关心的只是输入/输出。
框架 - 它是一组库。除了提供功能外,它还提供了架构设计或线框图。它为您的项目提供了设计良好的模式。我们不包含框架。我们将我们的代码集成到其中。
在我看来,框架
包含了库
,两者都是模块
。
例如,在Swift中,一个模块
是代码分发的单个单位 - 作为单个单位构建和发布的框架
或应用程序。
在模块化编程的上下文中,模块是可以用编程语言表达的实体(通常是编程语言或硬件描述语言),引入可编程性以解决问题。
一些语言明确支持模块概念,并将其作为语言特性提供。一个著名的早期实例是Modular-2。尽管有这个特性,用户仍然可以按照软件设计和项目管理的不同粒度约定其他种类的模块,如源文件和源文件目录。内置的语言特性并不能消除需要不同粒度模块的需求,但人们可能会使用不同的术语来避免与语言特性可能产生的歧义。
一些编程语言并没有提供名为“模块”的特定功能,但用户可以选择将程序的某些部分指定为模块。例如,C语言没有模块,但用户可以按需将函数、源文件、翻译单元(包含其头文件的源文件)甚至一堆文件指定为模块。在这种情况下,模块可以具有不同形式的代码:源代码、来自源代码的二进制代码或提供其他地方的链接兼容性保证,甚至是混合的。一个库是一种专门的程序模块,包含(更具体地说,拥有)一组(子)模块,以一种封装的方式使用(即,在后续使用中不允许直接修改)。通常,库被设计成可重用并部署在非易失性存储器中。通常,库作为一个或多个稳定持久格式的磁盘文件提供。这样的库被称为存档、动态对象、包等。通过外部程序数据库的支持,库也可以通过文件名或其他基于文件的属性之外的方式进行标识。例如,CLI通过GAC的帮助提供库程序集。
我认为框架和库是模块。因为模块是从你的代码中导入或导出的代码。 就像他们说的,框架调用你的代码,你的代码调用库。无论哪种方式,都涉及到一个模块。
库(Library): 一些命名空间化/模块化的代码集合。
框架(Framework): 框架是指一些可重复使用的代码(无论是编译器、设计模式还是其他什么),使得开发者的生活更加便捷,不需要重新发明轮子。
模块(Module): 在JavaScript中,例如一个模块就是一个带有公共属性的对象。我不确定,但我认为对于“模块”这个术语,没有通用的答案。