1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 21:10:27 +02:00
guile/doc/body.texi
Paolo Bonzini 33bc19d30e update FSF address
git-archimport-id: bonzini@gnu.org--2004b/lightning--stable--1.2--patch-15
git-archimport-id: bonzini@gnu.org--2004b/lightning--stable--1.2--patch-16
2008-01-09 15:49:29 +01:00

306 lines
12 KiB
Text

@ifinfo
@dircategory @lightning{}, a library for dynamic code generation
@direntry
* @value{TITLE}: (lightning).
@end direntry
This file documents GNU lightning, Version @value{VERSION}.
It was last updated on @value{UPDATED}.
Copyright @copyright{} 2000 Free Software Foundation, Inc.
Authored by Paolo Bonzini.
This document is released under the terms of the GNU Free Documentation
License as published by the Free Software Foundation; either version 1.1, or
(at your option) any later version.
You should have received a copy of the GNU Free Documentation License along
with GNU lightning; see the file @file{COPYING.DOC}. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
There are no Secondary Sections, no Cover Texts and no Invariant Sections
(as defined in the license); this text, along with its equivalent in the
printed manual, constitutes the Title Page.
@end ifinfo
@setchapternewpage odd
@titlepage
@title @value{TITLE}
@subtitle Version @value{VERSION}
@subtitle @value{UPDATE-MONTH}
@author by Paolo Bonzini
@c The following two commands start the copyright page.
@page
@vskip 0pt plus 1filll
Copyright 1988-92, 1994-95, 1999, 2000 Free Software Foundation, Inc.
This document is released under the terms of the @sc{gnu} Free Documentation
License as published by the Free Software Foundation; either version 1.1, or
(at your option) any later version.
You should have received a copy of the @sc{gnu} Free Documentation License
along with @sc{gnu} @i{lightning}; see the file @file{COPYING.DOC}. If not,
write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
There are no Secondary Sections, no Cover Texts and no Invariant Sections
(as defined in the license); this text, along with its equivalent in the
Info documentation, constitutes the Title Page.
@end titlepage
@ifnottex
@node Top
@top @lightning{}
This document describes @value{TOPIC} the @lightning{} library for
dynamic code generation. Unlike other dynamic code generation systems,
which are usually either inefficient or non-portable, @lightning{} is
both retargetable and very fast.
@include toc.texi
@end ifnottex
@node Overview
@chapter Introduction to @lightning{}
@iftex
This document describes @value{TOPIC} the @lightning{} library for
dynamic code generation. Unlike other dynamic code generation systems,
which are usually either inefficient or non-portable, @lightning{} is
both retargetable and very fast.
@end iftex
@ifclear USING
This manual assumes that you are pretty comfortable with the usage of
@lightning{} for dynamic code generation, as described in
@usingref{The instruction set, @lightning{}'s instruction set}, and
instead focuses on the retargeting process. What follows is nothing
more then a brief overview of the system.
@end ifclear
Dynamic code generation is the generation of machine code
at runtime. It is typically used to strip a layer of interpretation
by allowing compilation to occur at runtime. One of the most
well-known applications of dynamic code generation is perhaps that
of interpreters that compile source code to an intermediate bytecode
form, which is then recompiled to machine code at run-time: this
approach effectively combines the portability of bytecode
representations with the speed of machine code. Another common
application of dynamic code generation is in the field of hardware
simulators and binary emulators, which can use the same techniques
to translate simulated instructions to the instructions of the
underlying machine.
Yet other applications come to mind: for example, windowing
@dfn{bitblt} operations, matrix manipulations, and network packet
filters. Albeit very powerful and relatively well known within the
compiler community, dynamic code generation techniques are rarely
exploited to their full potential and, with the exception of the
two applications described above, have remained curiosities because
of their portability and functionality barriers: binary instructions
are generated, so programs using dynamic code generation must be
retargeted for each machine; in addition, coding a run-time code
generator is a tedious and error-prone task more than a difficult one.
@ifset USING
This manual describes the @lightning{} dynamic code generation library.
@lightning{} provides a portable, fast and easily retargetable dynamic
code generation system.
@end ifset
@ifclear USING
@lightning{} provides a portable, fast and easily retargetable dynamic
code generation system.
@end ifclear
To be fast, @lightning{} emits machine code without first creating
intermediate data structures such as RTL representations traditionally
used by optimizing compilers (@pxref{RTL representation, , , gcc, Using
and porting GNU CC}). @lightning{} translates code directly from a
machine independent interface to that of the underlying architecture.
This makes code generation more efficient, since no intermediate data
structures have to be constructed and consumed. A collateral benefit
it that @lightning{} consumes little space: other than the memory
needed to store generated instructions and data structures such as
parse trees, the only data structure that client will usually need
is an array of pointers to labels and unresolved jumps, which you
can often allocate directly on the system stack.
To be portable, @lightning{} abstracts over current architectures'
quirks and unorthogonalities. The interface that it exposes to is that
of a standardized RISC architecture loosely based on the SPARC and MIPS
chips. There are a few general-purpose registers (six, not including
those used to receive and pass parameters between subroutines), and
arithmetic operations involve three operands---either three registers
or two registers and an arbitrarily sized immediate value.
On one hand, this architecture is general enough that it is possible to
generate pretty efficient code even on CISC architectures such as the
Intel x86 or the Motorola 68k families. On the other hand, it matches
real architectures closely enough that, most of the time, the
compiler's constant folding pass ends up generating code which
assembles machine instructions without further tests.
@section Drawbacks
@lightning{} has been useful in practice; however, it does have
at least four drawbacks: it has limited registers, no peephole
optimizer, no instruction scheduler and no symbolic debugger. Of
these, the last is the most critical even though it does not
affect the quality of generated code: the only way to debug code
generated at run-time is to step through it at the level of
host specific machine code. A decent knowledge of the underlying
instruction set is thus needed to make sense of the debugger's
output.
The low number of available registers (six) is also an important
limitation. However, let's take the primary application of dynamic
code generation, that is, bytecode translators. The underlying
virtual machines tend to have very few general purpose registers
(usually 0 to 2) and the translators seldom rely on sophisticated
graph-coloring algorithms to allocate registers to temporary
variables. Rather, these translators usually obtain performance
increases because: a) they remove indirect jumps, which are usually
poorly predicted, and thus often form a bottleneck, b) they
parameterize the generated code and go through the process of decoding
the bytecodes just once. So, their usage of registers is rather
sparse---in fact, in practice, six registers were found to be
enough for most purposes.
The lack of a peephole optimizer is most important on machines where a
single instruction can map to multiple native instructions. For
instance, Intel chips' division instruction hard-codes the dividend
to be in EAX and the quotient and remainder to be output, respectively,
in EAX and EDX: on such chips, @lightning{} does lots of pushing and
popping of EAX and EDX to save those registers that are not used.
Unnecessary stack operations could be removed by looking at whether
preserved registers are destroyed soon. Unfortunately, the current
implementation of @lightning{} is so fast because it only knows about
the single instruction that is being generated; performing these
optimizations would require a flow analysis pass that would probably
hinder @lightning{}'s speed.
The lack of an instruction scheduler is not very important---pretty
good instruction scheduling can actually be obtained by separating
register writes from register reads. The only architectures on which
a scheduler would be useful are those on which arithmetic instructions
have two operands; an example is, again, the x86, on which the single
instruction
@example
subr_i R0, R1, R2 @rem{!Compute R0 = R1 - R2}
@end example
@noindent
is translated to two instruction, of which the second depends on the
result of the first:
@example
movl %ebx, %eax @rem{! Move R1 into R0}
subl %edx, %eax @rem{! Subtract R2 from R0}
@end example
@ifset BOTH
@node Using GNU lightning
@chapter Using @lightning{}
This chapter describes installing and using @lightning{}.
@menu
@usingmenu{}
@end menu
@lowersections
@end ifset
@ifset USING
@include using.texi
@end ifset
@ifset BOTH
@raisesections
@node Porting GNU lightning
@chapter Porting @lightning{}
This chapter describes the process of porting @lightning{}.
It assumes that you are pretty comfortable with the usage of
@lightning{} for dynamic code generation, as described in
@ref{Using GNU lightning}.
@menu
@portingmenu{}
@end menu
@lowersections
@end ifset
@ifset PORTING
@include porting.texi
@end ifset
@ifset BOTH
@raisesections
@end ifset
@node Future
@chapter The future of @lightning{}
Presented below is the set of tasks that I feel need to be performed
to make @lightning{} a more fully functional, viable system. They are
presented in no particular order. I would @emph{very much} welcome any
volunteers who would like to help with the implementation of one or
more of these tasks. Please write to me, Paolo Bonzini, at
@email{bonzini@@gnu.org} if you are interested in adding your efforts
to the @lightning{} project.
Tasks:
@itemize @bullet
@item
The most important task to make @lightning{} more widely usable
is to retarget it. Although currently supported architectures
(x86, SPARC, PowerPC) are certainly some of the most widely used,
@lightning{} could be ported to others---namely, the Alpha and
MIPS architectures.
@item
Another interesting task is to allow the instruction stream to grow
dynamically. This is a problem because not all architectures allow
to write position independent code.@footnote{The x86's absolute
jumps, for example, are actually slow indirect jumps, and need a
register.}
@item
Optimize leaf procedures on the SPARC. This involves using the
output registers (@code{%o@i{X}}) instead of the local registers
(@code{%l@i{X}}) when writing leaf procedures; the problem is,
leaf procedures also receive parameters in the output registers,
so they would be overwritten by write accesses to general-purpose
registers.
@end itemize
@node Acknowledgements
@chapter Acknowledgements
As far as I know, the first general-purpose portable dynamic code
generator is @sc{dcg}, by Dawson R.@: Engler and T.@: A.@: Proebsting.
Further work by Dawson R. Engler resulted in the @sc{vcode} system;
unlike @sc{dcg}, @sc{vcode} used no intermediate representation and
directly inspired @lightning{}.
Thanks go to Ian Piumarta, who kindly accepted to release his own
program @sc{ccg} under the GNU General Public License, thereby allowing
@lightning{} to use the run-time assemblers he had wrote for @sc{ccg}.
@sc{ccg} provides a way of dynamically assemble programs written in the
underlying architecture's assembly language. So it is not portable,
yet very interesting.
I also thank Steve Byrne for writing GNU Smalltalk, since @lightning{}
was first developed as a tool to be used in GNU Smalltalk's dynamic
translator from bytecodes to native code.
@iftex
@contents
@end iftex
@bye