|multiple outputs in Java email@example.com.OZ.AU (2000-12-11)|
|Re: multiple outputs in Java firstname.lastname@example.org (2000-12-13)|
|Re: multiple outputs in Java email@example.com (Tim Harris) (2000-12-18)|
|From:||Tim Harris <firstname.lastname@example.org>|
|Date:||18 Dec 2000 00:36:22 -0500|
|Organization:||University of Cambridge Computer Laboratory|
|Posted-Date:||18 Dec 2000 00:36:22 EST|
> email@example.com.OZ.AU (Fergus Henderson) wrote:
>> One issue that has arisen is that our source language
>> allows procedures with multiple output arguments
>> (a.k.a. multiple return values). What's the best way
>> to compile this to Java?
>You might want to return all values as Vectors (java.util.Vector)
>or arrays of a particular object type. ( Vector access is
>more expensive at run-time than an array. )
I can't immediately find any published comparisons on different
possible strategies. I would imagine that the relative costs of using
arrays or instances to contain multiple return values will vary
substantially between JVM implementations -- e.g. whether the
allocation can be made on the stack, how efficiently the array or
instance can be initialized, whether the two options have the same
space costs in terms of house-keeping information, whether
bounds-checks, null-pointer checks or array-store checks can be
One of the OOPSLA '99 papers on escape analysis (I think Blanchet's)
used the instance-based idiom as one of the examples to convert to
stack allocation. I'm not sure whether that kind of analysis is now
typical in current implementations.
My gut reaction is that a reasonable approach would be to define
classes for each combination of return types and for the caller to
pass an instance to the called method. That means that the same
instance can be used in the caller if (e.g.) the call occurs within a
loop. It might also be more amenable to stack allocation -- perhaps
someone who's done work in that area can comment more authoritatively!
I've not looked at any large Mercury programs in detail -- what kinds
of situations do multiple return values tend to be used? Is it worth
avoiding multiple returns by inlining or by identifying unused return
values and compiling separate versions, each of which only returns the
single value that's actually used?
Return to the
Search the comp.compilers archives again.