Guile 2.0 compiles Scheme code to bytecode, which is then
interpreted by the VM. This gives a noticeable performance
improvement compared to earlier Guile series.

By default source code is compiled automatically as it is
encountered, without any manual intervention. The guile-tools
compile command provides a command-line interface, and there are also
Scheme procedures to drive the compiler.

Besides Scheme, the compiler comes with front-ends for the
ECMAScript and Emacs Lisp languages.

New REPL, new debugger

A read-eval-print-loop (REPL) is available. Compared to the
REPL in earlier releases, it supports "meta-commands" that provide
convenient access to interactive programming features. For instance,
the ,compile meta-command compiles the given expression,
,profile shows an execution profile of the given expression, etc.

Any error or uncaught exception leads to a "recursive REPL",
which is a REPL augmented with debugging capabilities: it has
meta-commands to display a backtrace, inspect the variables on a stack
frame, etc. The recursive REPL can be quit to return to the original
one.

Support for hygienic macros

The syntax-rules and syntax-case hygienic macro systems
are supported natively by Guile, without importing (ice-9 syncase),
and work across module boundaries. They are a better replacement for
defmacro.

Unicode support

Scheme strings can hold any Unicode character, and ports can
read and write Unicode text in various encodings.

Partial R6RS compatibility

The library and import forms of R6RS are supported, and
all the R6RS libraries defined in the standard are available. See
"R6RS Incompatibilities" in the manual, for details about remaining
incompatibilities.

New dynamic foreign function interface

The (system foreign) module provides a new dynamic foreign
function interface (FFI). It allows bindings to C libraries to be
written without a single line of C code.

Switch to the Boehm-Demers-Weiser garbage collector

Guile now uses the Boehm-Demers-Weiser conservative garbage
collector (aka. libgc). It makes interaction with C code easier
making, for instance, the use of mark and free SMOB procedures
optional in many cases. It also improves performance.