Added
This commit is contained in:
88
doc/pascal/conf.doc
Normal file
88
doc/pascal/conf.doc
Normal file
@@ -0,0 +1,88 @@
|
||||
.sp 1.5i
|
||||
.nr H1 3
|
||||
.NH
|
||||
Conformant Arrays
|
||||
.nh
|
||||
.LP
|
||||
.sp
|
||||
A fifth kind of parameter, besides the value, variable, procedure, and function
|
||||
parameter, is the conformant array parameter (\fBISO 6.6.3.7\fR). This
|
||||
parameter, undoubtedly the major addition to Pascal from the compiler writer's
|
||||
point of view, has been implemented. With this kind of parameter, the required
|
||||
bounds of the index-type of an actual parameter are not fixed, but are
|
||||
restricted to a specified range of values. Two types of conformant array
|
||||
parameters can be distinguished: variable conformant array parameters and
|
||||
value conformant array parameters.
|
||||
.sp
|
||||
.NH 2
|
||||
Variable conformant array parameters
|
||||
.LP
|
||||
.sp
|
||||
The treatment of variable conformant array parameters is comparable with the
|
||||
normal variable parameter.
|
||||
Both have in common that the parameter mechanism used is \fIcall by
|
||||
reference\fR.
|
||||
.br
|
||||
An example is:
|
||||
.br
|
||||
.in +5m
|
||||
to sort variable length arrays of integers, the following Pascal procedure could be used:
|
||||
|
||||
.nf
|
||||
\fBprocedure\fR bubblesort(\fBvar\fR A : \fBarray\fR[low..high : integer] \fBof\fR integer);
|
||||
\fBvar\fR i, j : integer;
|
||||
\fBbegin
|
||||
for\fR j := high - 1 \fBdownto\fR low \fBdo
|
||||
for\fR i := low \fBto\fR j \fBdo
|
||||
if\fR A[i+1] < A[i] \fBthen\fI interchange A[i] and A[i+1]
|
||||
\fBend\fR;
|
||||
.fi
|
||||
.in -5m
|
||||
|
||||
For every actual parameter, the base address of the array is pushed on the
|
||||
stack and for every index-type-specification, exactly one array descriptor
|
||||
is pushed.
|
||||
.sp
|
||||
.NH 2
|
||||
Value conformant array parameters
|
||||
.LP
|
||||
.sp
|
||||
The treatment of value conformant array parameters is more complex than its
|
||||
variable counterpart.
|
||||
.br
|
||||
An example is:
|
||||
.br
|
||||
.in +5m
|
||||
an unpacked array of characters could be printed as a string with the following program part:
|
||||
|
||||
.nf
|
||||
\fBprocedure\fR WriteAsString( A : \fBarray\fR[low..high : integer] \fBof\fR char);
|
||||
\fBvar\fR i : integer;
|
||||
\fBbegin
|
||||
for\fR i := low \fBto\fR high \fBdo\fR write(A[i]);
|
||||
\fBend\fR;
|
||||
.fi
|
||||
.in -5m
|
||||
|
||||
The calling procedure pushes the base address of the actual parameter and
|
||||
the array descriptors belonging to it on the stack. Subsequently the procedure
|
||||
using the conformant array parameter is called. Because it is a \fIcall by
|
||||
value\fR, the called procedure has to create a copy of the actual parameter.
|
||||
This implies that the calling procedure knows how much space on the stack
|
||||
must be reserved for the parameters. If the actual-parameter is a conformant
|
||||
array, the called procedure keeps track of the size of the activation record.
|
||||
Hence the restrictions on the use of value conformant array parameters, as
|
||||
specified in \fBISO 6.6.3.7.2\fR, are dropped.
|
||||
|
||||
A description of the EM code generated by the compiler is:
|
||||
|
||||
.nf
|
||||
.ft I
|
||||
load the stack adjustment sofar
|
||||
load base address of array parameter
|
||||
compute the size in bytes of the array
|
||||
add this size to the stack adjustment
|
||||
copy the array
|
||||
remember the new address of the array
|
||||
.ft R
|
||||
.fi
|
||||
Reference in New Issue
Block a user