
Jon Cast
It would not be entirely fair to lay all the blame for large Haskell binaries entirely at the door of static vs. dynamic linking.
Well, considering that compiling the C binary statically linked produces an even bigger executable:
$ gcc -static hello.c -o hello_c $ ls -l hello_c hello_hs -rwxrwxr-x 1 jcast jcast 441624 Jul 23 20:56 hello_c -rwxrwxr-x 1 jcast jcast 157028 Jul 18 14:08 hello_hs
You aren't comparing like with like here. Your hello_c is statically linked with libc, but hello_hs is dynamically linked with libc. Here's what they look like on my machine: 13220 hello_c dynamically-linked 481503 hello_hs dynamically-linked 1444114 hello_c statically-linked (gcc -static ...) 1958990 hello_hs statically-linked (ghc -optl-static ...)
In fact, most of the extra stuff in "Hello World" is there purely to handle all possible error conditions in the I/O monad.
You mean as opposed to C, where most of the extra stuff is there purely to support number formatting?
Ok, point taken. There is a lot of code re-use in both languages. But because Haskell is higher-level, it tends to re-use the lower-level C library in addition to its own libraries. That is all. Regards, Malcolm