From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,571930b4ff0bc1ee X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2001-04-02 02:34:46 PST Path: supernews.google.com!sn-xit-02!supernews.com!news.gv.tsc.tdk.com!news.iac.net!newsgate.cistron.nl!newsfeed.wirehub.nl!newsfeeds.belnet.be!news.belnet.be!newsfeed00.sul.t-online.de!t-online.de!grolier!proxad.net!feeder2.proxad.net!nnrp4.proxad.net.POSTED!not-for-mail Message-ID: <3AC84628.D8B70C7C@free.fr> From: Jean-Marc Bourguet X-Mailer: Mozilla 4.76 [en] (X11; U; SunOS 5.7 sun4u) X-Accept-Language: en, French, fr MIME-Version: 1.0 Newsgroups: comp.lang.ada Subject: Re: Compile time executed functions References: <3AC03CCE.70E3C2D5@mida.se> <3AC18DD1.EF25CE42@mida.se> <5mzw6.415$1H6.72722473@newssvr16.news.prodigy.com> <3AC2EB17.33AAEC0A@mida.se> <3AC46252.B7E54EA6@free.fr> <3AC4B7F9.7C73455A@free.fr> <3AC6ED5F.9F2F51A5@free.fr> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Date: Mon, 02 Apr 2001 09:30:27 GMT NNTP-Posting-Host: 158.140.208.29 X-Complaints-To: abuse@proxad.net X-Trace: nnrp4.proxad.net 986203827 158.140.208.29 (Mon, 02 Apr 2001 11:30:27 CEST) NNTP-Posting-Date: Mon, 02 Apr 2001 11:30:27 CEST Organization: Guest of ProXad - France Xref: supernews.google.com comp.lang.ada:6326 Date: 2001-04-02T09:30:27+00:00 List-Id: Ken Garlington wrote: > > "Jean-Marc Bourguet" wrote in message > news:3AC6ED5F.9F2F51A5@free.fr... > > : I think there are NO requirement about generated code excepted the > : observable behavior for conforming program. Everybody would be > : surprised that the generated code for the factorial template I gave > : produced something other than what is generated for > : > : int main() { > : std::cout << 3628800 << std::endl; > : } > > Well, I think you've answered your question, then. > You're not talking about comparing the C++ language with Ada; My question? Me comparing C++ and Ada? I think you are confusing me with somebody else. I came into this thread when you asked for an example of using template in C++ for computing things at compile time to give you one. Then you asked for a formal guarantee that it was computed at compile time. The level at which the C++ standard describe semantic make it impossible to have such guarantee. Do you have a formal guarantee that an Ada compiler does not generate a function to calculate the 10! when you use the litteral 3628800? I don't think so and there is no such guarantee for C++. What the C++ standard does is constraint the expression to be a constant integer expression and allows the defined named and such expressions to be used in place like case labels, array sizes and template parameters where no C++ programmer would expect the expression be evaluated at run-time, where no sane C++ compiler would evaluate the expression at run-time. > So, if you want a particular optimization with an Ada > compiler, then you need to look at the object code generated by that > compiler, and tweak it as needed (and possibly work with the vendor to get > what you want). I think the success of "template meta programming" (as this abuse of the template system is called by some) is the fact that there is no need to count on compiler optimization to get the effect, and you may also do some other things like computing type. So running this #include template struct factorial { enum { RET = factorial::RET*F }; }; template <> struct factorial<1> { enum { RET = 1 }; }; template struct ken { typedef int T; }; template <> struct ken<3628800> { typedef double T; }; int main() { ken::RET >::T x10 = 0.5; ken::RET >::T x11 = 0.5; std::cout << "x10=" << x10 << "\nx11=" << x11 << std::endl; } produces x10=0.5 x11=0 because x10 is a double while x11 is an int. But I agree, that is still not a formal guarantee that the compiler does not compute the type of x10 and x11 at run time :-) Some seems to think that the biggest difference between Ada generic and C++ template is the fact that the templates are instanciated automatically or that they are constrained by use. My point of view is that these differences are syntaxic differences and do not modify significantly the expressing power. I think that the ability to specialize template is a point where the C++ templates are more powerfull than the Ada generics. Yours, -- Jean-Marc