【问题标题】:Hello world in Haskell is 1.3 mb [closed]Haskell 中的 Hello World 为 1.3 mb [关闭]
【发布时间】:2018-05-10 11:02:13
【问题描述】:

我很失望地发现我在 Haskell 中的 Hello World 可执行文件只有 1.3 mb。这对我来说真的是无法接受的。难道我做错了什么?有什么借口可以让 hello world 可执行文件如此之大?有没有合理的方法来减少这种情况? C 中的相同内容是 8 kb。

main = print "Hello, worlds"

【问题讨论】:

  • 嗯,这取决于上下文。我很高兴看到包含运行时支持库和垃圾收集器的 Haskell 二进制文件占用了如此小的空间 (1MB)。看到 C 语言中的“hello world”占用了如此巨大的空间(8KB),我很难过。
  • 我也觉得它有点大,但请记住,GHC 静态链接可执行文件中的库,至少在默认情况下是这样。我猜如果 GHC 喜欢动态库,并且如果 RTS 也被移动到外部共享库(就像 libc 一样),那么可执行文件会小得多。根据我的经验,对于更复杂的程序,这不是一个严重的问题。
  • 乔恩·珀迪,非常有趣的评论,谢谢。 Chi,我喜欢查看我的可执行文件的汇编输出。我有一种奇怪的恋物癖。

标签: haskell


【解决方案1】:

你没有说是哪个平台或什么版本的 GHC,所以我在这里做一些猜测。

  1. 默认情况下,GHC 不会去除调试符号。在 Linux 上,您可以运行 strip 实用程序来删除这些。在任何平台上,您都可以使用-optl-s 进行编译,以在链接期间自动去除调试符号。

  2. 根据您所使用的平台以及您拥有的 GHC 版本,GHC 默认静态链接您调用的所有 Haskell 库和 Haskell 运行时系统本身(即、垃圾收集器、线程调度程序、事务管理器、I/O 管理器...)如果您的平台支持,打开动态链接可以显着减小可执行文件大小。

另见

【讨论】:

    【解决方案2】:

    每个 Haskell 二进制文件都附带一份运行时系统 (https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts)。无论如何,您可以通过stripping 二进制文件来回收一些空间。

    【讨论】:

      【解决方案3】:

      如果您想要小型二进制文件,请不要将库(包括 RTS)静态链接到二进制文件中:

      % cat x.c
      #include <stdio.h>
      
      int main()
      {
          printf("Hello world\n");
      }
      % gcc x.c && du -h a.out
       12K    a.out
      % cat x.hs
      main :: IO ()
      main = putStrLn "Hello world"
      % ghc -dynamic x.hs && du -h x
      [1 of 1] Compiling Main             ( x.hs, x.o ) [flags changed]
      Linking x ...
       16K    x
      

      【讨论】:

      • 我不知道 RTS 可以像任何其他库一样动态链接。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多