Explorar o código

remove type from R3

Jeremy Siek %!s(int64=6) %!d(string=hai) anos
pai
achega
81d4e415b1
Modificáronse 2 ficheiros con 62 adicións e 29 borrados
  1. 14 10
      book.tex
  2. 48 19
      notes.md

+ 14 - 10
book.tex

@@ -4150,7 +4150,7 @@ $40$, to which we add the $2$, the element at index $0$ of the
     (\key{vector-ref}\;\Exp\;\Int) \\
   &\mid& (\key{vector-set!}\;\Exp\;\Int\;\Exp)\\
   &\mid& (\key{void}) \\
-  R_3 &::=& (\key{program} \;(\key{type}\;\itm{type})\; \Exp)
+  R_3 &::=& (\key{program} \; \Exp)
 \end{array}
 \]
 \end{minipage}
@@ -5254,21 +5254,20 @@ that does what its name suggests. The program then applies
 The definitional interpreter for $R_4$ is in
 Figure~\ref{fig:interp-R4}.
 
-%% change to do backpatching -Jeremy 
 \begin{figure}[tp]
 \begin{lstlisting}
-(define (interp-exp env global-env)
+(define (interp-exp env)
   (lambda (e)
-    (define recur (interp-exp env global-env))
+    (define recur (interp-exp env))
     (match e
       ...
       [`(,fun ,args ...)
-       (define fun-val (recur fun))
        (define arg-vals (map recur args))
+       (define fun-val (recur fun))
        (match fun-val
-	 [`(lambda (,xs ...) ,body)
-	  (define new-env (append (map cons xs arg-vals) global-env))
-	  ((interp-exp new-env global-env) body)]
+	 [`(lambda (,xs ...) ,body ,fun-env)
+	  (define new-env (append (map cons xs arg-vals) fun-env))
+	  ((interp-exp new-env) body)]
 	 [else (error "interp-exp, expected function, not" fun-val)])]
       [else (error 'interp-exp "unrecognized expression")]
       )))
@@ -5276,14 +5275,19 @@ Figure~\ref{fig:interp-R4}.
 (define (interp-def d)
   (match d
     [`(define (,f [,xs : ,ps] ...) : ,rt ,body)
-     (cons f `(lambda ,xs ,body))]
+     (mcons f `(lambda ,xs ,body ()))]
     ))
 
 (define (interp-R4 p)
   (match p
     [`(program ,ds ... ,body)
      (let ([top-level (map interp-def ds)])
-       ((interp-exp top-level top-level) body))]
+       (for/list ([b top-level])
+         (set-mcdr! b
+                    (match (mcdr b)
+                      [`(lambda ,xs ,body ())
+                       `(lambda ,xs ,body ,top-level)])))
+       ((interp-exp top-level) body))]
     ))
 \end{lstlisting}
 \caption{Interpreter for the $R_4$ language.}

+ 48 - 19
notes.md

@@ -11,16 +11,25 @@ Revising the architecture to better match Dybvig's P523 compiler
 
 
 R1:
+
     exp ::= x | n | (op exp*) | (let ([x exp]) exp)
     R1 ::= (program exp)
 
+uniquify
+|
+V
+
+    exp ::= x | n | (op exp*) | (let ([x exp]) exp)
+    R1 ::= (program () exp)
+
+
 remove-complex-opera*
 |
 V
 
     arg ::= x | n
     exp ::= arg | (op arg*) | (let ([x exp]) exp)
-    R2 ::= (program exp)
+    R1' ::= (program () exp)
 
 
 create-CFG (the graph is empty for this assignment)
@@ -31,7 +40,7 @@ V
     exp ::= arg | (op arg*)
     stmt ::= (assign x exp)
 	tail ::= (return exp) | (stmt . tail)
-    CFG ::= (program tail)
+    C0 ::= (program () tail)
 
 uncover-locals
 |
@@ -41,7 +50,7 @@ V
     exp ::= arg | (op arg*)
     stmt ::= (assign x exp)
 	tail ::= (return exp) | (stmt . tail)
-    CFG ::= (program (x ...) tail)
+    C0 ::= (program ((locals . x*)) tail)
     
 select-instructions
 |
@@ -49,8 +58,7 @@ V
 
     imm ::= (var x) | (deref r n) | (int n)
     instr ::= (addq imm imm) | ...
-    x86-CFG ::= (program (x ...) instr ...)
-    
+    x86-CFG ::= (program ((locals . x*)) instr ...)
 
 assign-homes
 |
@@ -58,7 +66,7 @@ V
 
     imm ::= (reg r) | (deref r n) | (int n)
     instr ::= (addq imm imm) | ...
-    x86 ::= (program stack-size instr ...)
+    x86 ::= (program ((stack-space . n)  instr ...)
     
 patch-instructions
 |
@@ -84,7 +92,7 @@ type-check
 V
 
     exp ::= x | n | #t | #f | (op exp*) | (let ([x exp]) exp) | (if exp exp exp)
-    R2 ::= (program (type type) exp)
+    R2 ::= (program ((type . type)) exp)
 
 remove-complex-opera*
 |
@@ -92,7 +100,7 @@ V
 
     arg ::= x | n | #t | #f
     exp ::= arg | (op arg*) | (let ([x exp]) exp) | (if exp exp exp)
-    R2 ::= (program (type type) exp)
+    R2 ::= (program ((type . type)) exp)
 
 create-CFG
 |
@@ -103,7 +111,7 @@ V
     tail ::= (jump label) | (if (rel-op exp*) label label) | (return exp)
 	         | (stmt . tail)
     stmt ::= (assign x exp)
-    CFG ::= (program (type type) ([label . tail] ...) tail)
+    CFG ::= (program ((type . type) (flow-graph . ([label . tail]*))) tail)
 
 optimize-jumps
 |
@@ -117,28 +125,49 @@ V
 
     arg ::= x | n | #t | #f
     exp ::= arg | (op arg*)
-    tail ::= (jump label) | (if (rel-op exp*) label label) | (return exp)
-	      | (stmt . tail)
+    tail ::= (return exp) | (stmt . tail)
+	      | (goto label) | (if (op exp*) (goto label) (goto label))
     stmt ::= (assign x exp)
-    CFG ::= (program (x*) (type type) ([label . tail] ...) tail)
+    CFG ::= (program ((locals . x*) (type . type)
+	                  (flow-graph . ([label . tail]*)))
+				     tail)
 
 select-instructions
 |
 V
 
-    tail ::= (jmp label) | (jmp-if cc label label) | (retq) | (instr . tail)
     imm ::= (var x) | (deref r n) | (int n)
-    instr ::= (addq imm imm) | ...
-    x86-CFG ::= (program (x ...) (type type) ([label . tail] ...) tail)
+    instr ::= (addq imm imm) | (jmp label) | (jmp-if cc label) | (retq)
+    x86-CFG ::= (program ((locals . x*) (type . type) 
+	                      (flow-graph . ([label . instr*]*))
+					     instr*)
 
-uncover-live, build-interference, allocate-registers
+uncover-live
+|
+V
+
+    imm ::= (var x) | (deref r n) | (int n)
+    instr ::= (addq imm imm) | (jmp label) | (jmp-if cc label) | (retq)
+	block ::= (block (lives ls*) instr*)
+    x86-CFG ::= (program ((locals . x*) (type . type)
+	                      (flow-graph . ([label . block]*))) block)
+
+build-interference
+|
+V
+
+    x86-CFG ::= (program ((locals . x*) (type . type)
+	                      (flow-graph . ([label . block]*))
+						  (conflicts . graph))
+					     block)
+
+allocate-registers
 |
 V
 
-    tail ::= (jmp label) | (jmp-if cc label label) | (retq) | (instr . tail)
     imm ::= (reg r) | (deref r n) | (int n)
-    instr ::= (addq imm imm) | ...
-    x86-CFG ::= (program (x ...) (type type) ([label . tail] ...) tail)
+    instr ::= (addq imm imm) | (jmp label) | (jmp-if cc label label) | (retq)
+    x86-CFG ::= (program (x ...) (type type) ([label . instr*]*) instr*)
     
 print-x86
 |