From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id SAA29953 for caml-redistribution; Tue, 18 Feb 1997 18:38:39 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id RAA29057 for ; Tue, 18 Feb 1997 17:53:09 +0100 (MET) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.7.6/8.7.3) with ESMTP id RAA23270; Tue, 18 Feb 1997 17:53:09 +0100 (MET) Received: (from xleroy@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id RAA29053; Tue, 18 Feb 1997 17:53:08 +0100 (MET) From: Xavier Leroy Message-Id: <199702181653.RAA29053@pauillac.inria.fr> Subject: Re: compilation In-Reply-To: <199702131524.QAA03489@anjou.ens-lyon.fr> from Jean-Christophe Filliatre at "Feb 13, 97 04:24:19 pm" To: Jean-Christophe.Filliatre@ens-lyon.fr Date: Tue, 18 Feb 1997 17:53:08 +0100 (MET) Cc: caml-list@inria.fr MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Sender: weis > [english summary at the end of this mail] > 1. J'aimerai savoir si : > > let b = true > let f = if b then f1 else f2 > > est compilé en f1, c'est-à-dire si la branche d'un "if" est > directement sélectionnée lorsque le booléen est "true" ou "false" > (sans l'évaluer, bien s=FBr ; simplement directement égal à "tru= e" ou > "false" au moment de la compilation) Non, il n'y a pas de propagation des constantes dans le compilateur Objective Caml. Cependant, b n'est teste qu'une seule fois, et non pas a chaque appel de f, qui se branche directement sur le code de f1 (voir question suivante). > La raison de ma question est que cela permettrait d'avoir des options > de compilation directement en Caml sans perdre d'efficacité. C'est possible, a condition de bien sortir les tests des fonctions. P.ex. ne pas ecrire let f x = if debug then ...; ... (test a chaque appel de f), mais plutot let f = if debug then fun x -> ...; ... else fun x -> ... > 2. de la même manière, est-ce que > > let f = fun x -> e > let f1 = f > =09 > est compilé en rempla=E7ant tout appel à f1 par un appel à f ? Oui. En fait, les identificateurs f et f1 ont la meme valeur fonctionnelle, qui est une fermeture du code de fun x -> e. > Ma question est, là encore, de savoir si on ne perd pas > d'efficacité en renommant des fonctions. Il n'y a pas de surcout a l'appel de fonction. - Xavier Leroy > =english====================== ========================== ======================= > > 1. I would like to know if > > let b = true > let f = if b then f1 else f2 > > is compiled as f1, that is if the branch of an "if" expression is > directly selected when the boolean expression is "true" or "false" > (without performing any computation on it, of course; just directly > equal to the constructor "true" or "false"). No, there's no constant folding in the compiler. However, b will be tested only once, not at each call to f, so that's still fairly efficient. > 2. the same way, is > > let f = fun x -> e > let f1 = f > > compiled by replacing any call to f1 by a call to f ? No, f and f1 have the same functional value: a closure of the code for fun x -> e. > The question is still to known if we don't loose efficiency by > renaming functions. We don't.