This is a guide to using the Glasgow Haskell compilation (GHC) system. It is a batch compiler for the Haskell 1.4 language, with support for various Glasgow-only extensions.
Many people will use GHC very simply: compile some
modules---ghc -c -O Foo.hs Bar.hs
; and link them---
ghc -o wiggle -O Foo.o Bar.o
.
But if you need to do something more complicated, GHC can do that, too:
ghc -c -O -fno-foldr-build -dcore-lint -fvia-C -ddump-simpl Foo.lhs
Stay tuned---all will be revealed!
In this document, we assume that GHC has been installed at your site
as ghc
. The rest of this section provide some tutorial information
on batch-style compilation; if you're familiar with these concepts
already, then feel free to skip to the next section.
The Glorious Haskell Compilation System, as with most UNIX (batch) compilation systems, has several interacting parts:
ghc
---which you
usually think of as ``the compiler''---is a program that merely
invokes/glues-together the other pieces of the system (listed below),
passing the right options to each, slurping in the right libraries,
etc.
unlit
that extracts Haskell
code from a literate script; used if you believe in that sort of
thing.
hscpp
,
only needed by people requiring conditional
compilation, probably for large systems. The ``Haskellised'' part
just means that #line
directives in the output have been
converted into proper Haskell {-# LINE ... -
} pragmas.
You must give an explicit -cpp
option
for the C pre-processor to be invoked.
hsc
,
which---in normal use---takes its input from the C pre-processor
and produces assembly-language output (sometimes: ANSI C output).
hsc
's C output into assembly language for a particular
target architecture. In fact, the only C compiler we currently
support is gcc
, because we make use of certain extensions to the
C language only supported by gcc. Version 2.x is a must; we recommend
version 2.7.2.1 for stability (we've heard both good and bad reports
of later versions).
as
.
ld
.
You invoke the Glasgow Haskell compilation system through the
driver program ghc
.
For example, if you had typed a
literate ``Hello, world!'' program into hello.lhs
, and you then
invoked:
ghc hello.lhs
the following would happen:
hello.lhs
is run through the literate-program
code extractor unlit
, feeding its output to
hsc
, which produces
input for
a.out
.You have considerable control over the compilation process. You feed
command-line arguments (call them ``options,'' for short) to the
driver, ghc
; the ``types'' of the input files (as encoded in
their names' suffixes) also matter.
Here's hoping this is enough background so that you can read the rest of this guide!
On the World-Wide Web, there are several URLs of likely interest:
We run two mailing lists about Glasgow Haskell. We encourage you to join, as you feel is appropriate.
This list is for GHC users to chat among themselves. Subscribe by sending mail to majordomo@dcs.gla.ac.uk, with a message body (not header) like this:
subscribe glasgow-haskell-users MyName <m.y.self@@bigbucks.com>
(The last bit is your all-important e-mail address, of course.)
To communicate with your fellow users, send mail to glasgow-haskell-users@dcs.gla.ac.uk.
To contact the list administrator, send mail to glasgow-haskell-users-request@dcs.gla.ac.uk. An archive of the list is available on the Web: glasgow-haskell-users mailing list archive.
Send bug reports for GHC to this address! The sad and lonely people who subscribe to this list will muse upon what's wrong and what you might do about it.
Subscribe via majordomo@dcs.gla.ac.uk with:
subscribe glasgow-haskell-bugs My Name <m.y.self@@hackers.r.us>
Again, you may contact the list administrator at glasgow-haskell-bugs-request@dcs.gla.ac.uk. And, yes, an archive of the list is available on the Web at: : glasgow-haskell-bugs mailing list archive
There is also the general Haskell mailing list. Subscribe by sending email to majordomo@dcs.gla.ac.uk, with the usual message body:
subscribe haskell My Name <m.y.self@@fp.rules.ok.org>
Some Haskell-related discussion takes place in the Usenet newsgroup
comp.lang.functional
. (But note: news is basically dead at Glasgow.
That's one reason Glaswegians aren't too active in c.f.l.)
The main anonymous-FTP site for Glasgow Haskell is ftp://ftp.dcs.gla.ac.uk/pub/haskell/glasgow. ``Important'' bits are mirrored at other Haskell archive sites (and we have their stuff, too).
forall a. ...
instead of All a => ...
.
-fallow-overlapping-instances
allows overlapping instances
-fallow-undecidable-instances
allows you to write instance contexts that constrain non-type-variables
Documentation in GHC/Hugs Extension Libraries.
Dynamic
Dynamic types.
Exceptions
The library Exception
in -syslib exts
provide an interface for
exception handling. Calls to error
, pattern matching failures and a
bunch of other exception can be caught.
The intermediate language used by GHC has had a radical overhaul. The new Core language (coreSyn/CoreSyn.lhs) is much smaller and more uniform. The main transformation engine (the "simplifier") has been totally rewritten. The compiler is several thousand lines shorter as a result. It's also very much easier to understand and modify. (It's true. Honest!)
There is a completely new runtime system, aimed at integration with Hugs. Tons of cruft removed. Some changes to code generation; things typically run a bit faster as a result.
An overview of the new RTS is available: The New GHC/Hugs Runtime System.
The new storage manager features a dynamically resizing heap, so you
won't need those pesky -H
options anymore. In fact, the -H
option
is now ignored for compatibility with older versions.
Stacks are now also expandable, and the -K
option now specifies a
maximum heap size. The default is (a perhaps conservative) 1M
.
The garbage collector now collects CAFs, so there's no more space leaks associated with these. If you think you have a CAF-related space leak, we'd like to hear about it.
The storage manager current only has a two-space garbage collector, which will be slower than 3.02's generational collector when the amount of live data is large. A new generational collector is high on our priority list.
For the other new tweakables, see Section RTS options to control the garbage-collector.
There is a new profiler based on Cost Centre Stacks. This is an extension of the previous cost centre scheme, whereby the profilier stores information about the call-graph of the program and attributes costs to nodes of this graph.
For a quick demo, try compiling a program with -prof -auto-all
, then
run it with +RTS -p
and see what comes out (in the <prog>.prof
file).
The feature is still experimental, and the call graph may not be exactly what you were expecting. Also, we only have time/allocation profiling at the moment; heap profiling will follow shortly.
forkIO
now returns a ThreadId
, and there's a new operation
killThread
which will terminate an existing thread. See Section
The Concurrent interface for
more details.
-syslib concurrent
to get the Concurrent
library.
foriegn import
and foreign export
for
H/Direct.
-A
RTS option can claw back
some of this speed.