[racket] dynamic compilation
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!