caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Xavier Leroy <xavier.leroy@inria.fr>
To: Eric Stokes <eric.stokes@csun.edu>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Ocaml shared libraries
Date: Mon, 17 May 2004 10:22:54 +0200	[thread overview]
Message-ID: <20040517102254.A22324@pauillac.inria.fr> (raw)
In-Reply-To: <B861BF3A-A7C8-11D8-B8C2-000A95A1E69A@csun.edu>; from eric.stokes@csun.edu on Sun, May 16, 2004 at 11:09:13PM -0700

> 	As the director of a shop who is using Ocaml to do real work
> (yes I know, research is more important :P), I would really like to
> be able to build a shared library out of code that I have written in
> Ocaml, and link other Ocaml programs to it. [...]

I'm not sure which aspect of shared libraries you're interested in.
Unix shared libraries or Windows DLL offer the following features:
1- Smaller executables through code sharing.
2- Upgradeability: upgrade the shared library and (with luck) all
   executables that refer to it are automatically upgraded.
3- Dynamic loading of code in a running program.

There is however one big difference between C and OCaml, which is that
OCaml has type-safe linking.  The linker checks that clients of a
library were typed and compiled against the interface and cross-module
optimization information of the library.  

As it is done today, this check is rather brittle: any change in the
library interface or optimization information cause it to fail and
require a recompile of the client modules.

For static linking, this is not too bad: a package management
framework such as GODI can automate the recompilation of clients when
the library changes.  More importantly, you need to bring things in
sync only when you're rebuilding your client: already compiled
programs continue to work, since they embark their own version of the
library.

With shared libraries, any update on the shared lib would immediately
invalidate all executables that use it.  This is the well-known "DLL
hell" problem, just exacerbated by the very strict consistency
checkings done by the OCaml linker.  So, feature 2- above is really
not applicable to OCaml as it is today, and static linking is much
more usable than dynamic linking of shared libs.

As for feature 1- (smaller executables), I'm not convinced this is a
major issue.  I'm old enough to remember the introduction of shared
libraries in the Unix world (in SunOS 4).  At that time, the saving in
disk space was significant: disks were small (a complete SunOS 4
install could fit in as little as 100 Mb) and the size of executables
wasn't negligible compared to the size of data files.  Times have
changed, however: disk space has increased much faster than executable
sizes, and the disks on a modern machine are mostly filled with data
(think MP3 and movies :-), making executable sizes a non-issue.

Feature 3- (dynamic code loading) is already available in bytecode
through the Dynlink API.  I understand there's a demand for having it
in native-code as well, and that might be possible without too much fuss,
at least on selected operating systems.

So, in summary: shared libraries are simply too fragile, especially
when combined with OCaml's type-safe linking.  This is such a big
problem that the drawbacks of static linking (bigger executables)
appear very minor in comparison.

- Xavier Leroy

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2004-05-17  8:23 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-17  6:09 Eric Stokes
2004-05-17  7:46 ` skaller
2004-05-17  8:22 ` Xavier Leroy [this message]
2004-05-17 11:12   ` Michal Moskal
2004-05-17 13:45   ` John Goerzen
2004-05-17 14:27   ` Eric Stokes
     [not found]     ` <20040517.165146.60944531.andrieu@ijm.jussieu.fr>
2004-05-17 15:22       ` Eric Stokes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040517102254.A22324@pauillac.inria.fr \
    --to=xavier.leroy@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=eric.stokes@csun.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).