【问题标题】:Why does java allow only dynamic linking?为什么java只允许动态链接?
【发布时间】:2023-04-08 01:16:01
【问题描述】:

我正在观看YouTube 上关于编译器的教程视频,当时我发现 C 编程语言更快,因为它允许静态链接和动态链接,但 Java 只允许动态链接,这就是为什么 C比 Java 快得多。

我的问题是,如果静态链接使程序运行得更快,为什么它没有包含在 Java 中?我知道 Java 开发人员做出这个决定不包括静态链接肯定有一些真正的充分理由,我只是想知道原因是什么。

注意:我不知道这个问题是否已经有关于 SO 的答案,但由于我找不到,所以我发布了。如果答案已经存在,请提供一个链接。

注意:所提供教程的链接是印地语。对此感到抱歉。

【问题讨论】:

  • that is why C is much faster than Java - 真的吗?
  • 除了 Andreas 所说的 - 为什么静态链接的支持会使编程语言“更快”总体
  • C 与 Java 的性能受到了广泛的讨论和高度争议,因此我不会将其归类为声明,而是必须在其提出的上下文中看待的观点。
  • "Thus C is much faster than Java". Is this statement wrong? - 是的,就目前而言,这绝对是错误的。如果没有有关具体场景的其他信息,您将无法做出这样的声明。他可能的意思是启动阶段更快 - 但同样,首先这对于简单的应用程序可能是正确的,但对于复杂的应用程序是不同的,其次您需要确定它是否重要(因为启动仅在您启动应用程序时发生一次) .那么,这可能是桌面应用程序的问题,但对于服务器应用程序来说不是问题。

标签: java compiler-construction static-linking dynamic-linking


【解决方案1】:

Java 在编译时不包含链接器步骤。在 Java 9 中,将有一个工具(jlink:JEP 275JavaOne Talk on Project Jigsaw)将创建一个图像,其中链接了依赖项。

Java 创建时的主要目标之一是“一次编写代码,到处运行”。静态链接环境相关库或代码部分将否定此功能。

【讨论】:

  • 学究起来:Java 确实包含一个链接器步骤,这就是类加载中的 resolve 参数所指示的;)特别是,如果您编写跨越类加载器边界的幼稚代码,您将遇到链接器阶段的异常类加载,因为类加载器也充当命名空间。 (意思是类加载器 C1 中的名称 com.acme.A 与类加载器 C2 中的名称 come.acme.A 不同。)
  • 那么,唯一 选择动态链接的原因是“一次编码,到处运行”功能,还是还有其他原因?只是问问。
  • @SajibAcharya 不,这完全是错误的。从概念上讲,没有什么能阻止任何人“静态链接”Java 程序。或者如果有什么问题,这个答案并不能解释原因。
  • 我不明白静态链接如何否定“一次代码,到处运行”。有些语言(Go、Rust 等)使用静态链接,即使使用无发行版或临时镜像也可以容器化和运行。 Java是动态链接的,有“代码一次,到处运行”的口号,但它仍然需要JRE才能运行。
【解决方案2】:

Java 中的静态链接会强制编译器在每个应用程序中添加整个 JRE 库,这会浪费内存,并且会破坏 Java 的一次编译/随处运行的优势。

【讨论】:

    【解决方案3】:

    由于静态链接与动态链接不同,C 并不快。这是一条红鲱鱼。

    Java 加载时间通常很短,因为 VM 和标准库相对较大,这意味着要加载的内容很多。

    确实,动态链接可用于加快初始加载时间,因为有了dlopen() 和朋友,您可以控制加载发生的时间,而不是预先支付费用(加载期间)。

    在这种情况下,一般来说,性能上的一个主要区别在于内存,特别是在 C 中在一定程度上控制内存布局的能力。这可以产生巨大的好处,因为碎片更少并将事情减少到 '缓存大小的 CPU 缓存和推测性硬件优化(如预取)工作得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多