next up previous
Next: 9 生成コードの実行 Up: 8 アセンブル Previous: 8.1 コード表示

8.2 コンパイラへの組み込み

コンパイラへの組み込みは, コンパイラが,

(defun scheme-compile (x)
  (init-scheme-compiler)
  (comp-lambda '() (list x) nil))
という具合になっているので,comp-lambdaの コード部分をassembleするということで 行います.

(defun comp-lambda (args body env)
  (make-fn
   :env env :args args
   :code
   (assemble
    (seq (gen 'ARGS (length args))
         (comp-begin body (cons args env))
         (gen 'RETURN)))))

<cl> (comp-show '(if a b c))
   0: ARGS    0       
   1: GVAR    A       
   2: FJUMP   5       
   3: GVAR    B       
   4: JUMP    6       
   5: GVAR    C       
   6: RETURN  
NIL
<cl> (scheme-compile '(if a b c))

#S(FN :CODE #((ARGS 0)
              (GVAR A)
              (FJUMP 5)
              (GVAR B)
              (JUMP 6)
              (GVAR C)
              (RETURN))
   :ENV NIL :NAME NIL :ARGS NIL)

<cl> (comp-show '(and a b c))
   0: ARGS    0       
   1: GVAR    A       
   2: FJUMP   9       
   3: GVAR    B       
   4: FJUMP   7       
   5: GVAR    C       
   6: JUMP    8       
   7: GVAR    NIL     
   8: JUMP    10      
   9: GVAR    NIL     
  10: RETURN  

<cl> (scheme-compile '(and a b c))

#S(FN
   :CODE
   #((ARGS 0)
     (GVAR A)
     (FJUMP 9)
     (GVAR B)
     (FJUMP 7)
     (GVAR C)
     (JUMP 8)
     (GVAR NIL)
     (JUMP 10)
     (GVAR NIL)
     (RETURN))
   :ENV NIL :NAME NIL :ARGS NIL)

<cl> (comp-show '(if (and a b) c))
   0: ARGS    0       
   1: GVAR    A       
   2: FJUMP   5       
   3: GVAR    B       
   4: JUMP    6       
   5: GVAR    NIL     
   6: FJUMP   9       
   7: GVAR    C       
   8: JUMP    10      
   9: GVAR    NIL     
  10: RETURN  

[28]> (scheme-compile '(if (and a b) c))

#S(FN
   :CODE
   #((ARGS 0)
     (GVAR A)
     (FJUMP 5)
     (GVAR B)
     (JUMP 6)
     (GVAR NIL)
     (FJUMP 9)
     (GVAR C)
     (JUMP 10)
     (GVAR NIL)
     (RETURN))
   :ENV NIL :NAME NIL :ARGS NIL)


<cl> (comp-show '(lambda (a)))
   0: ARGS  0     
   1: FN    
         0: ARGS  1     
         1: CONST NIL   
         2: RETURN
   2: RETURN

<cl> (scheme-compile '(lambda (a)))

#S(FN :CODE
      #((ARGS 0)
        (FN
         #S(FN :CODE #((ARGS 1)
                       (CONST NIL)
                       (RETURN))
               :ENV (NIL)
               :NAME NIL :ARGS (A)))
        (RETURN))
      :ENV NIL :NAME NIL :ARGS NIL)

<cl> (comp-show '(lambda (x) (if x b c)))
   0: ARGS  0     
   1: FN    
         0: ARGS  1     
         1: LVAR  0     0     ;     X     
         2: FJUMP 5     
         3: GVAR  B     
         4: JUMP  6     
         5: GVAR  C     
         6: RETURN
   2: RETURN

<cl> (scheme-compile
         '(lambda (x) (if x b c)))

#S(FN :CODE
      #((ARGS 0)
        (FN
         #S(FN :CODE
               #((ARGS 1)
                 (LVAR 0 0 ";" X)
                 (FJUMP 5)
                 (GVAR B)
                 (JUMP 6)
                 (GVAR C) (RETURN))
               :ENV (NIL)
               :NAME NIL :ARGS (X)))
        (RETURN))
      :ENV NIL :NAME NIL :ARGS NIL)

<cl> (comp-show
     '((lambda (x)
         (if
            ((lambda (y z) (if x y z)) 3 x))
          x)
        4))

   0: ARGS  0     
   1: CONST 4     
   2: FN    
         0: ARGS  1     
         1: CONST 3     
         2: LVAR  0     0     ;     X     
         3: FN    
               0: ARGS  2     
               1: LVAR  1     0     ;     X     
               2: FJUMP 5     
               3: LVAR  0     0     ;     Y     
               4: JUMP  6     
               5: LVAR  0     1     ;     Z     
               6: RETURN
         4: CALL  2     
         5: FJUMP 8     
         6: GVAR  NIL   
         7: JUMP  9     
         8: GVAR  NIL   
         9: POP   
        10: LVAR  0     0     ;     X     
        11: RETURN
   3: CALL  1     
   4: RETURN
NIL

<cl> (scheme-compile
     '((lambda (x)
         (if
            ((lambda (y z) (if x y z))
             3 x))
          x)
        4))

#S(FN
   :CODE
   #((ARGS 0) (CONST 4)
     (FN
      #S(FN
         :CODE
         #((ARGS 1)
           (CONST 3)
           (LVAR 0 0 ";" X)
           (FN
            #S(FN
               :CODE
               #((ARGS 2)
                 (LVAR 1 0 ";" X)
                 (FJUMP 5)
                 (LVAR 0 0 ";" Y)
                 (JUMP 6)
                 (LVAR 0 1 ";" Z)
                 (RETURN))
               :ENV ((X) NIL)
               :NAME NIL
               :ARGS (Y Z)))
           (CALL 2)
           (FJUMP 8)
           (GVAR NIL)
           (JUMP 9)
           (GVAR NIL)
           (POP)
           (LVAR 0 0 ";" X)
           (RETURN))
         :ENV (NIL)
         :NAME NIL
         :ARGS (X)))
     (CALL 1) (RETURN))
   :ENV NIL :NAME NIL :ARGS NIL)


generated through LaTeX2HTML. M.Inaba 平成18年5月6日