Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Compiling Ocaml sources to c sources
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2010-09-14 (12:43)
From: Basile Starynkevitch <basile@s...>
Subject: Re: [Caml-list] Compiling Ocaml sources to c sources
On Tue, Sep 14, 2010 at 02:09:47PM +0200, Vincent Gripon wrote:
>  Hello,
> We are currently planing to participate to a programming contest.

It would be interesting for us to know more about that contest.

> This contest allows the use of four languages (C/C#/C++/java) but
> not OCaml.

That does not mean much. What about libraries you are calling from C?

In particular:

  * can you use any library? This seems strange (because the
    organizers very probably won't have the same libraries or versions
    as you have).

  * do you have any restrictions on the libraries you are using?

  * at the extreme case, the competition might require you to provide
    all the sources of every non standard (in the sense of ISO C
    standard) libraries you are using, and a verified mean to build
    them. What about POSIX system calls?

> We would like to use Ocaml as it is to us the language that fits the
> most the kind of exercises proposed. The organizers don't mind if we
> use OCaml as long as we provide an easily compilable C source to
> them, even if it is not readable.
> Is there any platform independent way to compile OCaml sources to C
> sources? 

I don't see any easy way to do that. There are several issues

  * the Ocaml runtime environment, which not only includes its garbage
    collector but also all the ocaml runtime library.

  * Hacking a C generator inside Ocaml is non-trivial, because of the
    garbage collector, currified function calls, and tail recursion

  * If you really insist on coding in Ocaml and if you don't care much
    about performance, you could take my bit-rotten Ocamljit work (I
    forgot where you can find it, and I don't have it anymore, but
    google should help finding it) and make something which transform
    the entire bytecode of an Ocaml program into a gigantic single C
    function (translating straightforwardly every byte code into a
    small chunk of C code). This is not easy to do, and it might not
    be fun neither. Very probably, a C compiler would have pain to
    optimize such a big function (by personal experience, the GCC
    compiler usually take O(n^2) time to optimize with -O2 a
    sufficiently large function of size n, and may also need O(n^2)
    memory). And such an approach might not produce portable code
    (perhaps there are some issues w.r.t. 32 vs 64 bits
    systems). Actually, portable C is a fiction: only ported C
    programs can exist.

Did you also consider using Scheme, it has several implementations
generating C code (Chicken & Stalin come to mind).

But still, programming in C does not mean much! What about
portability? building? external libraries? linking other stuff? target

If you have complete freedom on what you link with your program, you
could hack a libocamlrun to be linkable, and link the bytecode as an
array, as suggested previously.

I would imagine that preparing stuff to make you code in Ocaml and fit
into the contest rules is a big lot of work.


email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***