| OCR Text |
Show A compiler simply generates a table of pairs of a source code line number and a machine code address. The table can be used by the director to obtain a static relationship between the source code and the machine code. Another important relationship is the relationship between events in the execution stream and statements in the high level language. Many high level statements can be recognized from the execution stream without referencing source code. An assignment to a variable corresponds to a store to the memory at the address of the variable. An if corresponds to a conditional branch. Loops correspond to a branch with a negative offset. Procedure call and return have usually a direct correspondence in machine code. Some constructs are impossible to detect, since they are not represented in machine code or they are mixed with other constructs. This is especially the case with optimizing compilers [93]. A partial solution is to maintain a parse tree describing the abstract syntax of the program. This parsing tree can provide a detailed link between source code and machine code. Unfortunately in imperative compiled languages, the parsing tree is usually thrown away after the compilation process is done. The problem of maintaining a detailed correspondence between the source code and the machine code is very interesting, but it was not addressed by this research due to the lack of resources. 4.6.3 Program Evolution A director may often want to modify the type of data or the type of functions in the executor. These changes must be performed without starting the executor from the beginning. Although the executor may be suspended while modifications are performed, it continues with the execution afterwards. Values are easy to modify, but the modifications of types are more complex. Some modifications may be virtually impossible to perform efficiently, like changing 94 |