English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Caml-list] ocaml and named constants
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2001-05-28 (12:36)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: Re: [Caml-list] ocaml and named constants
> I've noticed that there is no notion of a named constant in ML.  I
> sort of assumed that the compiler could determine that uses of a
> variable after a declaration like
>   let mpg_joint_stereo = 1
> could be compiled as a constant provided the value was never altered
> and no references to the variable were created.  Does the compiler
> actually do this?

Yes, ocamlopt does this for integer constants (and "integer-like"
constants such as characters, booleans, constant constructors)
as part of its integer constant propagation phase.

> I can't see how it could do it for a variable that
> wasn't module local.

The information "mpg_joint_stereo is equal to 1" is stored in the .cmx
file associated with the module, along with other cross-module
optimization information.

> I ask because it seems odd that camlp4 includes
> a feature for creating real defined constants that are textually
> substituted before compilation begins.

One motivation for this is to be able to put named constants in
patterns, e.g.

     match get_next_byte() with
       mpg_joint_stereo -> ...
     | mpg_78rpm -> ...
     | _ -> ...

which cannot be done in plain ML.

Another motivation could be to get "constant inlining" in bytecode
and for non-integer constants.

> Would it be a better bet to use a function like
>   let is_joint_stereo head = (mpg_mode head) = 1
> and hope the compiler inlines the function?

Inlining and integer constant propagation are performed
simultaneously, so this would be at best equivalent
(if both the function and the constant are inlined) 
or less efficient (if neither is inlined).

- Xavier Leroy
To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr