The reasonable other alternative in order to avoid the overhead of emulating the WAM code is to generate directly machine language code from the compilation of Prolog programs. This is what usually goes under the name of Native Code Compilation, a feature that is quickly becoming part of the most widely used implementations of Prolog (e.g., Quintus and SICStus).
The two more sophisticated compilers performing native code compilation
are Aquarius [90] and Parma [107, 106]. Both
the compilers translates Prolog to an intermediate code--expressed in a language
whose level is considerably lower than WAM. In the case of Parma the intermediate
code is expressed in a quite standard 3-address code; in the case of Aquarius the
intermediate code (BAM code) is based on a simple language (based on load-store
instructions, tagged addressing modes, pragmas, and some Prolog-specific instructions to manipulate unification, trail,
dereferencing, environments, and choice-points).
In both cases the intermediate code is translated into machine code (MIPS for Parma, SPARC for Aquarius). Native code compilation has been proven to be most effective way to produce efficient executions of Prolog, especially if coupled with the use of sophisticate static analysis techniques.