1. A method executed in a computer system, the method comprising the steps: generating a flow graph for a source program that is being compiled using a compiler front end which performs syntactic and semantic processing of a programing language, said flow graph comprising tuples, each tuple representing a single expression in said source program, said flow graph being a representation of said source program in an intermediate language; determining, by said compiler front end for each tuple which can have an effect on another tuple and which is included in said first flow graph, an effect indicator that represents an effect said each tuple has on said another tuple, said effect indicator being associated with said each tuple; determining, by said compiler front end for each tuple which can have a dependency on another tuple and which is included in said flow graph, a dependency indicator that represents a dependency said each tuple on said another tuple, said dependency indicator being associated with said each tuple; and optimizing said flow graph by a compiler back end calling one or more predetermined routines in said compiler front end, said predetermined routines using effect and dependency information from said determining effect and said determining dependency steps to provide return information to said compiler back end wherein said compiler back end uses said return information to determine whether an optimization is valid for one of said tuples comprising said flow graph.
1. A method executed in a computer system, the method comprising the steps: generating a flow graph for a source program that is being compiled using a compiler front end which performs syntactic and semantic processing of a programing language, said flow graph comprising tuples, each tuple representing a single expression in said source program, said flow graph being a representation of said source program in an intermediate language; determining, by said compiler front end for each tuple which can have an effect on another tuple and which is included in said first flow graph, an effect indicator that represents an effect said each tuple has on said another tuple, said effect indicator being associated with said each tuple; determining, by said compiler front end for each tuple which can have a dependency on another tuple and which is included in said flow graph, a dependency indicator that represents a dependency said each tuple on said another tuple, said dependency indicator being associated with said each tuple; and optimizing said flow graph by a compiler back end calling one or more predetermined routines in said compiler front end, said predetermined routines using effect and dependency information from said determining effect and said determining dependency steps to provide return information to said compiler back end wherein said compiler back end uses said return information to determine whether an optimization is valid for one of said tuples comprising said flow graph. 6. The method of claim 1 wherein said compiler front end is a first compiler front end, said flow graph is a first flow graph, said source program is a first source program, said programing language is a first programming language, said compiler back end is a common compiler back end used with a plurality of compiler front ends, the method further comprising the steps of: generating, using a second compiler front end, a second flow graph for a second source program that is being compiled using said second compiler front end which performs syntactic and semantic processing of a second programming language, said second flow graph comprising tuples and being a representation of said second source program in an intermediate language, each tuple in said second flow graph representing a single expression in said second source program, determining, by said second compiler front end for each tuple which can have an effect on anther tuple and which is included in said second flow graph, an effect indicator that represents an effect said each tuple has on said another tuple, said effect indicator being associated with said each tuple; determining, by said second compiler front end for each tuple which can have a dependency on another tuple and which is included in said second flow graph, a dependency indicator that represents a dependency said each tuple has on said another tuple, said dependency indicator being associated with said each tuple; and optimizing said second flow graph by said common compiler back end calling one or more predetermined routines in said second compiler front end to determine, by said common compiler back end, whether an optimization is valid for one of said tuples that comprises said second flow graph using effect and dependency information from said determining effect and determining dependency steps performed by said second compiler front end.