Jeremy Siek 3 年之前
父节点
当前提交
1d996f95e9
共有 2 个文件被更改,包括 22 次插入41 次删除
  1. 21 40
      book.tex
  2. 1 1
      defs.tex

+ 21 - 40
book.tex

@@ -2615,10 +2615,11 @@ register allocation (Chapter~\ref{ch:register-allocation-Lvar}).
 \Arg &::=&  \IMM{\Int} \MID \REG{\Reg}
 \Arg &::=&  \IMM{\Int} \MID \REG{\Reg}
    \MID \DEREF{\Reg}{\Int} \\
    \MID \DEREF{\Reg}{\Int} \\
 \Instr &::=& \BININSTR{\code{addq}}{\Arg}{\Arg} 
 \Instr &::=& \BININSTR{\code{addq}}{\Arg}{\Arg} 
-       \MID \BININSTR{\code{subq}}{\Arg}{\Arg} \\
-      &\MID& \BININSTR{\code{movq}}{\Arg}{\Arg}
+       \MID \BININSTR{\code{subq}}{\Arg}{\Arg}
        \MID \UNIINSTR{\code{negq}}{\Arg}\\
        \MID \UNIINSTR{\code{negq}}{\Arg}\\
-      &\MID& \PUSHQ{\Arg} \MID \POPQ{\Arg} \\
+      &\MID& \BININSTR{\code{movq}}{\Arg}{\Arg}
+       \MID \PUSHQ{\Arg}
+       \MID \POPQ{\Arg} \\
       &\MID& \CALLQ{\itm{label}}{\itm{int}}
       &\MID& \CALLQ{\itm{label}}{\itm{int}}
        \MID \RETQ{}
        \MID \RETQ{}
        \MID \JMP{\itm{label}}  \\
        \MID \JMP{\itm{label}}  \\
