[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
GNU Guile 3.0.6 released
GNU Guile 3.0.6 released
Wed, 28 Apr 2021 09:17:28 +0200
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux)
We are pleased to announce GNU Guile release 3.0.6, the latest in the
3.0 stable release series.
Compared to the previous release in the 3.0 series, Guile 3.0.6 improves
source-location information for compiled code, removes the dependency on
libltdl, fixes some important bugs, adds an optional bundled "mini-gmp"
library, as well as the usual set of minor optimizations and bug fixes.
Compared to the previous stable series (2.2.x), Guile 3.0 adds support
for just-in-time native code generation, speeding up all Guile programs.
See the NEWS extract at the end of the mail for full details.
The Guile web page is located at http://gnu.org/software/guile/, and
among other things, it contains a copy of the Guile manual and pointers
to more resources.
Guile is an implementation of the Scheme programming language, packaged
for use in a wide variety of environments. In addition to implementing
the R5RS, R6RS, and R7RS Scheme standards, Guile includes full access to
POSIX system calls, networking support, multiple threads, dynamic
linking, a foreign function call interface, powerful string processing,
and HTTP client and server implementations.
Guile can run interactively, as a script interpreter, and as a Scheme
compiler to VM bytecode. It is also packaged as a library so that
applications can easily incorporate a complete Scheme interpreter/VM.
An application can use Guile as an extension language, a clean and
powerful configuration language, or as multi-purpose "glue" to connect
primitives provided by the application. It is easy to call Scheme code
from C code and vice versa. Applications can add new functions, data
types, control structures, and even syntax to Guile, to create a
domain-specific language tailored to the task at hand.
Guile 3.0.6 can be installed in parallel with Guile 2.2.x; see
A more detailed NEWS summary follows these details on how to get the
Here are the compressed sources:
Here are the GPG detached signatures[*]:
Use a mirror for higher download bandwidth:
Here are the SHA256 checksums:
[*] Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact. First, be sure to download both the .sig file
and the corresponding tarball. Then, run a command like this:
gpg --verify guile-3.0.6.tar.gz.sig
If that command fails because you don't have the required public key,
then run this command to import it:
gpg --keyserver keys.gnupg.net --recv-keys
and rerun the 'gpg --verify' command.
This release was bootstrapped with the following tools:
An extract from NEWS follows.
Changes in 3.0.6 (since 3.0.5)
* Notable changes
** Reimplement dynamic library loading ("dlopening") without libltdl
Guile used to load dynamic libraries with libltdl, a library provided by
the Libtool project.
Libltdl provided some compatibility benefits when loading shared
libraries made with older toolchains on older operating systems.
However, no system from the last 10 years or so appears to need such a
thick compatibility layer.
Besides being an unmaintained dependency of limited utility, libltdl
also has the negative aspect that in its search for libraries to load,
it could swallow useful errors for libraries that are found but not
loadable, instead showing just errors for search path candidates that
are not found.
Guile now implements dynamic library loading directly in terms of the
standard "dlopen" interface, providing a limited shim for platforms with
similar functionality exposed under different names (MinGW).
This change has a few practical impacts to Guile users. There is a new
library search path variable, `GUILE_EXTENSIONS_PATH'. Also, errors when
loading a library fails now have better errors. And Guile no longer has
a libltdl dependency.
Although Guile no longer uses libltdl, for backwards compatibility Guile
still adds `LTDL_LIBRARY_PATH' to the loadable library search path, and
includes ad-hoc logic to support uninstalled dynamically loadable
libraries via also adding the ".libs" subdirectories of
`LTDL_LIBRARY_PATH' elements. See "Foreign Libraries" in the
documentation for a full discussion.
** Fix important incompatibility with GnuTLS
Guile uses the GNU multi-precision (GMP) library to implement
arbitrary-precision integers (bignums) and fractions. Usually Guile is
built to dynamically link to libgmp. In this configuration, any other
user of GMP in the process uses the same libgmp instance, with the same
An important piece of shared state is the GMP allocator, responsible for
allocating storage for the digits of large integers. For Guile it's
most efficient to install libgc as the GMP allocator. That way Guile
doesn't need to install finalizers, which have significant overhead, to
free GMP values when Guile bignums are collected. Using libgc to
allocate digits also allows Guile's GC to adequately measure the memory
cost of these values.
However, if the Guile process is linked to some other user of GMP, then
probably the references from the other library to GMP values aren't
visible to the garbage collector. In this case libgc could prematurely
collect values from that other GMP user.
This isn't theoretical, sadly: it happens for Guile-GnuTLS. GnuTLS uses
GMP, and so does Guile. Since Guile 2.0.4, Guile has installed libgc as
the GMP allocator, so since then, Guile-GnuTLS has been buggy.
Therefore, the default is now to not install libgc as the GMP allocator.
This may slow down some uses of bignums. If you know that your Guile
program will never use a library that uses GMP, you can set the
GUILE_INSTALL_GMP_MEMORY_FUNCTIONS=1 variable in your environment.
Guile sets this environment variable when building Guile, for example.
See "Environment Variables" in the manual, for more.
In some future, Guile may switch to GMP's more low-level "MPN" API for
working with bignums, which would allow us to regain the ability to use
GC-managed digit storage in all configurations.
** New build option: --enable-mini-gmp
For some users, it would be preferable to bundle a private copy of the
GMP bignum library into Guile. Some users would like to avoid the extra
dependency. Others would like to use libgc to manage GMP values, while
not perturbing the GMP allocator for other GMP users.
For these cases, Guile now has an --enable-mini-gmp configure option,
which will use a stripped-down version of GMP, bundled with Guile. This
code doesn't have all the algorithmic optimizations of full GMP, but
implements the same API in a basic way. It can be more optimal in a
Guile context, given that it can use libgc to allocate its data.
Note that a build with --enable-mini-gmp is not ABI-compatible with a
"stock" build, as functions that use GMP types (scm_to_mpz,
scm_from_mpz) are not exported.
Thanks to Niels Möller and other GMP developers for their mini-gmp
** New `read' implementation in Scheme
Guile's `read' procedure has been rewritten in Scheme. Compared to the
C reader (which still exists for bootstrapping reasons), the new
implementation is more maintainable, more secure, more debuggable, all
while faithfully reproducing all quirks from Guile's previous reader
implemented in C. Also, the Scheme reader is finally compatible with
suspendable ports, allowing REPL implementations to be built with
lightweight concurrency packages such as the third-party "Fibers"
library. Calls to `read' from Scheme as well as calls to `scm_read'
from C use the new reader.
The Scheme implementation is currently about 60% as fast as the
now-inaccessible C implementation, and we hope to close the gap over
time. Bug reports very welcome.
** Scheme compiler uses `read-syntax' for better debugging
The new Scheme reader also shares implementation with the new
`read-syntax' procedure, which annotates each datum with source location
information. Guile's compiler can use this to provide better
source-level debugging for Scheme programs. Note that this can slightly
increase compiled file sizes, though this is mitigated by some assembler
** Syntax objects record source locations
When compiling a file that defines a macro, the output will usually
include a number of syntax objects as literals. Previously, these
literals had no source information; now they do. This should improve
** Optimized run-time relocations
The code that patches references between statically-allocated Scheme
data has been optimized to be about 30% shorter than before or so, which
can significantly decrease compiled file size and run-time
** Optimized calls to known functions
For calls where the callee is within the compilation unit, Guile can now
skip the argument count check.
** Reduce code size for calls to module variables
All calls to a given exported or private variable from a module now
dispatch through the same trampoline function. This reduces code size.
** Updated Gnulib
The Gnulib compatibility library has been updated, for the first time
since 2017 or so. We expect no functional change but look forward to
any bug reports.
* New interfaces and functionality
See "Ports" in the manual.
** `call-with-input-bytevector', `call-with-output-bytevector'
See "Bytevector Ports" in the manual.
** `GUILE_EXTENSIONS_PATH' environment variable.
See "Environment Variables" in the manual.
** `mkdtemp' and `mkstemp'
See "File System" in the manual. There is still `mkstemp!' but we
recommend that new code uses `mkstemp', which does not mutate the
contents of the "template" argument string. Instead for `mkstemp' you
get the name of the newly-created file by calling `port-filename' on the
** `(system foreign-library)' module
See the newly reorganized "Foreign Function Interface", for details.
These new interfaces replace `dynamic-link', `dynamic-pointer' and
similar, which will eventually be deprecated.
See "Annotated Scheme Read" in the manual.
See "Syntax Case" in the manual.
See "Syntax Transformer Helpers" in the manual.
** R6RS vector-map, vector-for-each
* Bug fixes
** Fix reverse-list->string docstring
** Fix R7RS "member" result when no item found
** Fix make-transcoded-port on input+output ports
** Fix (ice-9 ftw) on filesystems where inode values are meaningless
** Fix many bugs that prevented Guile from building on MinGW
** Fix many bugs that prevented Guile from building on MinGW64
** Fix many bugs that prevented Guile's test suite from running on MinGW
** Fix srfi-69 merge-hash
** Fix suspendable-ports implementation of get-bytevector-some!
** Fix overread in string-locale<?, string-locale-ci<?, and friends
** Fix handling of parameter lists to elisp defun to allow nil
** Fix closure-conversion bug for SCC with no free vars and one not-well-known
** Fix error when < passed non-real value
** Fix bug in which exported and private names in a used module could alias
** Fix bug with slot options in redefinable GOOPS classes
** Fix bugs regarding port buffering for TLS connections in web client
Thanks to Vasilij Schneidermann, Andrey Ivanov, Rob Browning, Erik
Dominikus, Göran Weinholt, Michael Gran, Andrew Whatson, Ricardo
G. Herdt, Jan Nieuwenhuizen, David Thompson, and abcdw.
* New deprecations
This function now has no effect; Guile will not unload dynamically
linked modules, as that can destabilize the system.
* Incompatible changes
** `call-with-output-string' closes port on normal exit
This procedure used to leave the port open, even though there was no
useful way to access it. Now we clean it up more promptly, disposing
any possible associated iconv descriptor.
- GNU Guile 3.0.6 released,
Andy Wingo <=