Glasgow mafia meeting at PLDI
Alastair David Reid
reid@cs.utah.edu
22 Jun 2001 19:56:15 -0600
We got 4 Glaswegians (Andy Gill, Andy Moran, Simon Marlow and me)
together in the same room at PLDI for a meeting about the new library
scheme. The following is an attempt to summarise what was said. (I'm
omitting a bunch of recapping what SimonM has already mailed to this
list and I'm surely misrepresenting what was said - it's hard to keep
it all straight after your third latte.)
1) SimonM explained the language change needed to support the module
hierarchy.
2) Whilst looking through the hierarchy, we decided that using "Org"
was a bit unfortunate since it could lead to silly-looking names
like Org.Org.Haskell.... and, worse, downright confusing names
like Org.Com.Galois.
"Domain" was the best alternative we thought of - but it felt
a bit lame.
3) I lamented the fact that GHC's Exception type requires Dynamic
which, in turn, requires that GHC's Prelude contain Dynamic.
If Hugs were to follow suit, Hugs' Prelude would also have to
contain Dynamic - I don't especially like the way the Prelude
gradually sucks all functionality into itself. I got little
sympathy and I think Moore's law was mentioned.
(Next time I'm hacking on the exceptions, I'll probably
add Dynamic in there. Hugs hackers should feel free to add
it first.)
4) SimonM showed us what Prelude.hs looks like in the new scheme:
module Prelude( <huge list goes here> ) where
#if defined GHC
import GHC.Primops
import GHC.WeirdWackyStuff
import GHC.IO
#elsif defined Hugs
import Hugs.PreludeList
import Hugs.<whatever>
#elsif ...
#endif
Looks cool.
Won't work on Hugs because Hugs insists that the Prelude be the
first module loaded but under this scheme, the Prelude is only
loaded after loading the Hugs.* stuff.
Fortunately, I fixed this deficiency in STG-Hugs so all we have to
do is copy the diffs over. IIRC, the changes to support this were
in a separate commit so it should be easy. In my copious free time,
I'll try to get this copied over.
5) We talked a bit about versions. Two attitudes:
1) It is just silly to want to have two different versions of a
given library in the same program. We don't have the manpower
to cope with the complexity. Java doesn't try to tackle this.
2) I'll bet that's what the glibc folk thought too.
Do we have the manpower to keep the whole libraries (and stuff
not in the main repository) in lockstep?
I recalled someone saying that when Java added their name
hierarchy, they had the opportunity to deal properly with
versioning but couldn't remember what had been suggested as the
Right Thing to do. I said I'd look around for anything reasonably
palatable that we could do. (First place to look is on this list
- any suggestions?)
6) GHC's deprecated pragma is cool and would probably be easy to
add to Hugs. Maybe Johan could be persuaded?
7) I abdicated from the position of Hugs Library Czar and Andy Gill
assumed the position.
My resignation didn't go into effect until 7am today so I could
legitimately claim that I was the HLC on my CV :-)
8) Portability
All the core libraries will be required to work on all compilers
(defined to mean GHC, NHC and Hugs).
Less portable libraries should be labelled (where?) with a list of
features that they require (or, looking at it another way, a list
of features that prevent it from being portable). Examples
include, MPTC, unboxed ints, concurrency, preemptive concurrency, ...
There seems to be some kind of connection here between:
1) What you put in a package description to cause both GHC and Hugs
to accept code which uses MPTC.
2) What #ifdef you put in the source code to handle code that needs
MPTC on compilers that lack it.
3) The list of non-portable features a library requires.
9) Responsibilities of people committing code
We pondered requiring an extra layer of review before anyone is
allowed to commit to the libs designated as portable and stable.
(This is required in the OpenBSD kernel.) We saw the attraction
but I'm not sure that anyone wanted to actually do it.
10) Committing broken code to the CVS repository
(Broken == not as portable as the lib claims to be, accidentally
reducing portability, breaking a library that depends on it. Doing
something to the code for someone else's compiler that they would
find intolerable if it happened to the version used with their
favourite compiler. A good approximation is anything that will
break the regression suite.)
Is it ok to commit broken code?
If so, how long can it remain broken before someone has to fix it?
Who's responsibility is it to fix the code.
I think the mood was "it's not ok" and "fixing should take priority
over everything else" and is the responsibility of the person who
committed it.
We talked somewhat aimlessly about (the usual idea of) setting up
a machine whose only job is to keep trying to compile all the
code and run all the tests.
Andy Gill suggested two useful ideas:
1) Define clusters of tests - some of which are so cheap to try
that you can reasonably be expected to try them before doing
a commit. (At least with Hugs and NHC which have more reasonable
build times than GHC and all its little ways.) They would then
get increasingly expensive until you reach the ones that are
so expensive that you have to do round-robin scheduling between
clusters "it's Tuesday so I'd better try bootstrapping GHC with
itself on the ZX81 port".
2) Every time the test machine successfully runs the test suite, it
should tag all the files with the tag "last_stable_version".
Those who find themselves able to resist the bleeding edge would
tend to use this.
[As far as I can tell, this approach will make it safe to do a
checkout anytime you like. Unfortunately, it still won't be
possible to commit into the head until the head is made stable
again - so it won't eliminate the need to be careful not to
break the head. - ADR]
11) Maintainer
Every library will have a single maintainer who acts as a single
point of contact for the library.
[But some of the discussion seemed to suggest that the maintainer
could be a group of people so maybe SimonM meant that there's a
single email address to write to???]
12) Licenses
I think we decided that the essence of the BSD/LGPL debate was:
o BSD fans think that "contamination" is bad
o LGPL fans think that "contamination" is good
This is basically a religious argument on which no agreement is likely
to be reached by zealots on either side.
As far as I [ADR] can tell, the debate about just how the LGPL applies
to Haskell is a red-herring. Even if we understood it and agreed it
was reasonably specified and appropriate in a Haskell context, BSD
fans would still not want LGPL. (That's certainly my own feeling.)
Or, to put it another way, we (had already?) agreed to disagree
and the repository will be partitioned into 2 separate repositories
and packages will contain either pure BSD code or pure LGPL code.
[The Galois people (Andy and Andy) actually work at one of the few
places that really does have significant intellectual property
written in Haskell. I won't attempt to summarise their position on
the license issue or their argument but would encourage them to do
so. Incidentally, it seems that Andy Gill hasn't been getting
library email for the last few weeks - which explains why they've
been so quiet.]
At this point we heard the mountains calling to us and felt obliged to
answer the call. I'm glad to report that no plants were harmed in the
process and that we gave the summits the respect they deserve by
strenuously avoiding any summit-like points on the trail.
--
Alastair Reid reid@cs.utah.edu http://www.cs.utah.edu/~reid/