I’m reading my Programming Languages book, learning somethings about parameters passing, and a doubt came to me related to call by value/restore.
I understand how it works in general cases, but consider this case:
procedure P(x, y, i){
x[i]=y[5-i]
if( i<4 ) P(x, y, i+1)
}
procedure main(){
a=(1, 2, 3, 4, 5)
P(a, a, 0)
}
Once P(a, a, 0) is called, a local copy of both ‘a’ is created (lets call them a_0 and a_1). But when it returns, a_0 and a_1 will have different values.
a_0 = (5, 4, 3, 2, 5)
a_1 = (1, 2, 3, 4, 5)
So when it tries to restore ‘a’with the new value… we find two different posibilities. What would happen here? Would it be first restored to a_0 and the overwritten by a_1? What would be the value of ‘a’ after P(a, a, 0)?
Sorry for the wrong tag, but I tried to use something like ‘parameter’ and I’m not allowed to create new tags yet.
Thanks in advance.
In such situations, there are three possible ways to define the semantics:
Forbid such statements. The compiler statically checks and prevents such situations. This may be difficult to achieve, is the argument is passed down through a series of procedure calls.
The semantics is that one of the copies takes precedence over the other. This would be realised by restoring each of the argument values back one by one. The fact that two refer to the same original variable will mean that there are two copies made into that variable, and the latter will succeed.
The semantics are undefined, and each compiler is free to implement this as it sees fit. C has such semantics for the evaluation order of arguments to procedures. In such as circumstances, the programmer needs to be aware of this to avoid writing unportable code.
So the actual semantics will depend on which language/compiler combination you are considering. On the other hand, if unambiguous formal semantics of the programming language are provided (and certain properties have been proven about it, such as that it is unambiguous), then checking the semantics is the way to determine what the result of your program should be.
The interesting question is what do the formal semantics of call-by-copy-restore look like.