命名空间/包/模块的历史?

时间:2010-09-02 13:28:36

标签: language-agnostic namespaces module packages

我一直在研究不同语言如何管理源代码的组织。看来大多数现代语言都使用某种形式的命名抽象容器。它的所谓以及它的实现方式因语言而异,但它归结为一个编程结构,它在文件边界之外运行以组合相关代码。

在Java和.NET语言中,它被用作组织依赖项的基础(包括/导入类所属的命名空间/包,而不是它所定义的文件)。虽然C ++仅将其用于避免名称冲突。

我很好奇谁先提出这个想法以及何时提出这个想法。还有哪种语言是第一个实现它的?

1 个答案:

答案 0 :(得分:0)

命名空间和模块是另外一个问题。命名空间提供标识符的单独概念分组。如果项目A使用命名空间A并且其所有标识符都在A的A或子名称空间中,那么它不能使用命名空间B与项目B冲突。在具有一个大的平面命名空间(如C)的语言中,当不同的项目想要使用时会出现问题相同的标识符。

模块是单独的代码单元。通常它们是文件或文件组,但我认为不可能有严格的定义。模块可以包含包含子模块的子模块。

这里的不同之处在于,虽然每个模块通常以一对一的关系拥有自己的命名空间,但通常不需要它。例如,C ++ STL分为不同的模块,例如<vector><functional>等,但它们都使用相同的命名空间std::。在C中,您可以使用模块化代码(以.c / .h对形式)但您不能拥有名称空间 - 或者等效地,所有模块都使用一个名称空间。

名称“package”通常可能不明确:我看到它指的是命名空间(如Perl),或命名空间/模块组合(如Java)。