Wayback 20090126080843

www.stripedgazelle.org/joey/dream.html
This commit is contained in:
Lassi Kortela 2023-02-22 15:58:58 +02:00
parent 83ccbac4c1
commit 35b13a5e22
1 changed files with 21 additions and 4 deletions

View File

@ -11,13 +11,20 @@ All essential syntax and procedures from the <a href="http://www.swiss.ai.mit.ed
The interpreter is properly tail recursive and passes all applicable tests from the 'r4rstest.scm' test suite.
<br />
Rational arithmetic with 32 bit numerator and denominator is supported, but no Real or Complex numbers.
<br />
Bignums (arbitrary-precision integers) are in the works, but not yet complete.
(At this point they may be read and written, added and subtracted only).
<hr>
Dream is compiled using an x86 assembler I have written in scheme, with a syntax very similar to GAS.
Dream is compiled using an x86 <a href="assembler.html">assembler</a>
I have written in Scheme, with a syntax very similar to GAS.
<br />
Consequently Dream can compile itself. :-)
<hr>
<b>Download latest version for Linux on x86:</b>
<a href="/cgi-bin/wiki_joey/dream20080228.tar.gz">dream20080228.tar.gz</a>
<a href="/cgi-bin/wiki_joey/dream20090101.tar.gz">dream20090101.tar.gz</a>
<hr>
<b>Download latest version for Windows on x86:</b>
<a href="/cgi-bin/wiki_joey/nightmare20090122.zip">nightmare20090122.zip</a>
<hr>
<b>Check out my DreamOS based on the Dream Scheme
Interpreter as a bootable floppy disk:</b> <a href="dreamos.html">dreamos</a>
@ -65,15 +72,25 @@ The high word of the type field is used to store the length of the vector.
This and all other objects which require more than a quad-word of storage simply store the address of a scheme object in the second double-word and set the low bit in the high byte of the low word of their type to indicate to the garbage collector that this address in the second double-word must be followed just as if it were the cdr of a pair.
</p>
<p>
Special forms and built-in procedures store an address to branch to in the second double-word.
Procedures store their starting address in the second double-word.
</p>
<p>
Number types are distinguished by the high byte of the low word, which increases as the complexity of the type of number ascends the numeric tower. Integers simply store their 32 bit signed value in the second half of the quad-word. Rationals are stored as a pair of integers, thus the low bit in the high byte of the low word of their type is set so that the garbage collector will see the pair. Inexactness of a number is indicated by setting the lowest bit of the high word of the number's type. Note, however, that all internal representations of numbers are exact (no floating point numbers are used), and so inexactness is given only as an auxiliary property of the number.
</p>
<p>
</p>
Input ports use the low byte of the high word of the type field to store the last character read by the (peek) procedure. The second half of the quad-word for both input and output ports holds the file descriptor associated with the port.
The ports returned by (current-input-port) and (current-output-port) are stored internally for efficiency's sake.
They therefore must be treated by the garbage collector as if they were registers.
</p>
<p>
Closures are initially stored simply as scheme along with the enclosing environment.
But as soon as the closure is applied, it is compiled to machine code.
This machine code is not relocatable, and hence a different garbage collection strategy is employed for this memory area.
The garbage collector maintains a list of start addresses of machine code of active closures, and at the beginning of each machine code block is stored a pointer to the address immediately following the end of the machine code for that closure.
Using this information, the largest free space is identified, and compilation of new closures occurs sequentially here until this space is filled.
At this point the garbage collector is invoked again, the largest space identified, and the process repeats.
This garbage collection process for machine code may be invoked from scheme with (sys-gc-lambda), which returns #t if a free space was found larger than the one that had been in use immediately prior.
</p>
<h2>The Stack</h2>
<p>
The scheme object stack is maintained as a scheme list (dynamically allocated as pairs).