Introduction to GHC
This is a guide to using the Glasgow Haskell compilation (GHC) system. It is
a batch compiler for the Haskell 98 language, with support for various
Glasgow-only extensions. In this document, we assume that GHC has been
installed at your site as ghc. A separate document,
“Building and Installing the Glasgow Functional Programming Tools Suite”,
describes how to install ghc.
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!
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 (batch) compilation system components
The Glorious Haskell Compilation System, as with most UNIX (batch)
compilation systems, has several interacting parts:
A driverdriver program
ghcghc—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.
A literate pre-processor
literate pre-processor
pre-processor, literate
unlitunlit that extracts Haskell
code from a literate script; used if you believe in that sort of
thing.
The Haskellised C pre-processor
Haskellised C pre-processor
C pre-processor, Haskellised
pre-processor, Haskellised C
hscpp,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
-cpp option for the C pre-processor to be invoked.
The Haskell compiler
Haskell compiler
compiler, Haskell
hsc,hsc
which—in normal use—takes its input from the C pre-processor
and produces assembly-language output (sometimes: ANSI C output).
The ANSI C Haskell high-level assembler :-)
ANSI C compiler
high-level assembler
assembler, high-level
compiles 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).
The assemblerassembler—a standard UNIX one, probably
asas.
The linkerlinker—a standard UNIX one, probably
ld.ld
A runtime system,runtime system including (most notably)
a storage manager; the linker links in the code for this.
The Haskell standard preludestandard prelude, a
large library of standard functions, is linked in as well.
Parts of other installed libraries that you have at your site may be linked in also.
What really happens when I “compile” a Haskell program?
You invoke the Glasgow Haskell compilation system through the
driver program ghc.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:
The file hello.lhs is run through the literate-program
code extractor unlitunlit, feeding its output to
The Haskell compiler proper hschsc, which produces
input for
The assembler (or that ubiquitous “high-level assembler,” a C
compiler), which produces an object file and passes it to
The linker, which links your code with the appropriate libraries
(including the standard prelude), producing an executable program in
the default output file named 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!
Meta-information: Web sites, mailing lists, etc.
mailing lists, Glasgow Haskell
Glasgow Haskell mailing lists
On the World-Wide Web, there are several URLs of likely interest:
Haskell home page
GHC home page
Glasgow FP group page
comp.lang.functional FAQ
We run two mailing lists about Glasgow Haskell. We encourage you to
join, as you feel is appropriate.
glasgow-haskell-users:
This list is for GHC users to chat among themselves. Subscribe by
sending mail to majordomo@haskell.org, 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@haskell.org.
To contact the list administrator, send mail to
owner-glasgow-haskell-users@haskell.org. An archive
of the list is available on the Web at the glasgow-haskell-users
mailing list archive.
glasgow-haskell-bugs:
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@haskell.org with:
subscribe glasgow-haskell-bugs My Name <m.y.self@hackers.r.us>
Again, you may contact the list administrator at owner-glasgow-haskell-bugs@haskell.org.
And, yes, an archive of the list is available on the Web at the
glasgow-haskell-bugs mailing list archive
There is also the general Haskell mailing list. Subscribe by sending
email to majordomo@haskell.org, 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.)
&relnotes