Incremental compilers in programming environments attempt to reduce the recompilation effort by reusing analysis and code from a previous compilation. Because of the complexity, these compilers typically limit the machine independent optimizations and register allocation strategies to the incremental unit of granularity; a module for coarse grain and a statement for fine grain. This project addresses the design and performance of both coarse and fine grain incremental compiling techniques that permit optimizations and register allocation across the incremental unit. Techniques for performing fine grain, coarse grain and a combination of the granularities will be designed, implemented and experimentally evaluated. Issues such as the overhead of incremental systems, the appropriate granularity unit and the trade-off between the amount of information maintained and the preciseness of the recompilation detection process will be investigated. The research will initially utilize the notion of optimization and register histories previously developed for fine grain techniques. An important aspect of this work will be the investigation into the performance of incremental data flow techniques which are capable of incrementally updating both intraprocedural and interprocedural information. The results on the data flow investigation are also important to compiling techniques for parallel architectures, for data flow must be continually updated as code is transformed to increase parallelism.