Jensen's Device
Jensen's Device is a computer programming technique devised by Danish computer scientist Jørn Jensen, who worked with Peter Naur at Regnecentralen, particularly on the GIER Algol compiler, one of the earliest correct implementations of ALGOL 60.[1]
The following program was proposed to illustrate the technique. It computes the 100th harmonic number by the formula
:
begin
integer i;
real procedure sum (i, lo, hi, term);
value lo, hi;
integer i, lo, hi;
real term;
comment term is passed by-name, and so is i;
begin
real temp;
temp := 0;
for i := lo step 1 until hi do
temp := temp + term;
sum := temp
end;
comment note the correspondence between the mathematical notation and the call to sum;
print (sum (i, 1, 100, 1/i))
end
The above exploits call by name to produce the correct answer (5.187...). It depends on the assumption that an expression passed as an actual parameter to a procedure would be re-evaluated every time the corresponding formal parameter's value was required. Thus, assignment of a value to i in the sum routine as a part of the for statement changes the value of the original i variable, and when the code of the for loop requires the value of term, the expression 1/i is evaluated and with the new value of i. If the last parameter to sum had been passed by value, and assuming the initial value of i were 1, the result would have been 100 × 1/1 = 100, though actually, it is not initialised.
So, the first parameter to sum, representing the "bound" variable of the summation, must also be passed by name, otherwise it would not be possible to compute the values to be added. On the other hand, the global variable does not have to use the same identifier, in this case i, as the formal parameter.
[edit] Usage
The Sum function can be employed for arbitrary functions merely by employing the appropriate expressions. If a sum of integers were desired the expression would be just sum(i,1,100,i);, if a sum of squares of integers, then sum(i,1,100,i*i);, and so on. A slight variation would be suitable for initiating a numerical integration of an expression by a method very similar to that of sum. In the absence of this pass-by-name facility, it would be necessary to define functions embodying those expressions to be passed according to the protocols of the computer language, or to create a compendium function along with some arrangement to select the desired expression for each usage.
Because every mention of term within the procedure re-evaluates the original expression, making a local copy of the value of term as appropriate may be worthwhile, as when the procedure might compute the product of the terms as well as their sum.
[edit] References
- ^ Peter Naur's 2005 Turing Award citation mentions his work with Jensen on GIER Algol