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
[Caml-list] Proposal for separate compilation
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2004-05-26 (15:13)
From: Nicolas Cannasse <warplayer@f...>
Subject: Re: [Caml-list] Proposal for separate compilation
> > Currently, a compiled unit (.cmi,.cmo,.cmx,.o) refers to another unit
> > through its symbolic name, as used in the source file.  My proposal is
> > to replace these names with unique identifiers.
> This is an interesting proposal.  You might be interested in Martin
> Elsman's PhD (DIKU, 1998), which uses techniques along these lines in
> a defunctorizing, whole-program SML compiler.
> There is one thing that puzzles me in your proposal.  Consider two
> compilation units A and B, where B refers to A.
> When we compile, it can be that the only thing the compiler knows
> about A is its interface A.cmi.  This is certainly true for ocamlc.
> ocamlopt can take advantage of information on A's implementation, as
> found in A.cmx, but in the current model the presence of A.cmx isn't
> mandatory to compile, ocamlopt will generate less efficient but
> correct code if A.cmx isn't there.
> So, what unique identifier is B going to use to refer to A's definition?
> Since A.cmi is the only available info on A, that
> identifier must be tied to A.cmi: either a hash of A's interface, or
> some unique identifier generated when A.mli is compiled into A.cmi.
> It looks like you're going to get name collisions when several
> compilation units have the same interface.  More generally, you
> haven't fully severed the connection that we have in the current
> system between the identifier representing the definitions of a
> compilation unit and the name or identifier of its interface.
> There are several ways to work around this issue.

Maybe I didn't understand well, but I think I have a more easy answer :
if the identifier is composed of both the hash of the cmi and the name of
the module (so something like (A,hash A)) then we have name collision only
when we have several compilation units with both the same name and same
interface. This is more unlikely to happen, or the user is using two
different implementations of the same module at the same time, and then a
linker error will make him choose one (whatever the choice, the program is
correctly typed but both implementations can have different semantics and
then leave some bugs). Other way is to add some random data to the hash when
the CMI is compiled (and of course ignore this extra-data when recompiling
to avoid spending CPU ).
BTW, is there any way such a proposal will end up into the caml distribution

Best Regards,
Nicolas Cannasse

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: