LISP and Symbolic Computation, 4(3)243-281
An Efficient Implementation of SELF, a Dynamically-Typed Object-Oriented Language Based on Prototypes
Craig Chambers, Computer Systems Laboratory, Stanford University, Stanford, California 94305
David Ungar, Computer Systems Laboratory, Stanford University, Stanford, California 94305
Elgin Lee, Computer Systems Laboratory, Stanford University, Stanford, California 94305
Abstract: We have developed and implemented techniques that
double the performance of dynamically-typed object-oriented
languages. Our SELF implementation runs twice as fast as the fastest
Smalltalk implementation, despite SELF's lack of classes and explicit
variables.
To compensate for the absence of classes, our system uses
implementation-level maps to transparently group objects cloned from
the same prototype, providing data type information and eliminating
the apparent space overhead for prototype-based systems. To compensate
for dynamic typing, user-defined control structures, and the lack of
explicit variables, our system dynamically compiles multiple versions
of a source method, each customized according to its receiver's
map. Within each version the type of the receiver is fixed, and thus
the compiler can statically bind and inline all messages sent to
self. Message splitting and type prediction extract and preserve even
more static type information, allowing the compiler to inline many
other messages. Inlining dramatically improves performance and
eliminates the need to hard-wire low-level methods such as +, ==, and
ifTrue:.
Despite inlining and other optimizations, our system still supports
interactive programming environments. The system traverses internal
dependency lists to invalidate all compiled methods affected by a
programming change. The debugger reconstructs inlined stack frames
from compiler-generated debugging information, making inlining
invisible to the SELF programmer.
|
[local copy]
|
|