Neil Mitchell wrote:
> That would be very neat. Another neat trick would be generalising
> optimisations so that there are fewer and more independant passes,
> this would make it easier to understand (and is what I was working on
> for Yhc).

Well, it's the nature of repeatedly applying local reductions that you
will neither really know what's going nor truly understand how to
improve it. One particular example is the GHC rules mechanism. It's much
better than doing nothing, but it often fails to fuse yet another list.

I think that one can only achieve deterministic optimization by
carefully choosing and exploiting the type system of the intermediate
language. For instance, short cut fusion and strictness analysis can be
expressed as type inference. If you have an intermediate language where
things like boxing and forcing of thunks is explicit and typed, you have
a chance to eliminate such expensive constructs by type inference and
conventional inlining magic.

One point is that local optimization is hard to extend across the
boundaries imposed by recursion and the fixed point combinator. But I
can imagine that switching to a core language with non-totality (lifted
types) manifest in the types, like System F with a fixed point combinator

   fix :: Pointed a => (a -> a) -> a

is key to crossing this boundary.

> Yhc has intermediate code that is substantially more Haskell like, and
> with the command:
> 
> loadCore "file.ycr" >>= writeFile "file.html" . coreHtml
> 
> You can generate an active Html document that lets you explore the
> Core in a more interactive way - including hyperlinks for function
> names, syntax hilighting etc.
> 
> i.e: http://www.cs.york.ac.uk/fp/yhc/Roman.html
> 
> All of these things make playing with Yhc Core much more fun than
> playing with GHC Core. There is absolutely no reason you couldn't add
> all these things to GHC Core, then perhaps you'd save some time when
> it does come to the "examine core" level.

Wow, the core looks really cool! One look and you see it all. I would
even rename the local variables to single letters like a,b,c because the
cryptic numbers are quite hard to track. This is something coreHtml can
do. Also, I'd add more color, like making punctuation marks grey, but
that's a very personal taste.


Concerning the shootout, it deserves much laud for it is certainly not
an easy task to set it up for so many language and it keep running. But
I'm not very fond of the benchmarks themselves.

The goal seems to be to measure how fast different languages can execute
a hard wired algorithm which specifies memory management and data
layout. While this is a valid goal, I don't think it is a worthy one. It
simply does not get to the interesting facts, namely how fast the
natural algorithms for each language are. It just compares highly
artificial algorithm implementations.

Random examples are the nsieves ("count the prime numbers from 2 to M
[...] create a sequence of M boolean flags") and the k-nucleotide
("define a procedure/function to update a hashtable of k-nucleotide
keys") benchmarks. Both boolean flags and hash tables are completely
alien to Haskell. The former would be naturally implemented by a list of
primes, the latter naturally with a generalized trie.

Of course, disallowing unboxed arrays will certainly move Haskell down
the ranking. But what do we gain from unlimited array necromancy? Do we
get a fair account on how fast and short day to day Haskell really is?
And how to tweak the compilers to make day to day Haskell an even more
pleasant experience? I think not. (Do not misunderstand me, ByteStrings
are fine for it is the purely functional style that counts).

And sorry, but using the number of gzipped bytes for comparing the code
length is just ridiculous.


Regards,
apfelmus

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to