Related Work

A number of other research initiatives are developing these same ideas:

DCG
compilers hand-written in C generate portable IR; DCG translates the IR to real code. Requires about 350 instructions to generate one instruction. Backends for different architectures are actually generated using a special-purpose language. [DCG].

`C
an extension of C built with DCG, provides high level interface [tick-C]. Basically like Fabius for C with hand-annotation.

Similix
off-line specializer for simplified Scheme. Compilers generate Scheme. Not multistage, polyvariant specializer but monovariant BTA; only supports simple lifting, but runs fast [Similix][Similix-doc].

Schism
similar to Similix, but handles types and polyvariance. Supports filters for more control of lifting among other things. Source programs can be either ML or Scheme [Schism].

Fabius
is a compiler generator for a simplified first-order ML. The compilers produce machine code directly, thus they are very, very fast [Fabius].

Washington
a cadre at the University of Washington have been studying the performance of manual RTCG. They compare a template compiler that uses tens of instructions to generate each instruction and a simulated IR system to traditional compilation [KeEggeHe91][KeEggHe93].

Fuse
is a graph-based on-line PE for Scheme. It can compile code, but not generate compilers. Designed primarily for scientific computation [Fuse]

Synthetix
not clear what it will be, but a multi-stage compiler generation is also one of their goals. They are concentrating on operating systems and file systems in particular [Synthetix].

qua-C
an on-line specializer for Alpha machine code [YaSa]. Uses hints. A number of complications are introduced by analyzing real code, though this allows code from any language/compiler to be processed. Still work in progress.

None of the automatic systems accept a low-level IR language.

None of these systems supports multilayer evaluation.


The IR used by DCG is described in [FraHa91]. They make a big deal of the difference between their procedure call interface passing DAGs and so-called `Abstract Machines'. They confuse the nature of the data structure representing the code (it's trivial to convert my abstract machine into DAGs by replacing the environment with pointers) with using a higher-order call interface instead of a one-way stream of bytes.

So how do these systems reduce \\sigma? DCG accepts a compiler intermediate representation consisting of DAGs of primops [DCG] and C function calls. Using a lower-level language reduces the time required to assemble it into finally executable machine code. Fabius generates code directly for even lighterweight compilers [Fabius].

Systems such as [Self][Smalltalk] have used lightweight code generation in the form of feedback or lazy compilation.