From: Francois Pottier <francois.pottier@inria.fr>
To: caml-list@inria.fr
Subject: Re: [Caml-list] optimizing functors
Date: Tue, 5 Feb 2002 09:11:08 +0100 [thread overview]
Message-ID: <20020205091108.A26664@pauillac.inria.fr> (raw)
In-Reply-To: <Pine.GSO.4.03.10202041337360.28015-100000@basilic.ens.fr>; from David.Monniaux@ens.fr on Mon, Feb 04, 2002 at 01:50:06PM +0100
On Mon, Feb 04, 2002 at 01:50:06PM +0100, David Monniaux wrote:
>
> In code containing many modules consisting of a few small functions called
> by functions in functors, this lack of optimization may be costly.
>
> I was thinking of implementing such functors similarly as C++ templates
> (expanding the functor parameters). Has some work been done on this?
I am also of the opinion that the current compilation scheme creates
a tension between modularity and efficiency, and that people (including
myself) are too often tempted to choose efficiency.
I have given some thought to writing a source-to-source defunctorizer, i.e. a
tool that expands functors and modules away, and produces a flat O'Caml
program, which can then be fed to the normal ocamlopt compiler. There are two
conceptually independent tasks to be performed: reducing functor applications
and flattening modules (i.e. removing nested modules). Perhaps the latter can
be neglected, as (I believe) ocamlopt produces good code for nested modules.
I quickly ran into problems when trying to define a source-level reduction
semantics for O'Caml functors. O'Caml's source syntax was clearly not meant to
express its own reduction semantics, and this shows through the lack of
alpha-conversion (renaming) facilities. Indeed, it is easy to rename a program
variable by introducing a `let' binding, but there is no or little provision
to rename types, data constructors, record labels, etc. Consider the following
example:
(* functor definition site *)
type t = A
module F (X : sig ... end) = struct
let x = A
end
...
(* functor application site *)
type u = A | B
module M = F (struct ... end)
Expanding the call to F causes the data constructor name A (in the definition
of x) to be captured, and there seems to be no simple way of avoiding it.
Another problem is caused by the current type system for `applicative'
functors. The type system is able to keep track of the fact that two modules
have the same type because they arise out of the same functor application. (In
other words, functor applications may appear in types.) Expanding away
functor applications causes this information to be lost, which potentially
makes the program ill-typed. There may be a work-around, but it isn't
pretty. (All I could think of was to keep the functor around, and to use
explicit type equations to propagate the type information that was available
in the original program, e.g.
module F = functor (...) struct type t = ... end
module N = F(M) (* N.t == F(M).t *)
would become
module F = functor (...) struct type t = ... end
module N = struct type t = F(M).t = ... end
A bit ugly, but could be made to work, I believe.)
Given these difficulties, I haven't looked any further into source-to-source
defunctorization. Some defunctorizers have been written for Standard ML. One
is part of the BANE program analysis toolkit:
http://www.cs.berkeley.edu/Research/Aiken/bane.html
Another defunctorizer was written by Martin Elsman:
http://www.dina.kvl.dk/~mael/papers.html
See the paper `Static Interpretation of modules'. This one doesn't work at
the source level, however, I believe.
In light of the current syntax war on the caml-list, I would suggest, if a new
syntax is to be adopted, that it be able to express a reduction semantics for
the language. This would make source-to-source transformations a whole lot
easier.
--
François Pottier
Francois.Pottier@inria.fr
http://pauillac.inria.fr/~fpottier/
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
next prev parent reply other threads:[~2002-02-05 8:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-01-31 6:49 David Monniaux
2002-02-02 17:59 ` Xavier Leroy
2002-02-04 12:50 ` David Monniaux
2002-02-05 8:11 ` Francois Pottier [this message]
2002-02-04 14:12 Michael Hicks
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=20020205091108.A26664@pauillac.inria.fr \
--to=francois.pottier@inria.fr \
--cc=caml-list@inria.fr \
/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