1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 21:10:27 +02:00

allow specification of languages by name; add decompilers to languages

* module/system/base/language.scm (lookup-decompilation-order): New
  function, like its compiling cousin, but backwards.
  (compute-translation-order): Rework so that languages can be specified
  either by name or by identity. Return a list of language - procedure
  pairs, without the "to" language in the list, instead of a list of
  languages.
  (invalidate-compilation-cache!): Invalidate the decompilation cache
  too.
  (<language>): Add a decompiler field.

* module/system/base/compile.scm (compile-passes): Much simpler now that
  lookup-compilation-order gives us the procedures directly.

* module/language/*/spec.scm: Specify compilers by name, so that we can
  avoid unnecessary module loads, and so that when we specify
  decompilers, we can avoid cycles.
This commit is contained in:
Andy Wingo 2009-01-30 11:41:02 +01:00
parent 4b31848284
commit 5d6fb8bbeb
8 changed files with 43 additions and 34 deletions

View file

@ -21,7 +21,6 @@
(define-module (language assembly spec) (define-module (language assembly spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language bytecode spec)
#:use-module (language assembly compile-bytecode) #:use-module (language assembly compile-bytecode)
#:export (assembly)) #:export (assembly))
@ -31,5 +30,5 @@
#:reader read #:reader read
#:printer write #:printer write
#:parser read ;; fixme: make a verifier? #:parser read ;; fixme: make a verifier?
#:compilers `((,bytecode . ,compile-bytecode)) #:compilers `((bytecode . ,compile-bytecode))
) )

View file

@ -21,7 +21,6 @@
(define-module (language bytecode spec) (define-module (language bytecode spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language objcode spec)
#:use-module (system vm objcode) #:use-module (system vm objcode)
#:export (bytecode)) #:export (bytecode))
@ -33,5 +32,5 @@
#:version "0.3" #:version "0.3"
#:reader read #:reader read
#:printer write #:printer write
#:compilers `((,objcode . ,compile-objcode)) #:compilers `((objcode . ,compile-objcode))
) )

View file

@ -21,7 +21,6 @@
(define-module (language ghil spec) (define-module (language ghil spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language glil spec)
#:use-module (language glil) #:use-module (language glil)
#:use-module (language ghil) #:use-module (language ghil)
#:use-module (language ghil compile-glil) #:use-module (language ghil compile-glil)
@ -41,5 +40,5 @@
#:reader read #:reader read
#:printer write-ghil #:printer write-ghil
#:parser parse #:parser parse
#:compilers `((,glil . ,compile-glil)) #:compilers `((glil . ,compile-glil))
) )

View file

@ -21,7 +21,6 @@
(define-module (language glil spec) (define-module (language glil spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language assembly spec)
#:use-module (language glil) #:use-module (language glil)
#:use-module (language glil compile-assembly) #:use-module (language glil compile-assembly)
#:export (glil)) #:export (glil))
@ -38,5 +37,5 @@
#:reader read #:reader read
#:printer write-glil #:printer write-glil
#:parser parse-glil #:parser parse-glil
#:compilers `((,assembly . ,compile-asm)) #:compilers `((assembly . ,compile-asm))
) )

View file

@ -21,7 +21,6 @@
(define-module (language objcode spec) (define-module (language objcode spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language value spec)
#:use-module (system vm objcode) #:use-module (system vm objcode)
#:use-module (system vm program) #:use-module (system vm program)
#:export (objcode make-objcode-env)) #:export (objcode make-objcode-env))
@ -49,5 +48,5 @@
#:version "0.3" #:version "0.3"
#:reader #f #:reader #f
#:printer write-objcode #:printer write-objcode
#:compilers `((,value . ,objcode->value)) #:compilers `((value . ,objcode->value))
) )

View file

@ -22,7 +22,6 @@
(define-module (language scheme spec) (define-module (language scheme spec)
#:use-module (system base language) #:use-module (system base language)
#:use-module (language scheme compile-ghil) #:use-module (language scheme compile-ghil)
#:use-module (language ghil spec)
#:export (scheme)) #:export (scheme))
;;; ;;;
@ -46,7 +45,7 @@
#:version "0.5" #:version "0.5"
#:reader read #:reader read
#:read-file read-file #:read-file read-file
#:compilers `((,ghil . ,compile-ghil)) #:compilers `((ghil . ,compile-ghil))
#:evaluator (lambda (x module) (primitive-eval x)) #:evaluator (lambda (x module) (primitive-eval x))
#:printer write #:printer write
) )

View file

@ -140,15 +140,9 @@
(error "language has no #:read-file" lang)))) (error "language has no #:read-file" lang))))
(define (compile-passes from to opts) (define (compile-passes from to opts)
(let lp ((langs (or (lookup-compilation-order from to) (map cdr
(error "no way to compile" (language-name from) (or (lookup-compilation-order from to)
"to" (language-name to)))) (error "no way to compile" from "to" to))))
(out '()))
(if (null? (cdr langs))
(reverse! out)
(lp (cdr langs)
(cons (assq-ref (language-compilers (car langs)) (cadr langs))
out)))))
(define (compile-fold passes exp env opts) (define (compile-fold passes exp env opts)
(if (null? passes) (if (null? passes)

View file

@ -24,9 +24,10 @@
#:export (define-language lookup-language make-language #:export (define-language lookup-language make-language
language-name language-title language-version language-reader language-name language-title language-version language-reader
language-printer language-parser language-read-file language-printer language-parser language-read-file
language-compilers language-evaluator language-compilers language-decompilers language-evaluator
lookup-compilation-order invalidate-compilation-cache!)) lookup-compilation-order lookup-decompilation-order
invalidate-compilation-cache!))
;;; ;;;
@ -42,6 +43,7 @@
(parser #f) (parser #f)
(read-file #f) (read-file #f)
(compilers '()) (compilers '())
(decompilers '())
(evaluator #f)) (evaluator #f))
(define-macro (define-language name . spec) (define-macro (define-language name . spec)
@ -56,20 +58,39 @@
(error "no such language" name)))) (error "no such language" name))))
(define *compilation-cache* '()) (define *compilation-cache* '())
(define *decompilation-cache* '())
(define (invalidate-compilation-cache!) (define (invalidate-compilation-cache!)
(set! *decompilation-cache* '())
(set! *compilation-cache* '())) (set! *compilation-cache* '()))
(define (compute-compilation-order from to) (define (compute-translation-order from to language-translators)
(cond
((not (language? to))
(compute-translation-order from (lookup-language to) language-translators))
(else
(let lp ((from from) (seen '())) (let lp ((from from) (seen '()))
(cond ((eq? from to) (reverse! (cons from seen))) (cond
((not (language? from))
(lp (lookup-language from) seen))
((eq? from to) (reverse! seen))
((memq from seen) #f) ((memq from seen) #f)
(else (or-map (lambda (lang) (lp lang (cons from seen))) (else (or-map (lambda (pair)
(map car (language-compilers from))))))) (lp (car pair) (acons from (cdr pair) seen)))
(language-translators from))))))))
(define (lookup-compilation-order from to) (define (lookup-compilation-order from to)
(or (assoc-ref *compilation-cache* (cons from to)) (let ((key (cons from to)))
(let ((order (compute-compilation-order from to))) (or (assoc-ref *compilation-cache* key)
(let ((order (compute-translation-order from to language-compilers)))
(set! *compilation-cache* (set! *compilation-cache*
(acons (cons from to) order *compilation-cache*)) (acons key order *compilation-cache*))
order))) order))))
(define (lookup-decompilation-order from to)
(let ((key (cons from to)))
(or (assoc-ref *decompilation-cache* key)
(let ((order (compute-translation-order from to language-decompilers)))
(set! *decompilation-cache*
(acons key order *decompilation-cache*))
order))))