[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: OCCAM, JOYCE, SUPERPASCAL AND JAVA
Richard Beton writes:
> Denis A Nicole wrote:
>
> > <snip>
> > The memory management story is also simple. You calculate at compile time
> > the size of an activation record for each different recursively used
> > process. The compiled code then manages a separate list of exact-size
> > buffers for each recursively used process. In-line code picks a buffer
> > from the list on process activation (or sbrk()'s a new one if the list is
> > empty) and returns the buffer to the list on process termination. No
> > buffers are ever returned back from these exact-fit lists. The buffer
> > lists just grow out of contiguous free store.
> >
> > The total memory required is bounded, and is optimal if there is only one
> > recursive process---the typical teaching scenario. It all gets returned at
> > program termination.
>
> Can I ask a [dumb] question?
> What is the difference in what Denis' solution achieves between recursive functions
> and unbounded PAR statements?
Well, first, what both Denis and I did was post a brief outline of Professor
Brinch Hansen's algorithm described in his paper. Both of us are describing
the same thing. I just called an activation record a "workspace" which is
pretty much the same thing in a transputer-like implementation. And outlined
the algorithm in occam-like syntax.
The solution belongs to Per Brinch Hansen.
> To illustrate my question by example, what I mean is
>
> INT FUNCTION factorial (VAL INT n)
> INT result:
> VALOF
> IF
> (n = 1)
> result := 1
> (TRUE)
> result := n * factorial (n-1)
> RESULT result
> :
>
> and an unbounded PAR statement:
>
> INT n:
> SEQ
> ... compute value for n
> PAR i = 0 FOR n
> ... do lots of things concurrently
You would use the same algorithm to allocate memory for any and all
process instances. The whole point is that allocation is dynamic, so indeed
a PAR replicator need no longer be a constant.
More interesting is the case where you have parallel recursion like a quicksort
along the lines
PROC quicksort([]INT list)
SEQ
select pivot
partition_about_pivot
VAL top IS [list FROM 0 FOR pivot] :
VAL bottom IS [list FROM pivot + 1] :
PAR
quicksort(High)
quicksort(Low)
:
Adrian
--
A E Lawrence, MA., DPhil. adrian.lawrence@xxxxxxxxxxxxxx
MicroProcessor Unit, 13, Banbury Road, Oxford. OX2 6NN. UK.
Voice: (+44)-1865-273274, Fax: (+44)-1865-273275