“包”和“模块”有啥区别?

Posted

技术标签:

【中文标题】“包”和“模块”有啥区别?【英文标题】:What's the difference between "package" and "module"?“包”和“模块”有什么区别? 【发布时间】:2011-04-10 12:01:51 【问题描述】:

我在只有包的地方使用 Java。我知道还有其他编程语言也包含模块。

有什么区别?

【问题讨论】:

类似'function'和'method'的区别 【参考方案1】:

很难在虚空中比较语义。 (您指的其他语言是什么?)“模块”可能类似于 Java 类、Java 包或其他完全不同的东西,具体取决于其他语言。通常,由于“模块”往往来自过程语言,我倾向于说 Java 类,但我认为在这一点上这条线非常模糊,你可以非常有说服力地争论包。

【讨论】:

Ruby 也浮现在我的脑海中,我听说 Java7 将包含“模块”...,但总的来说,区别是什么(如果有的话)。例如,在程序世界中,什么是模块? @OscarRyz:关于您的“什么是模块”问题——这实际上取决于您所谈论的程序语言。总的来说,它们是符号范围和打包机制,当然 Java 类和包也是如此。【参考方案2】:

instanceofTom 的评论指出了这一点——不同的语言对包和模块有不同的定义。因此,这个问题没有与语言无关的答案。

我会尝试从我知道的一些语言的角度来回答:

Java:它有一个packages 的概念,它基本上只是一种将Java 类、接口等组织到命名空间中的机制。它们需要层次结构。 packages 没有头等舱身份。还可能值得注意的是,为 Java 7 提议的superpackages 有时也称为modules。

Modula:modules,在概念上与 Java 的 packages 相同。不需要层次结构。

C#:namespaces,在概念上与 Java 的 packages 相同。不需要层次结构。

C++:namespaces,顾名思义,这些只是命名空间。不需要层次结构。

Haskell:modules,在概念上与 Java 的 packages 相同。

Scala:Scala 中的packages 与Java 中的packages 相同,只是它们不需要层次结构。还放宽了其他一些限制,例如每个文件一个公共类。 objects 在 Scala 中也称为模块,也享有一流的地位。

F#:F# 中的 namespaces 与 C# namespaces 相同。除了namespaces,F# 还有modules,它们在CLR 级别实现为带有静态方法的.NET 类。它们不是一流的实体。

【讨论】:

我承认我对 java 的定义也很模糊。好吧,我不会打电话给 CSharp namespaces 任何类似的东西。事实上,同一个命名空间可能会出现在多个 assemblies 中。【参考方案3】:

Java Platform Module System 或 JPMS 在java-9 发布时引入。从那时起,Java 既有packages 又有modules。那么它们有什么区别呢?

什么是包?

包是一个命名空间,它组织了一组相关的类和 接口。

什么是模块?

模块是相关 Java 包和相关资源与描述符文件的集合,其中包含有关此模块公开哪些包/资源、当前模块使用哪些包以及其他一些信息的信息。

我们可以将 Java 模块视为包之上的更高级别的聚合。模块允许您将几个包组织成一个单独的逻辑单元,并将它们作为一个完整的系统分发。 JPMS 还提供了一种方法来控制哪些包对用户可见。

【讨论】:

【参考方案4】:

似乎,正如其他答案所述,模块的概念因一种语言而异,有些甚至没有(但有相应的对应物)。

不过,现在看来,模块更多是一个概念,指的是一组可以独立共享的源代码文件。按照这个定义,Java jar 文件不是模块,因为它们包含字节码编译文件(.class 文件)。符合此定义的模块系统将在 Java 9 (see this article) 中引入,并且存在于具有模块或包管理器的其他语言中,通常直接命名模块 packages (Go lang/go tool , Python/pip, php/Composer...) 其中包一般是打包模块。

【讨论】:

模块是完全源代码的错觉来自可解释的语言(ruby、php、python、js 等),它们没有其他东西可以发布。以及必须在每个平台上重新编译的机器码编译语言(Go、C 等)。 Java 工件的源代码 分布在 jar 中。 Jigsaw 项目下完成的工作与您的定义无关。【参考方案5】:

包比模块更类似于 C++ 命名空间。一个模块更像是一个封闭类而不是一个包。

【讨论】:

Java 9 已过时 对于 C++,模块更像是提议的 c++ 模块。

以上是关于“包”和“模块”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

CMS 中的核心模块和非核心模块有啥区别

python中的模块,库,包有啥区别

安装 Xampp 和 MySql 有啥区别?

包括模块和嵌入模块有啥区别?

函数和模块有啥区别?

服务、指令和模块有啥区别?