... .. .x+=:.
.=*8888x <"?88h. z` ^%
X> '8888H> '8888 u. u. u. . <k
'88h. `8888 8888 ...ue888b x@88k u@88c. .u .@8Ned8"
'8888 '8888 "88> 888R Y888r ^"8888""8888" ud8888. .@^%8888"
`888 '8888.xH888x. 888R I888> 8888 888R :888'8888. x88: `)8b.
X" :88*~ `*8888> 888R I888> 8888 888R d888 '88%" 8888N=*8888
~" !"` "888> 888R I888> 8888 888R 8888.+" %8" R88
.H8888h. ?88 u8888cJ888 8888 888R 8888L @8Wou 9%
:"^"88888h. '! "*888*P" "*88*" 8888" '8888c. .+ .888888P`
^ "88888hx.+" 'Y" "" 'Y" "88888% ` ^"F
^"**"" "YP'
This is BONES, a compiler for R5RS Scheme that generates x86_64
assembly code. BONES is designed to be simple and easy to understand,
both to reduce the effort to learn and extend the system and to keep
the complexity of the compiler at a minimum.
BONES is a batch-compiler, it takes a Scheme source file and produces
an assembler file to be subsequently translated into object code. It
is also a whole-program compiler, which means it does not support
separate compilation of multiple modules. The runtime system is by
default added to your program before it is compiled, so there are no
external libraries, with the exception of a few bits from the C library
("libc") (this is optional).
BONES is mostly R5RS-compliant, but intentionally cuts some corners
to reduce code-size, increase performance and simplify the compiler
and runtime system. Type-checks are generally omitted, for example.
Very little error checking is done and arithmetic overflow of small
integers ("fixnums") is not detected. Some R7RS procedures are available
in addition to the primitives required for R5RS.
Since BONES produces assembly-code, build-times are quite short. The
produced code is CPU- and OS-specific and currently supports x86_64 on
Linux, *BSD, Mac or Windows. Porting the system to other architectures
and operating systems should be (relatively) straightforward, as the
platform-specific parts of the compiler are small and the runtime-system
is just a single file of about two thousand lines of assembly code.
The compiler is self-compiling and uses just a few functions from the
C-library. Alternatively, programs can be compiled on Linux without
using a C library, by just invoking raw system calls, but support
for this is currently incomplete (mostly related to number<->string
conversion). Code compiled with BONES can be easily embedded into
programs written in other languages as long as they allow calling
C functions.
There are very little debugging facilities. The compiler expects correct
code and no attempt is made to provide more than the most basic error
messages. It is recommended to develop and test code first in an
interactive Scheme implementation and use BONES only for generating
executables when the code can be assumed to work.
The compiler itself is developed with a currently unreleased Scheme
system, but as BONES compiles itself, no additional implementation is
needed to make changes and extend the system.