@@ -2628,7 +2629,7 @@ register allocation (Chapter~\ref{ch:register-allocation-Lvar}).
 
 
 \begin{figure}[tp]
 \begin{figure}[tp]
 \fbox{
 \fbox{
-\begin{minipage}{0.98\textwidth}
+\begin{minipage}{0.94\textwidth}
 \small
 \small
 {\if\edition\racketEd    
 {\if\edition\racketEd    
 \[
 \[
@@ -7022,7 +7023,7 @@ Figure~\ref{fig:type-check-Lvar}.  The type of an integer constant is
 
 
     (define/public (operator-types)
     (define/public (operator-types)
       '((+ . ((Integer Integer) . Integer))
       '((+ . ((Integer Integer) . Integer))
-        (- . ((Integer) . Integer))
+        (- . ((Integer Integer) . Integer))
         (read . (() . Integer))))
         (read . (() . Integer))))
 
 
     (define/public (type-equal? t1 t2) (equal? t1 t2))
     (define/public (type-equal? t1 t2) (equal? t1 t2))
@@ -7132,15 +7133,13 @@ class TypeCheckLvar:
     (inherit check-type-equal?)
     (inherit check-type-equal?)
     
     
     (define/override (operator-types)
     (define/override (operator-types)
-      (append '((- . ((Integer Integer) . Integer))
-                (and . ((Boolean Boolean) . Boolean))
+      (append '((and . ((Boolean Boolean) . Boolean))
                 (or . ((Boolean Boolean) . Boolean))
                 (or . ((Boolean Boolean) . Boolean))
                 (< . ((Integer Integer) . Boolean))
                 (< . ((Integer Integer) . Boolean))
                 (<= . ((Integer Integer) . Boolean))
                 (<= . ((Integer Integer) . Boolean))
                 (> . ((Integer Integer) . Boolean))
                 (> . ((Integer Integer) . Boolean))
                 (>= . ((Integer Integer) . Boolean))
                 (>= . ((Integer Integer) . Boolean))
-                (not . ((Boolean) . Boolean))
-                )
+                (not . ((Boolean) . Boolean)))
               (super operator-types)))
               (super operator-types)))
 
 
     (define/override (type-check-exp env)
     (define/override (type-check-exp env)
@@ -7233,8 +7232,8 @@ The type of a Boolean constant is \BOOLTY{}.
 \python{Logical not requires its argument to be a \BOOLTY{} and
 \python{Logical not requires its argument to be a \BOOLTY{} and
   produces a \BOOLTY{}. Similarly for logical and and logical or. }
   produces a \BOOLTY{}. Similarly for logical and and logical or. }
 %
 %
-The equality operators require the two arguments to have the same
-type.
+The equality operator requires the two arguments to have the same type
+and therefore we handle it separately from the other operators.
 %
 %
 \python{The other comparisons (less-than, etc.) require their
 \python{The other comparisons (less-than, etc.) require their
 arguments to be of type \INTTY{} and they produce a \BOOLTY{}.}
 arguments to be of type \INTTY{} and they produce a \BOOLTY{}.}
@@ -7525,7 +7524,7 @@ $\Atm$ to x86.
 
 
   \begin{figure}[tp]
   \begin{figure}[tp]
 \fbox{
 \fbox{
-\begin{minipage}{0.98\textwidth}
+\begin{minipage}{0.96\textwidth}
 \small    
 \small    
 {\if\edition\racketEd    
 {\if\edition\racketEd    
 \[
 \[
@@ -7628,20 +7627,6 @@ By performing these translations in the front-end of the compiler,
 subsequent passes of the compiler do not need to deal with these features,
 subsequent passes of the compiler do not need to deal with these features,
 making the passes shorter.
 making the passes shorter.
 
 
-%% For example, subtraction is
-%% expressible using addition and negation.
-%% \[
-%%  \key{(-}\; e_1 \; e_2\key{)} \quad \Rightarrow \quad \LP\key{+} \; e_1 \; \LP\key{-} \; e_2\RP\RP
-%% \]
-%% Several of the comparison operations are expressible using less-than
-%% and logical negation.
-%% \[
-%% \LP\key{<=}\; e_1 \; e_2\RP \quad \Rightarrow \quad
-%% \LP\key{let}~\LP\LS\key{tmp.1}~e_1\RS\RP~\LP\key{not}\;\LP\key{<}\;e_2\;\key{tmp.1})\RP\RP
-%% \]
-%% The \key{let} is needed in the above translation to ensure that
-%% expression $e_1$ is evaluated before $e_2$.
-
 On the other hand, sometimes translations reduce the efficiency of the
 On the other hand, sometimes translations reduce the efficiency of the
 generated code by increasing the number of instructions. For example,
 generated code by increasing the number of instructions. For example,
 expressing subtraction in terms of negation
 expressing subtraction in terms of negation
@@ -7652,12 +7637,6 @@ expressing subtraction in terms of negation
 produces code with two x86 instructions (\code{negq} and \code{addq})
 produces code with two x86 instructions (\code{negq} and \code{addq})
 instead of just one (\code{subq}).
 instead of just one (\code{subq}).
 
 
-
-%% However,
-%% these differences typically do not affect the number of accesses to
-%% memory, which is the primary factor that determines execution time on
-%% modern computer architectures.
-
 \begin{exercise}\normalfont\normalsize
 \begin{exercise}\normalfont\normalsize
 %
 %
 Implement the pass \code{shrink} to remove \key{and} and \key{or} from
 Implement the pass \code{shrink} to remove \key{and} and \key{or} from
@@ -7703,7 +7682,7 @@ Run the script to test your compiler.
 \label{sec:remove-complex-opera-Lif}
 \label{sec:remove-complex-opera-Lif}
 
 
 The output language of \code{remove\_complex\_operands} is
 The output language of \code{remove\_complex\_operands} is
-\LangIfANF{} (Figure~\ref{fig:Lif-anf-syntax}), the administrative
+\LangIfANF{} (Figure~\ref{fig:Lif-anf-syntax}), the monadic
 normal form of \LangIf{}.  A Boolean constant is an atomic expressions
 normal form of \LangIf{}.  A Boolean constant is an atomic expressions
 but the \code{if} expression is not.  All three sub-expressions of an
 but the \code{if} expression is not.  All three sub-expressions of an
 \code{if} are allowed to be complex expressions but the operands of
 \code{if} are allowed to be complex expressions but the operands of
@@ -7721,13 +7700,15 @@ but the \code{if} expression is not.  All three sub-expressions of an
   form execute the statements $ss$ and then returns the result of
   form execute the statements $ss$ and then returns the result of
   expression $e$.}
   expression $e$.}
 
 
-Add cases for Boolean constants, \python{comparisons,} and \code{if}
-expressions to the \code{rco\_exp} and \code{rco\_atom} functions
-according to whether the output needs to be \Exp{} or \Atm{} as
-specified in the grammar for \LangIfANF{}.  Regarding \code{if}, it is
-particularly important to \textbf{not} replace its condition with a
-temporary variable because that would interfere with the generation of
-high-quality output in the \code{explicate\_control} pass.
+Add cases to the \code{rco\_exp} and \code{rco\_atom} functions for
+the new features in \LangIf{}. When recursively processing
+subexpressions, recall that you should invoke \code{rco\_atom} when
+the output needs to be an \Atm{} (as specified in the grammar for
+\LangIfANF{}) and invoke \code{rco\_exp} when the output should be
+\Exp{}.  Regarding \code{if}, it is particularly important to
+\textbf{not} replace its condition with a temporary variable because
+that would interfere with the generation of high-quality output in the
+upcoming \code{explicate\_control} pass.
 
 
 \newcommand{\LifMonadASTRacket}{
 \newcommand{\LifMonadASTRacket}{
 \begin{array}{rcl}
 \begin{array}{rcl}

+ 1 - 1
defs.tex

@@ -122,7 +122,7 @@
 \newcommand{\LC}{\key{\{}}
 \newcommand{\LC}{\key{\{}}
 \newcommand{\RC}{\key{\}}}
 \newcommand{\RC}{\key{\}}}
 
 
-\newcommand{\MID}{\;\;\mid\;\;}
+\newcommand{\MID}{\;\mid\;}
 
 
 \if\edition\racketEd
 \if\edition\racketEd
 \newcommand{\QUOTE}[1]{\code{'}#1}
 \newcommand{\QUOTE}[1]{\code{'}#1}