[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

DYNAMIC-WIND vs. multi-processing



   From: jar@cs.cornell.edu (Jonathan Rees)
   Date: Tue, 11 May 93 13:10:39 -0400

      Date: Tue, 11 May 93 10:16:09 -0400
      From: Gerald Jay Sussman <gjs@martigny.ai.mit.edu>

      I haven't read the current dynamic-wind proposal

You aren't the only one.  DYNAMIC-WIND was not part of the handout.ps
before the last meeting.  I have had to write my own description for
SLIB because I couldn't find an official proposal.

      ..., but I can
      assure you that the original reason that Richard Stallman invented
      dynamic-wind (in 1980 for the Scheme-81 chip) was to complement
      call-with-current-continuation so that each process could have private
      versions of certain fluid variables.  Without the power of
      dynamic-wind we found that we could not support all of the structure
      needed to build an operating system.

There is no way I could discern the original motivations from reading
the description in the MITScheme documentation.  Just from reading
that description, I have come up with a use for DYNAMIC-WIND which
some rrrs-authors object to (foiling all escapes from a
read-eval-print loop).  If DYNAMIC-WIND should be used only for
dynamic binding I suggest that we should either say so in the
description or just scrap it in favor of an explicit dynamic binding
construct.

   Seriously though, the reason you wanted to use DYNAMIC-WIND to
   implement fluid variables in Scheme-81 is that you wanted fluid
   variables to actually be implemented as ordinary lexical variables.
   In the operating system that I wrote in Scheme, one uses a distinct
   syntax to access the value of a fluid "variables", specifically the
   (FLUID x) of the Revised Report.  With this change, task switching is
   accomplished by simply changing the continuation and fluid environment
   registers.

But this is equivalent to changing the fluid locations on context
switch!!  The only difference is that you like deep-binding and GJS
likes shallow-binding.

   CWCC isn't used for task switching; instead there is a
   lower-level operator that is only used internally to the scheduler.

Its action is equivalent to CWCC under the influence of DYNAMIC-WIND.

   DYNAMIC-WIND is supported, but the windings and unwindings only happen
   when the procedures delivered by CWCC are called, not on task
   switching.  DYNAMIC-WIND and CWCC have their place, but only within
   individual tasks.

What you have essentially done is to have 2 versions of CWCC.

   Note that this generalizes nicely to the case of multiprocessing (i.e.
   multiple processors), whereas DYNAMIC-WIND doesn't: each processor can
   easily have its own continuation and fluid environment registers.

That is my point.  DYNAMIC-WIND can prevent the state of a process
from being captured by CWCC.  A separate primitive construct is
needed.

   If you believe, as Mr. Jaffer apparently does, that it must be
   possible to write a scheduler in portable Scheme, then I would tend to
   agree that the low-level non-winding version of CWCC is necessary.

An interrupting scheduler cannot be written in portable Scheme
(because interrupts are not part of Scheme); but that is not the only
paradigm for task switching.

As for a non-winding version of CWCC, it is more complicated than
that; It still needs to wind and unwind dynamic variables but not
other things.

   I'm not sure I buy that premise, however.  It seems pretty useless to
   have tasks without pre-emption;

What about co-routines?  Everything I said about multiple processes
applies to co-routines.

   and if we do adopt pre-emption in some
   form, then I think chaos would ensue unless without a standard
   interface to the scheduler -- in which case, we should just adopt a
   scheduler, not the low-level primitives that the implementation of a
   scheduler would need.

There is perhaps more variety in multiproccessing primitives than in
any other area of CS.  It will be years before we could agree on a
scheduler (if at all).  I am not holding my breath.

CWCC is the marrow of processes.  DYNAMIC-WIND, by acting on CWCC,
does not distinguish between escapes, co-routine calls and other
control transfers.  I think we will lose a lot of succinctness in the
language if we start distinguishing these.