我一直在研究不同的语言如何管理源代码的组织。看来大多数现代语言都使用某种形式的命名抽象容器。它的调用及其实现方式在一种语言与另一种语言之间有所不同,但可以归结为一种编程构造,该构造超出了文件边界,可以对相关代码进行分组。
在Java和.NET语言中,它用作组织依赖项的基础(您包含/导入类所属的名称空间/包,而不是包含其定义的文件)。虽然C ++仅将其用于避免名称冲突。
我对谁首先提出这个想法以及何时提出这个想法感到好奇。另外,哪种语言最先实现呢?
最佳答案
命名空间和模块是独立的关注点。命名空间提供了标识符的独立概念分组。如果项目A使用命名空间A,并且其所有标识符都在A或A的子命名空间中,则它无法使用命名空间B与项目B冲突。在一种具有大的扁平命名空间(如C)的语言中,当不同的项目要使用时可能会出现问题。相同的标识符。
模块是单独的代码单元。通常,它们是文件或文件组,尽管我认为不可能有严格的定义。模块可以包含包含子模块的子模块。
此处的区别在于,虽然每个模块通常都以一对一的关系拥有自己的名称空间,但通常不需要。例如,C ++ STL分为不同的模块,例如<vector>
,<functional>
等,但是它们都使用相同的命名空间std::
。在C语言中,您可以具有模块化代码(.c / .h对),但不能具有名称空间-或等效地,所有模块都使用一个名称空间。
通常,“包”的名称可能是模棱两可的:我已经看到它既指名称空间(如Perl),也指名称空间/模块组合(如Java)。