[Swift-devel] on the semantics of 'array closing'
Ian Foster
foster at mcs.anl.gov
Fri Jun 15 15:26:11 CDT 2007
Hi,
For:
a[0] = p()
a[1] = q()
b = s(a)
I think there are two distinct issues.
a) Determining the size of the array. This could presumably be done by
declaring it, e.g.:
a[2] or some similar notion
a[0] = p()
a[1] = q()
b = s(a)
or by some "closing" concept.
b) Whether or not each element of an array is a separate
single-assignment variable. If they are, then the code above should work
just fine. If they are not, then we have a couple of behaviors we could
define. One would be that b=s(a) blocks until all elements in "a" are
defined. The other is that we have a way of "closing" (once again). In
that case, we have to define what happens if b=s(a) accesses an element
that is not defined.
Ian.
Ben Clifford wrote:
> There is a problem that has been called the 'array closing problem'.
>
> It manifests itself in the tutorial in that certain bits of code that
> intuitively can either in a procedure or in the top level can, in
> practice, only go in to a procedure.
>
> In that context, I tried to think about better ways to explain/document
> the behaviour than "mumble mumble move that code into a procedure".
>
> In Swift we claim to have 'single assignment variables'.
>
> >From single assignment variables we get our grid job ordering:
>
> a = p()
> b = s(a)
>
> causes first grid job p to run, and when that has completed, then grid job
> s will run.
>
> This is the same as if we had written:
>
> b = s(a)
> a = p()
>
> The ordering comes from the use of a as an 'output' for p and an 'input'
> for s, not from source text ordering.
>
> In that model, its meaningless to assign two different things ta a, like
> this:
>
> a = p()
> b = s(a)
> a = t()
>
>
> Note that I've omitted the data types from the above. This works in the
> implementation for simple types such as a datafile marker type.
>
> What is important is that each variable is either unassigned or has its
> single value - whenever we refer to that variable, we can either use the
> value it has, or defer evaluation of that expression until the variable
> has its value.
>
> Now consider arrays. In the present syntax, arrays can be passed as
> single (complex) values to/from procedures, like before:
>
> a = p()
> b = s(a)
>
> Here a and b are array types.
>
> That's fine. a is assigned to by the first statement, and b is assigned to
> by the second statement.
>
> But we also support a different assignment syntax for arrays, that looks
> like this:
>
> a[0] = p()
> a[1] = q()
> b = s(a)
>
> This fails at the moment (specifically, I think the execution engine will
> hang).
>
> Why? Because the is no one point at which we assign a value to 'a' - the
> assignment is split over multiple statements, which can be in various
> places (and inside loops etc).
>
> There is nothing in the implementation that detects that a has been
> assigned its value.
>
> So there is this notion in the karajan intermediate code of 'closing an
> array'. This is an assertion made in the object code that all assignments
> to pieces of an array have been made - that, in affect, the array has its
> value.
>
> The suggested hack/workaround for this is to move the array element
> assignments into a procedure:
>
> (file f[]) z() {
> f[0] = p();
> f[1] - q();
> }
>
> a = z()
> b = s(a)
>
> This works. (which is sort-of a violation of referential transparency)
>
> It works because Swift implicitly marks arrays returned from compound
> procedures as closed (which may or may not be correct).
>
> So in most variable scopes, arrays behave like single-assignment
> variables, but each array can have one specific scope in which members can
> be assigned to. In that scope, the array cannot be treated as a whole
> variable.
>
> In the z() example above, that special scope is the body of z(). In the
> previous example, that scope is the global scope, and the program is
> invalid by the rule above that the array cannot be referred to as a whole
> in the same place that its members are individually assigned to.
>
> That's my explanation of what's going on now. I think it matches reality.
> I don't like that this is reality, but it is what we have.
>
> Comments appreciated.
>
>
--
Ian Foster, Director, Computation Institute
Argonne National Laboratory & University of Chicago
Argonne: MCS/221, 9700 S. Cass Ave, Argonne, IL 60439
Chicago: Rm 405, 5640 S. Ellis Ave, Chicago, IL 60637
Tel: +1 630 252 4619. Web: www.ci.uchicago.edu.
Globus Alliance: www.globus.org.
More information about the Swift-devel
mailing list