diff options
author | Andy Wingo <wingo@pobox.com> | 2008-11-14 22:42:31 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2008-11-14 22:42:31 +0100 |
commit | b0b180d5227d76f5ca1e2f48b06f6d45195bd1f8 (patch) | |
tree | c4402c9e04ec35d4e22092cc829b6cbddaa383eb /module/language/objcode | |
parent | 7493339cfc36cf95b77aa8a1ad4cd0b5dd36710a (diff) | |
download | guile-b0b180d5227d76f5ca1e2f48b06f6d45195bd1f8.tar.gz |
nifty generic compiler infrastructure -- no more hardcoded passes
* module/system/base/language.scm (<language>): Rework so that instead of
hardcoding passes in the language, we define compilers that translate
from one language to another. Add `parser' to the language fields, a
bit of a hack but useful for languages with s-expression external
representations but with record internal representations.
(define-language, *compilation-cache*, invalidate-compilation-cache!)
(compute-compilation-order, lookup-compilation-order): Add an algorithm
that does a depth-first search for a translation path from a source
language to a target language, caching the result in a lookup table.
* module/language/scheme/spec.scm:
* module/language/ghil/spec.scm: Update to the new language format.
* module/language/glil/spec.scm: Add a language specification for GLIL,
with a compiler to objcode. Also there are parsers and printers, for
repl usage, but for some reason this doesn't work yet.
* module/language/objcode/spec.scm: Define a language specification for
object code. There is some sleight of hand here, in the "compiler" to
values; but there is method behind the madness, because this way we
higher levels can pass environments (a module + externals pair) to
objcode->program.
* module/language/value/spec.scm: Define a language specification for
values. There is something intellectually dishonest about this, but it
does serve its purpose as a foundation for the language hierarchy.
* configure.in:
* module/language/Makefile.am
* module/language/ghil/Makefile.am
* module/language/glil/Makefile.am
* module/language/objcode/Makefile.am
* module/language/value/Makefile.am:
Autotomfoolery for the ghil, glil, objcode, and value languages.
* module/language/scheme/translate.scm (translate): Import the bits that
understand `compile-time-environment' here, and pass on the relevant
portions of the environment to the next compiler pass.
* module/system/base/compile.scm (current-language): New procedure, refs
the current language fluid, or lazily sets it to scheme.
(call-once, call-with-output-file/atomic): Refactor these bits to use
with-throw-handler. No functional change.
(compile-file, compile-and-load, compile-passes, compile-fold)
(compile): Refactor the public interface of the compiler to be generic
and simple. Uses `lookup-compilation-order' to find a path from the
source language to the target language.
* module/system/base/syntax.scm (define-type): Adapt to changes in
define-record.
(define-record): Instead of expecting all slots in the first form,
expect them in the body, and let the first form hold the options.
* module/system/il/compile.scm (compile): Adapt to the compilation pass
API (three in and two out).
* module/system/il/ghil.scm (<ghil-var>, <ghil-env>)
(<ghil-toplevel-env>): Adapt to define-record changes.
* module/system/il/glil.scm (<glil-vars>): Adapt to define-record
changes.
(<glil>, print-glil): Add a GLIL record printer that uses unparse.
(parse-glil, unparse-glil): Update unparse (formerly known as pprint),
and write a parse function.
* module/system/repl/common.scm (<repl>): Adapt to define-record changes.
(repl-parse): New function, parses the read form using the current
language. Something of a hack.
(repl-compile): Adapt to changes in `compile'.
(repl-eval): Fix up the does-the-language-have-a-compiler check for
changes in <language>.
* module/system/repl/repl.scm (start-repl): Parse the form before eval.
* module/system/repl/command.scm (describe): Parse.
(compile): Be more generic.
(compile-file): Adapt to changes in compile-file.
(disassemble, time, profile, trace): Parse.
* module/system/vm/debug.scm:
* module/system/vm/assemble.scm: Adapt to define-record changes.
* module/language/scheme/translate.scm (receive): Fix an important bug
that gave `receive' letrec semantics instead of let semantics. Whoops!
Diffstat (limited to 'module/language/objcode')
-rw-r--r-- | module/language/objcode/Makefile.am | 3 | ||||
-rw-r--r-- | module/language/objcode/spec.scm | 52 |
2 files changed, 55 insertions, 0 deletions
diff --git a/module/language/objcode/Makefile.am b/module/language/objcode/Makefile.am new file mode 100644 index 000000000..6d81c41c1 --- /dev/null +++ b/module/language/objcode/Makefile.am @@ -0,0 +1,3 @@ +SOURCES = spec.scm +modpath = language/objcode +include $(top_srcdir)/am/guilec diff --git a/module/language/objcode/spec.scm b/module/language/objcode/spec.scm new file mode 100644 index 000000000..5e0ae3cc3 --- /dev/null +++ b/module/language/objcode/spec.scm @@ -0,0 +1,52 @@ +;;; Guile Lowlevel Intermediate Language + +;; Copyright (C) 2001 Free Software Foundation, Inc. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(define-module (language objcode spec) + #:use-module (system base language) + #:use-module (language value spec) + #:use-module (system vm objcode) + #:export (objcode make-objcode-env)) + +(define (make-objcode-env module externals) + (cons module externals)) + +(define (objcode-env-module env) + (if env (car env) (current-module))) + +(define (objcode-env-externals env) + (if env (cdr env) '())) + +(define (objcode->value x e opts) + (let ((thunk (objcode->program x (objcode-env-externals e)))) + (if e + (save-module-excursion + (lambda () + (set-current-module (objcode-env-module e)) + (values (thunk) #f))) + (values (thunk) #f)))) + +(define-language objcode + #:title "Guile Object Code" + #:version "0.3" + #:reader #f + #:printer (lambda (x port) (uniform-vector-write (objcode->u8vector x) port)) + #:compilers `((,value . ,objcode->value)) + ) |