“包”和“模块”有啥区别?
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:它有一个package
s 的概念,它基本上只是一种将Java 类、接口等组织到命名空间中的机制。它们需要层次结构。 package
s 没有头等舱身份。还可能值得注意的是,为 Java 7 提议的superpackage
s 有时也称为module
s。
Modula:module
s,在概念上与 Java 的 package
s 相同。不需要层次结构。
C#:namespaces
,在概念上与 Java 的 package
s 相同。不需要层次结构。
C++:namespaces
,顾名思义,这些只是命名空间。不需要层次结构。
Haskell:module
s,在概念上与 Java 的 package
s 相同。
Scala:Scala 中的package
s 与Java 中的package
s 相同,只是它们不需要层次结构。还放宽了其他一些限制,例如每个文件一个公共类。 object
s 在 Scala 中也称为模块,也享有一流的地位。
F#:F# 中的 namespaces
与 C# namespace
s 相同。除了namespace
s,F# 还有modules
,它们在CLR 级别实现为带有静态方法的.NET 类。它们不是一流的实体。
【讨论】:
我承认我对 java 的定义也很模糊。好吧,我不会打电话给 CSharpnamespaces
任何类似的东西。事实上,同一个命名空间可能会出现在多个 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++ 模块。以上是关于“包”和“模块”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章