5.1 Core Design Principles
Three
main principles drive the design of
Parrot—speed, abstraction,
and stability.
Speed is a paramount concern. Parrot absolutely
must be as fast as possible, since the engine effectively imposes an
upper limit on the speed of any program running on it. It
doesn't matter how efficient your program is or how
clever your program's algorithms are if the engine
it runs on limps along. While Parrot can't make a
poorly written program run fast, it could make a well-written program
run slowly, a possibility we find entirely unacceptable.
Speed encompasses more than just raw execution time. It extends to
resource usage. It's irrelevant how fast the engine
can run through its bytecode if it uses so much memory in the process
that the system spends half its time swapping to disk. While
we're not averse to using resources to gain speed
benefits, we try not to use more than we need, and to share what we
do use.
Abstraction indicates that things are designed
such that there's a limit to what anyone needs to
keep in their head at any one time. This is very important because
Parrot is conceptually very large, as you'll see
when you read the rest of the chapter. There's a lot
going on, too much to keep the whole thing in mind at once. The
design is such that you don't have to remember what
everything does, and how it all works. This is true regardless of
whether you're writing code that runs on top of
Parrot or working on one of its internal subsystems.
Parrot also uses abstraction boundaries as places to cheat for speed.
As long as it looks like an abstraction is being
completely fulfilled, it doesn't matter if it
actually is being fulfilled, something we take
advantage of in many places within the engine. For example, variables
are required to be able to return a string representation of
themselves, and each variable type has a "give me
your string representation" function we can call.
That lets each class have custom stringification code, optimized for
that particular type. The engine has no idea what goes on beneath the
covers and doesn't care—it just knows to call
that function when it needs the string value of a variable.
Stability is important for a number of reasons.
We're building the Parrot engine to be a good
backend for many language compilers to target. We must maintain a
stable interface so compiled programs can continue to run as time
goes by. We're also working hard to make Parrot a
good interpreter for embedded languages, so we must have a stable
interface exposed to anyone who wants to embed us. Finally, we want
to avoid some of the problems that Perl 5 has had over the years that
forced C extensions written to be recompiled after an upgrade.
Recompiling C extensions is annoying during the upgrade and
potentially fraught with danger. Such backward-incompatible changes
have sometimes been made to Perl itself.
|