Difference between revisions of "Ministg"

From HaskellWiki
Jump to navigation Jump to search
Line 30: Line 30:
 
Ministg accepts programs written in the core syntax from the "fast curry" paper. At the moment programs are not type checked. Here is a definition of the foldl function:
 
Ministg accepts programs written in the core syntax from the "fast curry" paper. At the moment programs are not type checked. Here is a definition of the foldl function:
 
<haskell>
 
<haskell>
  +
nil = CON(Nil);
  +
one = CON(I 1);
  +
two = CON(I 2);
  +
three = CON(I 3);
 
plusInt = FUN(x y ->
 
plusInt = FUN(x y ->
 
case x of {
 
case x of {

Revision as of 14:28, 19 August 2009

Ministg

Ministg is an interpreter for a high-level, small-step, operational semantics for the STG machine. The STG machine is the abstract machine at the core of GHC. The operational semantics used in Ministg is taken from the paper Making a fast curry: push/enter vs. eval/apply for higher-order languages by Simon Marlow and Simon Peyton Jones.

Ministg follows the rules in the paper very closely, to the point that each evaluation rule in the paper corresponds to an equation in the interpreter. This makes is easy to check that the interpreter follows the rules properly, and it also makes is easy to understand how new rules can be added, and what effect they might have.

Motivation

The main motivations for Ministg are twofold:

  1. To illustrate the dynamic behaviour of the STG machine.
  2. To provide a simple testbed for STG extensions.

It is expected that Ministg will be useful two main groups of people:

  1. Researchers who are working on the STG machine (and GHC's backend in general).
  2. Students who are learning about the implementation of programming languages (especially of the lazy functional kind).

Feature summary

The following is a summary of the main features of Ministg; they are discussed in more detail below:

  • Support for both the push/enter and eval/apply rules for partial function applications.
  • Optional tracing of program execution, rendered in HTML.
  • Optional garbage collection.
  • Optional standard Prelude of useful functions (much like Haskell).
  • Optional call-stack tracing and stack dumping on errors.
  • Program annotations for call-stack tracing, similar to GHC's scc annotation for cost centre stacks.
  • Optional automatic call-stack annoation of top-level declarations in the program, similar to GHC's --auto-all option for profiling.

Source language

Ministg accepts programs written in the core syntax from the "fast curry" paper. At the moment programs are not type checked. Here is a definition of the foldl function:

nil = CON(Nil);
one = CON(I 1);
two = CON(I 2);
three = CON(I 3);
plusInt = FUN(x y ->
   case x of {
      I i -> case y of {
               I j -> case plus# i j of {
                         x -> let { result = CON (I x) } in result }}});
foldl = FUN(f acc list ->
   case list of {
      Nil -> acc;
      Cons h t -> let { newAcc = THUNK(f acc h) } in foldl f newAcc t
   });
# lazy sum with a well-known space leak
sum = FUN(list -> foldl plusInt zero list);
list1 = CON(Cons one nil);
list2 = CON(Cons two list1);
list3 = CON(Cons three list2);
main = THUNK(sum list3)

Execution tracing

One of the most useful features of Ministg is its ability to trace the steps of program execution. If tracing is enabled, Ministg will save each step of execution to a HTML file. Each such file contains the entire state of the STG machine at that point in the computation: namely the code, stack and heap. An example trace is shown here: [1]. The files are linked together allowing you to step forwards and backwards through the execution.