+++ /dev/null
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
- <head>
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
- <title>The GHC Commentary - Primitives</title>
- </head>
-
- <body BGCOLOR="FFFFFF">
- <h1>The GHC Commentary - Primitives</h1>
- <p>
- Most user-level Haskell types and functions provided by GHC (in
- particular those from the Prelude and GHC's Prelude extensions) are
- internally constructed from even more elementary types and functions.
- Most notably, GHC understands a notion of <em>unboxed types,</em> which
- are the Haskell representation of primitive bit-level integer, float,
- etc. types (as opposed to their boxed, heap allocated counterparts) -
- cf. <a
- href="http://research.microsoft.com/Users/simonpj/Papers/unboxed-values.ps.Z">"Unboxed
- Values as First Class Citizens."</a>
-
- <h4>The Ultimate Source of Primitives</h4>
- <p>
- The hardwired types of GHC are brought into scope by the module
- <code>PrelGHC</code>. This modules only exists in the form of a
- handwritten interface file <a
- href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/lib/std/PrelGHC.hi-boot"><code>PrelGHC.hi-boot</code>,</a>
- which lists the type and function names, as well as instance
- declarations. The actually types of these names as well as their
- implementation is hardwired into GHC. Note that the names in this file
- are z-encoded, and in particular, identifiers ending on <code>zh</code>
- denote user-level identifiers ending in a hash mark (<code>#</code>),
- which is used to flag unboxed values or functions operating on unboxed
- values. For example, we have <code>Char#</code>, <code>ord#</code>, and
- so on.
-
- <h4>The New Primitive Definition Scheme</h4>
- <p>
- As of (about) the development version 4.11, the types and various
- properties of primitive operations are defined in the file <a
- href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/compiler/prelude/primops.txt.pp"><code>primops.txt.pp</code></a>.
- (Personally, I don't think that the <code>.txt</code> suffix is really
- appropriate, as the file is used for automatic code generation; the
- recent addition of <code>.pp</code> means that the file is now mangled
- by cpp.)
- <p>
- The utility <a
- href="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/utils/genprimopcode/"><code>genprimopcode</code></a>
- generates a series of Haskell files from <code>primops.txt</code>, which
- encode the types and various properties of the primitive operations as
- compiler internal data structures. These Haskell files are not complete
- modules, but program fragments, which are included into compiler modules
- during the GHC build process. The generated include files can be found
- in the directory <code>fptools/ghc/compiler/</code> and carry names
- matching the pattern <code>primop-*.hs-incl</code>. They are generate
- during the execution of the <code>boot</code> target in the
- <code>fptools/ghc/</code> directory. This scheme significantly
- simplifies the maintenance of primitive operations.
- <p>
- As of development version 5.02, the <code>primops.txt</code> file also allows the
- recording of documentation about intended semantics of the primitives. This can
- be extracted into a latex document (or rather, into latex document fragments)
- via an appropriate switch to <code>genprimopcode</code>. In particular, see <code>primops.txt</code>
- for full details of how GHC is configured to cope with different machine word sizes.
- <p><small>
-<!-- hhmts start -->
-Last modified: Mon Nov 26 18:03:16 EST 2001
-<!-- hhmts end -->
- </small>
- </body>
-</html>