[net.lang.pascal] smart compilers

jhf@lanl.ARPA (01/10/85)

> > I thought Fortran-77 required constant actual parameters to be
> > "copied in" rather than passed by reference?
> 
> FORTRAN parameters are always pass-by-reference.
> -- 
> D Gary Grady
> Duke University Computation Center, Durham, NC  27706

Absolutely not.  Both reference and value-result are acceptable parameter
passing methods for Fortran.  Programs that are sensitive to the difference,
i.e., that create aliases to actual parameters ("dummy arguments") which
they redefine, are not standard conforming.  This restriction, in my opinion,
is entirely appropriate.  Efficiency of parameter passing is of the greatest
importance to the overall quality of a compiler's target code, and archi-
tectural features and other circumstances may make one of these methods
much more desirable than the other.  The compiler writer should be free to
choose the appropriate technique, and not be restricted to one of them
for the sake of guaranteeing the effects of some bad programs.

I might note that Ada imposes a similar restriction on parameters, but,
incredibly, the Pascal standard does not.  It requires call-by-reference
for var parameters!  (At least, it did the last time I looked.  If the
situation has changed, I stand duly corrected and chastised.)  I think
this is a huge mistake.  Not only does it unreasonably restrict
implementations, but it makes impossible the removal of a wart in the
language, that components of packed arrays or records may not be passed
as var parameters.  This restriction is there, of course, because there
will generally not be a reasonable way to implement call-by-reference for
objects that are not aligned on an addressable bit boundary.  This
directly conflicts with the notion that packed types differ from their
unpacked counterparts only in their storage requirements and access times.
What the Pascal standard should have done is to restrict the aliasing
of var parameters in a manner similar to Fortran or Ada, and then to
remove the restriction on passing components of packed structures.
(Most compilers would implement this by copy-in-copy-out on the calling
side, where necessary.)

Joe Fasel
Los Alamos National Laboratory
jhf@lanl.{arpa,uucp}