[Haskell-cafe] Imagining a G-machine

Albert Y. C. Lai trebla at vex.net
Wed May 16 18:25:48 EDT 2007


A native G-machine --- physical, or chemical, or biological, but not a 
repressed simulation over the imperative cpu-memory architecture --- is 
the dream of every lazy-functional programmer of great devotion. If only 
it became the dominant computing architecture! People would say, Haskell 
is high-level assembly because it is the closest to the bare metal (or 
bare protein) and still supports all sorts of abstractions. People would 
ask, why is my C program five times slower than Haskell, and people 
would answer, that's because C is compiled to a stack of seven monad 
transformers (one of which is ContT to support longjmp), and because you 
should use more linked lists and fewer arrays. We truely rule the world 
when C programmers have to consult us for performance tips.

A necessary condition for dominance is existence. Here is my crazy 
imagination of a native G-machine. It is worded as biotech but may as 
well be molecular computing or nanotech.

The heap is a soup of nutrients. A node is a molecular structure made 
from the nutrients. A thunk is a lot of nodes linked up. Nodes and 
thunks are suspended in the soup. Allocation means constructing nodes 
and links from nutrients, and deallocation means unlinking nodes and 
eventually dismantling them back into nutrients. As a side effect, 
memory upgrade is cheap and convenient: Just go buy a can of Campbell 
soup (my favourite is the alphabet soup) and pour into your heap. There 
are 24-hour convenient stores at every street corner --- pervasive 
computing has never been so pervasive before.

A thunk is nodes linked together and suspended in the soup. A theorem in 
graph theory asserts that all finite graphs can be embedded without 
crossing edges in 3D space, and we take advantage of this to space out 
the nodes in a complicated thunk. Still, it is not easy, being NP-hard 
and all. There is a relaxation heuristic for this: It simply requires 
nodes to be a bit repulsive to each other and links to be elastic, and 
they will sort things out themselves. (When they don't, a bit of shaking 
up helps tremendously.)

Evaluation is performed by a small organism crawling over a thunk and 
performing its thunk-rewriting duty as per the G-machine. It applies 
enzymes to construct and deconstruct nodes and links from nutrients. It 
performs primitive arithmetic on its own. It maintains its own stack, 
inside or outside its body (to be investigated). It is possible to 
unleash several such evaluators for parallel computing. It is possible 
to enable reproduction to boost parallelism.

To add garbage collection, roots send out a periodic (or sustained) 
signal to all connected nodes. Nodes receiving the signal do not 
self-destruct. Nodes not receiving the signal invokes their built-in 
self-destruct mechanism to dissolve themselves back into nutrients. 
There may be better schemes.

Interacting with the outside world is open, but Andrew Gordon's thesis 
contains translations from monadic I/O to other I/O schemes, e.g., 
continuations, streams, etc. Perhaps one of them can be adapted.

Debugging can be done by making evaluators send radio signals concerning 
operations they perform; then a second computer can log these and you 
can review them. You can also use radio signals to instruct the 
evaluators to perform unusual operations on demand.

The existence of a native G-machine is a necessary but not sufficient 
condition for world dominance. We still need to make it fast, compact, 
and cheap. There may also be better but totally different ways to 
realize a native G-machine.


More information about the Haskell-Cafe mailing list