In this section, we will use Code 6 to explain more design abstractions.
For simplicity, procedures First and Third are excluded from statement numbering.
procedure First {
read x;
read z;
call Second; }
procedure Second {
01 x = 0;
02 i = 5;
03 while (i!=0) {
04 x = x + 2*y;
05 call Third;
06 i = i - 1; }
07 if (x==1) then {
08 x = x+1; }
else {
09 z = 1; }
10 z = z + x + i;
11 y = z + 2;
12 x = x * y + z; }
procedure Third {
z = 5;
v = z;
print v; }
The table shows a summary of the design abstractions discussed in this section.
Design Abstraction
| Design Abstraction | Relationship between |
|---|---|
| Calls / Calls* | Procedures |
| Next / Next* | Statements |
| Affects | Assignments |
Definition:
For any procedures p and q:
Calls(p, q) holds if procedure p directly calls q.
Calls*(p, q) holds if procedure p directly or indirectly calls q. That is:
- Calls (p, q) or
- Calls (p, p1) and Calls* (p1, q) for some procedure p1
Calls* is the transitive closure of Calls.
Examples:
In Code 6, the following relationships hold (are true):
Calls ("First", "Second")Calls ("Second", "Third")Calls* ("First", "Second")Calls* ("First", "Third")In contrast, the following relationships are false (do not hold):
Calls ("First", "Third")Calls ("Second", "First")Calls* ("Second", "First")Definition:
For two statements s1 and s2 in the same procedure:
Next(s1, s2) holds if s2 can be executed immediately after n1 in some execution sequence.
Next*(n1, n2) holds if n2 can be executed after n1 in some execution sequence.
Next* is the transitive closure of Next.
Examples:
In Code 6, the following relationships hold (are true):
Next (2, 3)Next (3, 4)Next (3, 7)Next (5, 6)Next (7, 9)Next (8, 10)Next* (1, 2)Next* (1, 3)Next* (2, 5)Next* (4, 3)Next* (5, 5)Next* (5, 8)Next* (5, 12)The following relationships are false (do not hold):
Next (6, 4)Next (7, 10)Next (8, 9)Next* (8, 9)Next* (5, 2)Notes:
The Next/* relationship is determined by the control flow, while Follows/* is determined by the structural location of a statement.
When discussing Next/* for container statements, the statement number refers to the evaluation of the conditional expression, rather than the whole body when discussing Follows/*.
while (i!=0) and statement 7 refers to if (x==1).Definition:
For two statements s1 and s2 in the same procedure:
Affects(s1, s2) holds if:
- s1 and s2 are assignment statements,
- s1 modifies a variable v which is used in s2 and
- there is a control flow path from s1 to s2 on such that v is not modified
in any assignment, read, or procedure call statement on that path
Examples:
In Code 6, the following relationships hold (are true):
Affects (2, 6)Affects (4, 8)Affects (4, 10)Affects (6, 6)Affects (1, 4)Affects (1, 8)Affects (1, 10)Affects (1, 12)Affects (2, 10)Affects (9, 10)In particular, Affects (1, 12) holds because:
x is modified in statement 1,x is used in statement 12, and1 > 2 > 3 > 7 > 9 > 10 > 11 > 12) on which variable x is not modified by any assignment, read, or procedure call.The following relationships are false (do not hold):
Affects (9, 11)Affects (9, 12)Affects (2, 3)Affects (9, 6)In particular, Affects (9, 12) does not hold because:
z is modified by assignment 10 that is on any control flow path between assignments 9 and 12.Notes:
The Affects relationship models data flows in a program.
The Affects relationship is defined only among assignment statements and involves a variable.
Affects (a1, a2) holds if the value of v as computed at a1 may be used at a2.More examples:
procedure alpha {
1. x = 1;
2. if ( i != 2 ) {
3. x = a + 1; }
else {
4. a = b; }
5. a = x; }
In Code 7, Affects (1, 5) is true because variable x is modified in statement 1 and used in statement 5, and there is a path in the CFG (1 > 2 > 4 > 5) on which x is not modified in any assignment, read, or procedure call.
procedure p {
1. x = a;
2. call q;
3. v = x; }
In Code 8, if Modifies ("q", "x") holds, then Affects (1, 3) does not hold.
If Modifies ("q", "x") does not hold, then Affects (1, 3) holds.
procedure p {
1. x = 1;
2. y = 2;
3. z = y;
4. call q;
5. z = x + y + z; }
procedure q {
6. x = 5;
7. t = 4;
8. if ( z > 0 ) then {
9. t = x + 1; }
else {
10. y = z + x; }
11. x = t + 1; }
In Code 9,
Affects (1, 5) and Affects (2, 5) do not hold as both variable x and y are modified in procedure q.
y in procedure q is only conditional, we will still use the definition of Modifies for procedures. That is, Modifies(4, "q") holds.Affects (3, 10) do not hold because assignments 3 and 10 are in different procedures.
procedure alpha {
1. x = 1;
2. call beta;
3. a = x; }
procedure beta {
4. if ( i != 2 ) {
5. x = a + 1; }
else {
6. a = b; } }
In Code 10, Affects (1, 3) is false because variable x is modified in statement 1 and used in statement 3, but the only paths from 1 to 3 (1 > 2 > 3) contains a call statement 2 that modifies x according to the definition of Modifies for procedure calls.
procedure p {
1. x = a;
2. read x;
3. v = x; }
In Code 11, Affects (1, 3) does not hold because read statement 2 modifies variable x on the paths from statement 1 to 3.