- ...code:
- For simplicity of presentation, we
assume an idealized RISC architecture with no delay slots; see
Appendix A.
- ...code:
- We use the pseudo-instruction emit to
simplify the presentation. It expands into a sequence of instructions that
allocates space in a dynamic code segment, builds the representation of an
instruction from its opcode and arguments, and finally writes the
instruction to the allocated space. In this example the arguments in the
emitted instruction are fixed; the first emit creates ``mul r3, r3,
r2'', regardless of the current values of r2 and r3.
- ...closures.
- Appel has made a similar observation [App87], and ``all code'' closures have also been
proposed by Feeley and Lapalme [FL92].
- ...code:
- nth(
, (
,
, ...,
)) yields
, the
element of a tuple)
- ...FABIUS
- Quintus Fabius Maximus was a Roman general best known
for his defeat of Hannibal in the Second Punic War. His primary
strategy was to delay confrontation; repeated small attacks eventually
led to victory without a single decisive conflict.
- ...unrolled.
- The arithmetic operations can also be
optimized based on the contents of the vector, which will likely yield
substantial speedups for computations involving sparse data. The
results presented here do not reflect such improvements, since we have
focused on fast run-time code generation at the expense of some
run-time optimizations.
- ...optimization.
- These embedded pointers may be difficult to
locate and update; for example on the MIPS a constant 32-bit pointer
might be embedded into two instructions that contain 16-bit immediate
values. Instruction reordering during run-time code generation can
make the locations of these instructions unpredictable.
- ...problems.
- Note that
such a partial evaluator need not be implemented in its target
language.