为什么GHC这么大/大?
有一个简单的答案:为什么GHC这么大?
对“如果Haskell是正确的工具,我为什么不应该关心它的大小”这种传福音不感兴趣; 这是一个技术问题。
这真的有点傻。 每个提供GHC的图书馆都提供不少于4种口味的图书:
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本身需要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