GNU Info

Info Node: (librep.info)Disassembly

(librep.info)Disassembly


Prev: Compilation Tips Up: Compiled Lisp
Enter node , (file) or (file)node

Disassembly
-----------

   It is possible to disassemble byte-code forms; originally this was
so I could figure out why the compiler wasn't working but if you're
curious about how the compiler compiles a form it may be of use to you.

   Naturally, the output of the disassembler is a listing in the
assembly language of the `librep' virtual machine--it won't take a
byte-code form and produce the equivalent Lisp code!

 - Command: disassemble-fun function #!optional stream
     This function disassembles the compile Lisp function FUNCTION. It
     writes a listing to the output stream STREAM (normally the value
     of the `standard-output' variable).

     When called interactively it will prompt for a function to
     disassemble.

   When reading the output of the disassembler bear in mind that
`librep' simulates a stack machine for the code to run on. All
calculations are performed on the stack, the value left on the stack
when the piece of code ends is the value of the byte-code form.

   Here is a small example. Consider the `fib' function given at the
start of this section:

     (define (fib n)
       (if (<= n 2)
           1
         (+ (fib (- n 1))
            (fib (- n 2)))))

After compilation and disassembly, the following is produced (but
without the annotations):

     Disassembly of #<closure fib>:
     
     21 bytes, 1 constants, and (5,0,1) stack slots
     
     0    required-arg       ;requires a single parameter
     1    dup
     2    slot-set #0        ;store it in register 0 (r0)
     3    pushi 2
     4    le
     5    jn 10              ;unless r0 <= 2, goto 10
     8    pushi 1
     9    return             ;else, return 1
     10   refg [0] fib
     11   slot-ref #0
     12   dec
     13   call #1            ;push result of (fib (1- n))
     14   refg [0] fib
     15   slot-ref #0
     16   pushi 2
     17   sub
     18   call #1            ;push (fib (- n 2))
     19   add
     20   return             ;return the sum of the two calls


automatically generated by info2www version 1.2.2.9