From: Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de>
Subject: status: separation of expansion/optimization/memoization/execution
Date: Sat, 3 Aug 2002 00:42:21 +0200 (CEST) [thread overview]
Message-ID: <Pine.GSO.4.05.10208022349150.5209-100000@sallust.ida.ing.tu-bs.de> (raw)
Hi folks,
just wanted to let you know that I have actually been working on the issue
above: Currently I am splitting up built-in macros following the
following pattern:
Former function:
SCM
scm_m_foo (SCM expr, SCM env)
{
/* perform syntax checking, expansion, minor optimizations and
memoization in one step. */
return <new_expr>;
}
New set of functions:
static SCM
expand_foo (SCM expr, SCM env)
{
/* perform syntax checking and expansion. After this step, the code is
still valid scheme code. However, not all features are used. */
return expanded_expr;
}
static SCM
optimize_foo (SCM expr, SCM env SCM_UNUSED)
{
/* Most optimization functions are empty upto now. In some cases,
minor optimizations are performed. After this step, the code is
still valid scheme code. However, not all features are used. */
return optimized_expr;
}
static SCM
memoize_foo (SCM expr, SCM env)
{
/* return the memoized form of foo. In some cases, minor memoization
related optimizations are performed. After this step, the code is
not valid scheme code any more, and, with the current printer and
reader, it can not be written and re-read. */
return memoized_expr;
}
SCM
scm_m_foo (SCM expr, SCM env)
{
/* first, call expand_foo. Then, using the result, call optimize_foo.
Then, using the result of optimize_foo, call memoize_foo. */
return memoized_expr;
}
Basically, with the changes above everythings still works as before, that
is, expansion and friends are still executed dynamically during execution.
However, the functionality of each of the builtin-mmacros is more cleanly
separated into different tasks with different responsibilities. And, I
have added more exhaustive syntax checks into the expand_foo functions.
Up to now I have done this only for "if", "set!", "and", "or", "case",
"cond" and "do". I also have simplified SCM_CEVAL at those places, where
due to the more extensive syntax checks in expand_foo some execution-time
syntax checks could be eliminated. (However, all this takes some time,
since I only manage to finish at most one macro each day.)
The effect so far is, that booting guile takes noticably longer (at least
15%), but for example executing the test-suite is almost as fast as before
(2% slower). Unfortunately, it is not yet possible to achieve large
performance improvements. This will only be possible when the steps are
really separated. Then, memoizing variable locations in the memoize_foo
functions will be possible, which simply can not work at the moment: One
reason is the re-writing of internal defines, which disallows the
memoization of variables until the expansion phase is completed.
I have, however, not taken care of keeping track of debugging information
so far. That is, I would like to hear suggestions about how this should
be done, since I don't have looked into that issue yet. If someone is
interested to give the stuff a review (with respect to the debugging
issues or just generally), I would be glad to send you the patches for
eval.c and eval.h. If the debugging stuff is worked out, it could even
make sense to submit the changes so far to allow for a broader testing in
the head branch.
Best regards,
Dirk Herrmann
_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://mail.gnu.org/mailman/listinfo/guile-devel
next reply other threads:[~2002-08-02 22:42 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-08-02 22:42 Dirk Herrmann [this message]
2002-08-02 23:15 ` status: separation of expansion/optimization/memoization/execution Rob Browning
2002-08-02 23:47 ` Han-Wen
2002-08-02 23:20 ` Dale P. Smith
2002-08-03 12:12 ` Han-Wen
2002-08-04 1:51 ` Dirk Herrmann
2002-08-04 2:03 ` Han-Wen
2002-08-04 2:05 ` Tom Lord
2002-08-04 2:11 ` Tom Lord
2002-08-04 2:20 ` for example Tom Lord
2002-08-04 2:27 ` i know -- let's play bridge! Tom Lord
2002-08-04 2:46 ` Tom Lord
2002-08-04 2:50 ` Thomas Bushnell, BSG
2002-08-04 2:57 ` Tom Lord
2002-08-04 3:04 ` Thomas Bushnell, BSG
2002-08-04 3:43 ` Tom Lord
2002-08-04 3:53 ` Thomas Bushnell, BSG
2002-08-04 4:03 ` Tom Lord
2002-08-04 4:10 ` Tom Lord
2002-08-04 3:50 ` Tom Lord
2002-08-04 3:55 ` Tom Lord
2002-08-04 3:58 ` Tom Lord
2002-08-05 18:15 ` status: separation of expansion/optimization/memoization/execution Marius Vollmer
2002-08-05 18:11 ` Marius Vollmer
2002-08-07 20:51 ` Dirk Herrmann
2002-08-10 13:01 ` Marius Vollmer
2002-08-14 19:30 ` Dirk Herrmann
2002-08-26 22:11 ` Marius Vollmer
2002-08-05 18:36 ` Neil Jerram
2002-08-07 20:55 ` Dirk Herrmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.GSO.4.05.10208022349150.5209-100000@sallust.ida.ing.tu-bs.de \
--to=dirk@sallust.ida.ing.tu-bs.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).