A SuperCompiler is a dynamic optimiser that can transform the code of an object according to its actual usage. The word was introduced by ValentinTurchin, who built one using his RefalLanguage.
This may be simple static optimisations, removing state that isn't used from an object; or it may be very complex e.g. partial evaluation of functions leading to code transformation.
An introduction can be found here: http://www.refal.org/doc/turchin/dag/dag.html An implementation and documentation here: http://www.refal.org/english/s_compil.htm
A related technique is object elaboration which involves generating many possible execution sequences and generating an optimal processing object to handle that sequence. This is a static version of super-compilation.
E.g. z = F(a,b,c,d,e,f,g).
Given a parameter a, we can often refactor z = G(b,c,d,e,f,g) where a is now internal to G. This is called LambdaDropping
If a is internal to G then an algebraic simplification may be available.
So:
z = F(x,y) = x*x + y*y.
Given x = k.
z = F(x,y) = x*x+y*y = G(y) = k*k + y*y.
If the parameters don't arrive simultaneously then this optimisation may improve performance by doing work early.
-- RichardHenderson.
A JavaLanguage implementation is in the make. See http://inet.keldysh.ru/dpt_16/ScpJ/index.htm
Some of the ideas implemented in SynthesisOs.
See also CurryingSchonfinkelling GamesCompiler? SuperCombinators
See also CurryingSchonfinkelling RethinkingCompilerDesign SuperCombinators