为什么GHC这么大/大?

有一个简单的答案:为什么GHC这么大?

  • OCaml:2MB
  • Python:15MB
  • SBCL:9MB
  • OpenJRE - 26MB
  • GHC:113MB
  • 对“如果Haskell是正确的工具,我为什么不应该关心它的大小”这种传福音不感兴趣; 这是一个技术问题。


    这真的有点傻。 每个提供GHC的图书馆都提供不少于4种口味的图书:

  • 静态的
  • 动态
  • 异形
  • GHCI
  • GHCi版本只是在一个.o文件中链接在一起的静态版本。 其他三个版本都有自己的一套接口文件( .hi文件)。 配置文件的版本似乎大约是未打稿版本的两倍(这有点可疑,我应该考虑这是为什么)。

    请记住, GHC本身就是一个图书馆 ,所以你得到4份GHC。 不仅如此,GHC二进制文件本身是静态链接的,所以这是GHC的5个副本。

    我们最近做了这个,让GHCi可以使用静态的.a文件。 这将使我们摆脱这些风味之一。 从长远来看,我们应该动态链接GHC,但这是一个更大的变化,因为这需要动态链接默认设置 - 与C不同,GHC必须决定是否要动态链接。 我们需要进行更多的改变(例如,在Cabal和包装系统等等)之前,这是非常实用的。


    可能我们应该将苹果与苹果,橙子和橙子进行比较。 JRE是一个运行时,而不是开发人员工具包。 我们可以比较:开发工具包的源代码大小,已编译的开发工具包的大小以及最小运行时间的编译大小。

    OpenJDK 7源包是82 MB(download.java.net/openjdk/jdk7)与GHC 7源包(23 MB)(haskell.org/ghc/download_ghc_7_0_1)。 GHC在这里并不大。 运行时大小:Ubuntu上的openjdk-6-jre-headless是77 MB未压缩的,与Haskell helloworld静态链接,其运行时间<1 MB。 GHC在这里并不大。

    在GHC很大的情况下,编译开发工具包的大小是:

    GHC磁盘使用情况

    GHC本身需要270 MB,并且所有库和实用程序结合在一起需要超过500 MB。 是的,这很多,即使有基础库和构建工具/依赖管理器也是如此。 Java开发平台较小。

    GHC:

    $ aptitude show ghc6 | grep Size
    Uncompressed Size: 388M
    

    针对OpenJDK的依赖性:

    $ aptitude show openjdk-6-jdk openjdk-6-jre openjdk-6-jre-headless ant maven2 ivy | grep Size
    Uncompressed Size: 34.9M
    Uncompressed Size: 905k
    Uncompressed Size: 77.3M
    Uncompressed Size: 1,585k
    Uncompressed Size: 3,736k
    Uncompressed Size: 991k
    

    但是在编写时,它仍然超过100 MB,而不是26 MB。

    ghc6和ghc6-prof中的重量级的东西是:

    $ dpkg -L ghc6 | grep '.a$' | xargs ls -1ks | sort -k 1 -n -r | head -3
    57048 /usr/lib/ghc-6.12.1/ghc-6.12.1/libHSghc-6.12.1.a
    22668 /usr/lib/ghc-6.12.1/Cabal-1.8.0.2/libHSCabal-1.8.0.2.a
    21468 /usr/lib/ghc-6.12.1/base-4.2.0.0/libHSbase-4.2.0.0.a
    $ dpkg -L ghc6-prof | grep '.a$' | xargs ls -1ks | sort -k 1 -n -r | head -3
    112596 /usr/lib/ghc-6.12.1/ghc-6.12.1/libHSghc-6.12.1_p.a
     33536 /usr/lib/ghc-6.12.1/Cabal-1.8.0.2/libHSCabal-1.8.0.2_p.a
     31724 /usr/lib/ghc-6.12.1/base-4.2.0.0/libHSbase-4.2.0.0_p.a
    

    请注意libHSghc-6.12.1_p.a 。 所以答案似乎是为每个图书馆的静态链接和分析版本。


    我的猜测 - 大量的静态链接。 每个库都需要静态链接它的依赖关系,而这又需要静态链接它们和soforth。 而且这些都经常在编译和不编译时进行编译,即使没有编译二进制文件也不会被剥离,因此需要保存很多调试器信息。

    链接地址: http://www.djcxy.com/p/7513.html

    上一篇: Why is GHC so large/big?

    下一篇: Load pure global variable from file