As part of the Ajax system for analyzing Java bytecode programs, I have
developed an analysis called SEMI, based on type inference with polymorphic
recursion. SEMI has a number of optimizations which significantly decrease the
time and space requirements for analyzing large programs. These optimizations
exploit the characteristics of Java programs to make analysis tractable. These
assumptions, and the optimizations that follow from them, may apply in other
domains using type inference with polymorphic recursion. In this report, I
describe the SEMI algorithm, the optimizations it incorporates, and the
characteristics of Java programs that justify the optimizations.