static constants -- ideas?

Don Stewart dons at galois.com
Mon Mar 3 17:21:27 EST 2008


jason.dusek:
>   I have an awkward programming problem -- I need to take a
>   dictionary, parse it, build a bunch of intermediate lists and
>   then make maps and tries out of the list. A "programming
>   problem" because it's taken me a fair amount of effort to pull
>   together the parser and list generator -- and "awkward"
>   because a 69000 item list, [(String, [(String, String)])],
>   does not compile under GHC (stack overflow). (It's not likely
>   to compile under anything else, either!)

Here's an example of the approach Bryan outlined, which does seem to
work for files as large as gcc can handle:

    * generate your big Haskell Map
    * serialise it with Data.Binary, and Codec.Compression.GZip to a file
    * compile the data into a C const array, and link that into Haskell
    * decode it on startup, ressurecting the Haskell data.

The C source looks like:

    const uint8_t beowulf[] = { 
        31, 139,   8,   0,   0,   0,   0,   0,   0,   3, 124, 189,  75,
        150,  46,  54,  93, 193,  96, 144, 241, 168, 172, 238, 214,   0,
        ...

    http://code.haskell.org/~dons/code/compiled-constants/cbits/constants.c

which is the gzip, Data.Binary encoded version of a Map ByteString Int.
Then the Haskell code need only access this array as a Ptr Word8, wrap
that as a Bytestring, then run Data.Binary over the result to rebuild
the Map. As you can see here:

    http://code.haskell.org/~dons/code/compiled-constants/Constants.hs

I've put a couple of examples of how to access C-side serialised Haskell
values in a package here:

    http://code.haskell.org/~dons/code/compiled-constants/

Cheers,
  Don


More information about the Glasgow-haskell-users mailing list