mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-11 11:42:51 -08:00
327 lines
13 KiB
HTML
327 lines
13 KiB
HTML
<!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 Giuseppe 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>
|