tags:

views:

383

answers:

5

Say I have a Haskell program or library that I'd like to make accessible to non-Haskellers, potentially C programmers. Can I compile it to C using GHC and then distribute this as a C source?

If this is possible, can someone provide a minimal example? (e.g., a Makefile)

Is it possible to use GHC to automatically determine what compiler flags and headers and needed, and then perhaps bundle this into a single folder?

Basically I'm interested in being able to write portions of programs in C and Haskell, and then distributing it as a tarball, but without requiring the target to have GHC and Cabal installed.

A: 

Can I compile it to C using GHC and then distribute this as a C source?

No it is not possible but you can easily create interface between haskell and c by using the Foreign Function Interface (FFI) of Haskell.

You can have more example here.

Phong
It might be vaguely possible... compile with `-fvia-c -keep-tmp-files -v`, track the exact gcc invocations, and distribute appropriate bits of the RTS... but it doesn't seem nice at all.
ephemient
+2  A: 

Even if you could, I wouldn't call it "C source". GHC can use C as part of its compilation system, but the generated C code is not even slightly readable. Even if it could be read and understood, it would make no sense to modify it because there is no way (apart from back-porting the changes into Haskell) to incorporate any modifications made by C hackers into future versions of your program.

The term "source" means the code that is written by a human and used to generate the program. In this case that is the Haskell. C generated by a compiler is not "source code", it is an intermediate representation.

Paul Johnson
-1: I completely disagree with the statement that "source" must be "source code".
trinithis
@trinithis: while one may suggest that the real source is in the developer's brain (or even in the big-bang, the holy spirit, or some floating spaghetti), it may be useful to use the term "source" as the origin of the information contained in the computer. that would be the data entered and recorded by the users. in this sense, Paul Johnson is 100% correct.
yairchu
the semantics of the word "source" has no relation to my question.. i was asking if it's possible to distribute C *files* that are the result of compiling Haskell, I don't care what they are called.
Steve
+5  A: 

I'm interested in being able to write portions of programs in C and Haskell, and then distributing it as a tarball, but without requiring the target to have GHC and Cabal installed.

You're asking for an awful lot of infrastructure that you're unlikely to find. Remember that any Haskell program, even if it is going to be compiled to C, is almost certain to depend on a large, complex run-time system for its correct operation. At a bare minimum, that run-time system has to support garbage collection and lazy evaluation. So you have more than just a translation problem.

I suggest you tackle this problem as a software-distribution problem. Rather than a tarball, provide a package for your favored distribution platform (Debian, Red Hat, InstallShield, whatever). Personally, in order to reuse other people's efforts, I would aim for something that checks for Cabal, installs Cabal if needed, then uses Cabal to install the rest of what your users will need.

Norman Ramsey
i'll accept this, but i don't imagine haskell's runtime must be so large and complex. but in any case it seems non-trivial so i'll give it to you.
Steve
@Steve: In 2005 the GHC run-time system was four times the size of Version 6 Unix. Since then it has only gotten bigger.
Norman Ramsey
+2  A: 

You can't get there with GHC. Even when it compiles via C, GHC relies on manipulating the resulting assembly to shuffle segments around, a huge runtime system and a LOT of baggage.

On the other hand, you might have better luck if what you want is supported by somewhat more limited feature set of John Meacham's JHC compiler, however, which generates fairly compact C output.

Edward Kmett
GHC only uses those tricks in registered builds; see http://hackage.haskell.org/trac/ghc/wiki/Building/Unregisterised .
ephemient
+1  A: 

You can do this with jhc. It's a full program optimizing compiler that compiles down to C. It doesn't have all the fancy extensions that GHC supports though.

wnoise