Alice is a functional programming language that extends Standard ML with support
for distributed and concurrent as well as constraint programming. One key feature of
the system is that code is communicated in a high-level platform-independent format,
called Alice Abstract Code, which is statically generated from Alice source code. The
system ensures efficient execution by run-time compilation to native code. However,
the native code compiler is not portable and it is hard to maintain.
This thesis develops a portable execution unit based on byte code. A new run-time
compiler compiles the Abstract Code to Alice byte code that is executed by a register-
based interpreter. Specialized instructions and dynamic code rewriting are used to
speed up interpretation.
The module system of Alice imposes a strict separation of software blocks. This is
only resolved at run-time as modules are linked dynamically. Thus, the run-time
compiler has much more knowledge about the current state of the system than the
static compiler. One optimization that is particularly effective at run-time is inlining.
Two different forms of inlining (inlining of primitive operations, procedure integration)
are investigated to reduce the overhead of procedure calls. The compilation strategy
of the native code compiler is generalized to selective compilation in order to avoid
compilation of rarely executed procedures.
The byte code system sets the new standard for platform-independent execution in
Alice, starting from release 1.2. This thesis presents a careful analysis of the system
and shows that its performance is competitive to the native code system.