【问题标题】:History of Namespaces/Packages/Modules?命名空间/包/模块的历史?
【发布时间】:2010-09-02 21:37:32
【问题描述】:

我一直在研究不同语言如何管理源代码的组织。似乎大多数现代语言都使用某种形式的命名抽象容器。它的名称和实现方式因一种语言而异,但归根结底是一种编程结构,可以超越文件边界对相关代码进行分组。

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

我很好奇是谁首先提出了这个想法,什么时候提出的。还有第一个实现它的语言是什么?

【问题讨论】:

  • 您仍在混淆模块和命名空间。 C++ 使用命名空间来避免名称冲突,并使用其他方法来创建模块。命名空间和模块是不同的
  • 正如您所指出的,术语模块不能被严格定义,因为它的定义因一种语言而异。
  • 当我说“没有严格的定义”时,我的意思是它不一定只是一个文件或一个类;它可能是一组文件或一组类,或者每个文件可能有多个模块。但是无论你怎么看,一个模块都是一个代码分组单元,而不是一个名称分组单元。

标签: language-agnostic namespaces module packages


【解决方案1】:

命名空间和模块是独立的关注点。命名空间提供标识符的单独概念分组。如果项目 A 使用命名空间 A 并且它的所有标识符都在 A 或 A 的子命名空间中,那么它不会与使用命名空间 B 的项目 B 发生冲突。在像 C 这样具有一个大的扁平命名空间的语言中,当不同的项目想要使用时可能会出现问题相同的标识符。

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

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

一般来说,“包”这个名字可能是模棱两可的:我见过它指的是命名空间(如在 Perl 中)或命名空间/模块组合(如在 Java 中)。

【讨论】:

  • 所以它们是不同的概念。 Java 和 .NET 通过将命名空间和模块组合成一个结构,一石二鸟。很高兴知道。这仍然没有开始回答我最初的问题:谁发明了命名空间?谁发明了模块?它们是什么时候第一次用一种语言实现的?
  • @code:我没有回答那部分,因为我不知道 :) 我想模块几乎和子程序一样古老,而且它们的模糊定义很难准确追踪。命名空间似乎没有出现在 1950 年代和 60 年代的语言中,例如 fortran、lisp、algol; C++ 和 Perl 都在 1990 年代获得了它们的命名空间特性;所以他们的发明(或至少普及)有一个上限和下限。
猜你喜欢
  • 2018-03-07
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2014-01-26
  • 2013-05-07
  • 2014-02-12
  • 2011-06-26
相关资源
最近更新 更多