[racket] dynamic compilation

From: Danny Yoo (dyoo at cs.wpi.edu)
Date: Fri Jan 20 18:58:26 EST 2012

For the upcoming version of WeScheme, I'm planning to use the real
'compile' from Racket.  I'm trying to better understand a part of the
compilation system.  Here's a sample program I'm using to play:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#lang racket/base

(define ns (make-base-namespace))
(define (do-compilation program)
  (parameterize ([current-namespace ns]
                 [read-accept-reader #t])
    (define bytes (compile (read-syntax #f (open-input-string program))))
    (define op (open-output-bytes))
    (write bytes op)
    (get-output-bytes op)))

(define (do-compilation/fresh program)
  (parameterize ([current-namespace (make-base-namespace)]
                 [read-accept-reader #t])
    (define bytes (compile (read-syntax #f (open-input-string program))))
    (define op (open-output-bytes))
    (write bytes op)
    (get-output-bytes op)))

(time
 (for ([i 1000])
   (void (do-compilation "#lang racket/base\n\n(printf \"Hello world\")"))))

(time
 (for ([i 1000])
   (void (do-compilation/fresh "#lang racket/base\n\n(printf \"Hello
world\")"))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

I see that the first do-compilation, the one that shares a namespace,
runs faster than the version that generates fresh namespaces.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
kui ~ $ racket measure-compile-time.rkt
cpu time: 2244 real time: 2242 gc time: 172
cpu time: 5244 real time: 6144 gc time: 516
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

I assume that the reason for the difference is because the first
version touches some namespace state that's used as a part of
compilation, so that future compilations can reuse that state.


Question: is the first version vulnerable to a memory leak?  That is,
let's say that I enforce all programs going through do-compilation to
be in a hardcoded set of designated #langs.  Do I run the risk of
exhausting memory?


Thanks!

Posted on the users mailing list.