我一直在研究不同的语言如何管理源代码的组织。看来大多数现代语言都使用某种形式的命名抽象容器。它的调用及其实现方式在一种语言与另一种语言之间有所不同,但可以归结为一种编程构造,该构造超出了文件边界,可以对相关代码进行分组。

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

我对谁首先提出这个想法以及何时提出这个想法感到好奇。另外,哪种语言最先实现呢?

最佳答案

命名空间和模块是独立的关注点。命名空间提供了标识符的独立概念分组。如果项目A使用命名空间A,并且其所有标识符都在A或A的子命名空间中,则它无法使用命名空间B与项目B冲突。在一种具有大的扁平命名空间(如C)的语言中,当不同的项目要使用时可能会出现问题。相同的标识符。

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

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

通常,“包”的名称可能是模棱两可的:我已经看到它既指名称空间(如Perl),也指名称空间/模块组合(如Java)。

10-02 03:59
查看更多