mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-02 07:30:55 -08:00
| .. | ||
| benchmark.in.html | ||
| BUGS | ||
| devel.txi | ||
| download.in.html | ||
| end | ||
| goals.in.html | ||
| head | ||
| help.lsp | ||
| index.in.html | ||
| install.in.html | ||
| license.in.html | ||
| macros.txi | ||
| Makefile.in | ||
| news.in.html | ||
| README.html | ||
| todo.txt | ||
| tutorial.txt | ||
| user.txi | ||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>ECL-Spain 0.1a</title>
</head>
<body>
<h1>ECL-Spain 0.1a</h1>
<a name="toc"><h2>Table of contents</h2></a>
<ul>
<li><a href="#intro">Introduction</a>
<li><a href="#intro">Project goals</a>
<li><a href="#news">News</a>
<li><a href="#bugs">Known bugs</a>
<li><a href="#distrib">Distribution</a>
<li><a href="#installing">Installation</a>
<li><a href="ecls-guide.html">User's guide</a>
<li><a href="#author">The author</a>
<li><a href="#bench">Benchmark</a>
</ul>
<a name="intro"><a href="#toc"><h2>Introduction</h2></a></a>
<a href="http://ecls.sourceforge.net">ECLS</a> stands for <em>Embeddable
Common-Lisp "Spain"</em>, and I usually read it as "e-klos". It is a an
implementation of the <a href="http://www.lisp.org">Common-Lisp language</a>
which aims to comply to the <a
href="http://www.lisp.org/HyperSpec/FrontMatter/index.html">ANSI X3J13</a>
definition of the language.
<p><a href="http://ecls.sourceforge.net">ECLS</a> combines a bytecodes
compiler/interpreter and a translator to C. The first one is specially suited
for prototyping and debugging. The second one produces fast code that can be
dynamically loaded into the interpreter or statically linked to build
standalone executables.
<p><a href="http://ecls.sourceforge.net">ECLS</a> is distributed under the <a
href="#copyright">GNU Library General Public License (GNU LGPL)</a>.
<p><a href="http://ecls.sourceforge.net">ECLS</a> is not a brand new
product. It has evolved from the EcoLisp implementation by Giusseppe Attardi
which in turn was based on the Kyoto Common-Lisp implementation done by Taiichi
Yuasa and Masami Hagiya, with contributions from several people. Nevertheless
the program has been seriously modified and the current code base bears little
resemblance to the previous implementations and the author of those
implementations should not be blamed for the faults of thi <a
href="http://ecls.sourceforge.net">ECLS</a>.
<a name="goals"><a href="#toc"><h2>Project goals</h2></a></a>
<ul>
<li><b>To produce a free implementation of Common-Lisp.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> is released under the LGPL or
GNU Library General Public Licence (See <a
href="Copyright">Copyright</a>). This means that <a
href="http://ecls.sourceforge.net">ECLS</a> can be used in commercial projects
while keeping the implementation free.
<li><b>Compliance to the latest ANSI spec.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> is already rather standards
compliant. <a href="http://ecls.sourceforge.net">ECLS</a> was born as a fork
from the ECL (Eco-Common-Lisp by Giussepe Attardi) which conformed to Cltl2
("Common-Lisp the Language 2"), but which was shipped with some ANSI
compatibility extensions. Currently the worst parts with respect to ANSI are
the LOOP package and parts of CLOS.
<li><b>Small code size.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> is made of a runtime library
and an interpreter. The interpreter itself is small, at most three files of C
code. Once the lisp environment is booted, it takes about 1Mb of code (although
currently it is a bit more due to debuggin issues in the interpreter). If the
whole of <a href="http://ecls.sourceforge.net">ECLS</a> is compiled from lisp
to C, the resulting program is 1.5Mb. Nevertheless, there is room for
improvement in this area.
<li><b>Embedability.</b>
<p>In a near future <a href="http://ecls.sourceforge.net">ECLS</a> will be
shipped as a library that can be linked against arbitrary C
programs. Currently, arbitrary C code can be linked against <a
href="http://ecls.sourceforge.net">ECLS</a>, either statically or at runtime.
<li><b>Portability to arbitrary environments.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> currently compiles and runs
on Linux, FreeBSD 4.x and NetBSD 1.5. Most of the code is portable. The parts
which change from operating system to operating system are about the
filesystem, sockets, signals and the allocation of big chunks of memory, but in
all it is well below 1000 lines. The worst part is related to word-size and
endianness. Work is in progress to port <a
href="http://ecls.sourceforge.net">ECLS</a> to 64-bit environments.
<li><b>Compilation via an ANSI C compiler.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> can translate lisp code to C
code that can be dynamically loaded or linked to the runtime to produce a
standalone executable. Currently this process relies on GCC as a targed
platform, but work is in progress to remove GCC dependencies.
<li><b>Better garbage collection.</b>
<p>As of this release the memory that <a
href="http://ecls.sourceforge.net">ECLS</a> can allocate is restricted to
16Mb. I have tried replacing the garbage collector with a conservative one
(Boehm's GC v 4.11) and that did fix the problems, but increases the memory
requirements of <a href="http://ecls.sourceforge.net">ECLS</a>. Since this is
really undesirable, I have been also thinking about revamping the current
garbage collector with an interface to mmap(). Time wil tell...
<li><b>Improve the compiler: more agressive inlining, better operations among
numbers and unboxed arrays of complex numbers.</b>
<p><a href="http://ecls.sourceforge.net">ECLS</a> currently can inline all
operations that involve fixnums, characters and floating point
numbers. However, the type inferencer is not very powerful and therefore some
operations are not inlined because the compiler cannot actually tell the types
of the arguments and of the output.
</ul>
<a name="news"><a href="#toc"><h2>News in this release (ECLS-0.1a)</h2></a></a>
<ul>
<li>Due to human errors, the bytecompiler shipped with 0.1a was an
unfinished version. In 0.1b we shipped a more polished files. Some
of the errors which are fixed are
<ul>
<li>Produce the right code for TAGBODY inside closures</li>
<li>Activate compiler for SYMBOL-MACROLET</li>
<li>Allow non-keyword symbols as lambda-list-keywords</li>
<li>Allow more than one :ALLOW-OTHER-KEYS to be supplied, but discard other than the first one
<li> Process declarations in FLET/LABELS forms
</ul>
<li> Fixed the C compiler routines for TAGBODY: it would produce wrong
code when jumping out of a closure.
<li> Rewrite the error system using KMP's condition system, CLOS and a
rudimentary interface to the toplevel.
<li> Enclosing the bytecompiler in an UNWIND-PROTECT ensures that the
status of the compiler and of the interpreter is always consistent.
<li> Port and incorporate Peter Van Eynde's test suite for ANSI
compliance.
<li> Replace features ECL/ECL-MIN with ECLS and ECLS-MIN. All references
to ECL (Eco-Common-Lisp) should have been dropped by now.
<li> Add simple-program-error and simple-control-error to the hierarchy
of conditions, and try to ensure that all routines in libecls.a
signal the right type of condition.
<li> Define COMPLEMENT and CONTINOUSLY.
<li> Fix #'= between bignums.
<li> NIL is no longer valid as the first of a pair of bounding index
designators, i.e. (nstring-upcase "aa" :start nil :end nil) causes
an error.
</ul>
<a name="bugs"><a href="#toc"><h2>Known bugs</h2></a></a>
As I mentioned above, the problem I am finding here is the lack of test suites
which I can use to detect failures in the behavior of any function. Currently I
can assure that <a href="http://ecls.sourceforge.net">ECLS</a> passes most of
the tests from the <a href="http://clocc.sourceforge.net">the CLOCC suite</a>.
The most important exceptions are
<ul>
<li>CLOS
<li>#'format
<li>#'unread-char is too lax
<li>The CL package is too polluted
<li>LOOP lacks some of the standard keywords, including destructuring
<li>Support for logical pathnames is incomplete
</ul>
If you find something that should be fixed or that the behavior of a
function is particularly misleading with respect to the standards, feel free
to tell me so.
Some other bugs which need to be fixed are:
<ul>
<li>Threads and sockets haven't been tested yet.
<li>#'format doesn't pass the Cltl-1 tests and fails when the number of
arguments is large.
<li>Needs better support for wildcards in pathnames.
<li>Bugs in logical operations among bignums.
<li>Support for CLOS needs yet more optimization.
</ul>
<a name="distrib"><a href="#toc"><h2>Distribution</h2></a></a>
This project is hosted at <a href="http://ecls.sourceforge.net">Source
forge</a>. You can get current copies of the sources and of the documentation
in there.
<a name="installing"><a href="#toc"><h2>Installation</h2></a></a>
<ul>
<li>Unpack the tar file
<pre>
gunzip -c ecls.tgz | tar xf -
</pre>
<li>Run the configuration file.
<pre>
cd ecls-0.1a
./configure
</pre>
The previous step creates a directory with the name <b>build</b>, and
stores a bunch of makefiles in it.
<li>Use GNU make to invoke the compilation
<pre>
make
</pre>
<li>If you want to test the fresh new executable before installing. You you
should invoke ECLS from withing the build directory using the "-dir ./"
argument to advice him about the right place to find header files, libraries,
etc. For instance, under linux the build directory is "linux" and we would do
<pre>
$ ./configure --prefix=$HOME
[...]
$ cd build
$ make
[...]
$ ./ecls -dir ./
</pre>
<li>Install it in the desired location
<pre>
make install
</pre>
</ul>
<p>As a side note, a --disable-clos is still in ./configure, but its use is
discouraged and unsupported.
<a name="author"><a href="#toc"><h2>The author</h2></a></a>
For the people who built the several pieces from ECoLisp, see the README.orig
file. To contact the author of <a href="http://ecls.sourceforge.net">ECLS</a>,
use the following address
<pre>
Juan Jose Garcia Ripoll
Univ. de Castilla-La Mancha
E.T.S.I. Industriales
Departamento de Matematicas
c/Camilo Jose Cela, 3
Ciudad Real, E-13071
Spain
<a href="mailto:jjgarcia@ind-cr.uclm.es">jjgarcia@ind-cr.uclm.es</a>
</pre>
<a name="news"><a href="#toc"><h2>Benchmark</h2></a></a>
Benchmarks should be taken with a grain of salt. <a
href="http://ecls.sourceforge.net">ECLS</a> does not aim to compete with any
commercial or open source implementation. The purpose of these benchmarks are,
thus, to show the progress of <a href="http://ecls.sourceforge.net">ECLS</a>
itself from version to version.
<p>It also serves to show how well other implementations perform: CLISPc, which
is based on bytecodes, is astonishingly fast, compared to other bytecodes
implementations (ECLSi, CMUCLi) and to native code implementations (ECLSc,
CMUCLc).
<p>All benchmarks are executed one after another. The benchmark currently shows
just mean execution times in seconds, using English decimal point (0.03 = 3/100
seconds). This means that performance of garbage collectors has a deep impact
in these numbers.
<p>It would be nice to collect some other information, such as memory use and
garbage collector timings, but that is beyond my reach for now. Help is always
welcome.
<p>Finally, I have decided to distribute Gabriel's benchmarks together with <a
href="http://ecls.sourceforge.net">ECLS</a>. The reason is that this code seems
to belong to public domain and I had to perform several changes in order to let
it run with different implementations. To recreate the benchmark just get in
<tt>build/gabriel/</tt> and type <tt>make</tt>.
<pre>
CLISPi ECLSi CMUCLi CLISPc ECLSc CMUCLc
boyer 2.490 28.283 13.520 0.397 0.767 0.110
browse 3.116 7.167 13.260 0.459 ***** 0.280
ctak 0.406 0.883 1.530 0.032 0.017 0.000
dderiv 0.455 1.317 1.850 0.110 0.167 0.080
deriv 0.405 1.133 1.670 0.111 0.167 0.070
destru-mod 1.418 0.871 2.398 0.053 0.025 0.025
destru 1.384 0.871 2.412 0.053 0.025 0.020
div2 0.889 1.867 3.850 0.132 0.150 0.070
fprint 0.026 0.046 0.015 0.026 0.042 0.015
fread 0.009 0.017 0.007 0.009 0.017 0.005
frpoly 3.026 22.750 15.240 0.625 6.267 0.220
puzzle 6.452 4.633 14.630 0.481 0.033 0.020
puzzle-mod 6.890 4.667 14.680 0.480 0.017 0.030
puzzle-mod2 6.467 4.633 14.690 0.480 0.033 0.030
stak 0.374 0.842 1.768 0.047 0.021 0.007
tak 3.394 9.183 11.500 0.208 0.033 0.020
tak-mod 3.385 9.450 11.520 0.208 0.033 0.020
takl 1.407 6.433 9.130 0.107 0.000 0.010
takr 0.346 0.971 2.035 0.026 0.004 0.002
tprint 0.022 0.046 0.023 0.022 0.046 0.020
traverse 41.230 71.767 108.390 1.880 1.450 0.370
triang-mod 74.765 169.750 255.840 7.362 1.567 3.110
triang 71.018 149.417 243.330 5.797 0.667 *****
IMPLi = Implementation IMPL interpreted
IMPLc = Implementation IMPL compiled
CLISP = CLISP 2000-03-06 (March 2000)
CMUCL = CMUCL 18c
ECLS = ECLS 0.1a
</pre></body></html>