Jeremy Siek 4 anni fa
parent
commit
08c55a0255
1 ha cambiato i file con 63 aggiunte e 64 eliminazioni
  1. 63 64
      book.tex

+ 63 - 64
book.tex

@@ -1082,9 +1082,8 @@ exhibit several compilation techniques.
 \begin{minipage}{0.96\textwidth}
 \[
 \begin{array}{rcl}
-  \Exp &::=& \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp)
-        \mid \Var \\
-     &\mid& (\key{let}~([\Var~\Exp])~\Exp) \\
+  \Exp &::=& \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp)\\
+       &\mid& \Var \mid (\key{let}~([\Var~\Exp])~\Exp) \\
   R_1 &::=& \Exp
 \end{array}
 \]
@@ -1100,9 +1099,9 @@ exhibit several compilation techniques.
 \begin{minipage}{0.96\textwidth}
 \[
 \begin{array}{rcl}
-\Exp &::=& \INT{\Int} \mid \READ{} \mid \NEG{\Exp} \\
-     &\mid& \ADD{\Exp}{\Exp}  
-     \mid  \VAR{\Var} \mid \LET{\Var}{\Exp}{\Exp} \\
+\Exp &::=& \INT{\Int} \mid \READ{} \\
+     &\mid& \NEG{\Exp} \mid \ADD{\Exp}{\Exp}  \\
+     &\mid&  \VAR{\Var} \mid \LET{\Var}{\Exp}{\Exp} \\
 R_1  &::=& \PROGRAM{\code{'()}}{\Exp}
 \end{array}
 \]
@@ -3477,17 +3476,18 @@ programs to make sure that your move biasing is working properly.
 \chapter{Booleans and Control Flow}
 \label{ch:bool-types}
 
-The $R_0$ and $R_1$ languages only had a single kind of value, the
+The $R_0$ and $R_1$ languages only have a single kind of value, the
 integers. In this chapter we add a second kind of value, the Booleans,
 to create the $R_2$ language. The Boolean values \emph{true} and
 \emph{false} are written \key{\#t} and \key{\#f} respectively in
 Racket.  The $R_2$ language includes several operations that involve
 Booleans (\key{and}, \key{not}, \key{eq?}, \key{<}, etc.) and the
 conditional \key{if} expression. With the addition of \key{if}
-expressions, programs can have non-trivial control flow which has an
-impact on several parts of the compiler. Also, because we now have two
-kinds of values, we need to worry about programs that apply an
-operation to the wrong kind of value, such as \code{(not 1)}.
+expressions, programs can have non-trivial control flow which which
+significantly impacts the \code{explicate-control} and the liveness
+analysis for register allocation. Also, because we now have two kinds
+of values, we need to handle programs that apply an operation to the
+wrong kind of value, such as \code{(not 1)}.
 
 There are two language design options for such situations.  One option
 is to signal an error and the other is to provide a wider
@@ -3510,16 +3510,15 @@ we shall perform type checking during compilation. In
 Chapter~\ref{ch:type-dynamic} we study the alternative choice, that
 is, how to compile a dynamically typed language like Racket.  The
 $R_2$ language is a subset of Typed Racket but by no means includes
-all of Typed Racket. Furthermore, for many of the operations we shall
-take a narrower interpretation than Typed Racket, for example,
-rejecting \code{(not 1)}.
+all of Typed Racket. For many operations we take a narrower
+interpretation than Typed Racket, for example, rejecting \code{(not 1)}.
 
 This chapter is organized as follows.  We begin by defining the syntax
 and interpreter for the $R_2$ language (Section~\ref{sec:r2-lang}). We
 then introduce the idea of type checking and build a type checker for
 $R_2$ (Section~\ref{sec:type-check-r2}). To compile $R_2$ we need to
 enlarge the intermediate language $C_0$ into $C_1$, which we do in
-Section~\ref{sec:c1}. The remaining sections of this Chapter discuss
+Section~\ref{sec:c1}. The remaining sections of this chapter discuss
 how our compiler passes need to change to accommodate Booleans and
 conditional control flow.
 
@@ -3568,14 +3567,12 @@ comparing integers.
 \begin{array}{lcl}
   \itm{bool} &::=& \key{\#t} \mid \key{\#f} \\
   \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
-\Exp &::=& \gray{\INT{\Int} \mid \READ{} \mid \NEG{\Exp}} \\
-     &\mid& \gray{\ADD{\Exp}{\Exp}}
-      \mid \BINOP{\code{'-}}{\Exp}{\Exp} \\
-     &\mid& \gray{\VAR{\Var} \mid \LET{\Var}{\Exp}{\Exp}} \\
-     &\mid& \BOOL{\itm{bool}} 
-      \mid \AND{\Exp}{\Exp}\\
-     &\mid& \OR{\Exp}{\Exp}
-      \mid \NOT{\Exp} \\
+  \Exp &::=& \gray{ \INT{\Int} \mid \READ{} } \\
+    &\mid& \gray{ \NEG{\Exp} \mid \ADD{\Exp}{\Exp} }\\
+     &\mid& \BINOP{\code{'-}}{\Exp}{\Exp} \\
+     &\mid& \gray{ \VAR{\Var} \mid \LET{\Var}{\Exp}{\Exp} } \\
+     &\mid& \BOOL{\itm{bool}}  \mid \AND{\Exp}{\Exp}\\
+     &\mid& \OR{\Exp}{\Exp} \mid \NOT{\Exp} \\
       &\mid& \BINOP{\code{'}\itm{cmp}}{\Exp}{\Exp} \mid \IF{\Exp}{\Exp}{\Exp} \\
   R_2 &::=& \PROGRAM{\key{'()}}{\Exp}
 \end{array}
@@ -3599,11 +3596,12 @@ the expression $(\key{and}\,e_1\,e_2)$, the expression $e_2$ is not
 evaluated if $e_1$ evaluates to \code{\#f}.
 
 With the addition of the comparison operations, there are quite a few
-primitive operations and the interpreter code for them is somewhat
-repetitive. In Figure~\ref{fig:interp-R2} we factor out the different
-parts into the \code{interp-op} function and the similar parts into
-the one match clause shown in Figure~\ref{fig:interp-R2}. We do not
-use \code{interp-op} for the \code{and} operation because of the
+primitive operations and the interpreter code for them could become
+repetitive without some care. In Figure~\ref{fig:interp-R2} we factor
+out the different parts of the code for primitve operations into the
+\code{interp-op} function and the similar parts into the match clause
+for \code{Prim} shown in Figure~\ref{fig:interp-R2}. We do not use
+\code{interp-op} for the \code{and} operation because of the
 short-circuiting behavior in the order of evaluation of its arguments.
 
 
@@ -3662,10 +3660,9 @@ short-circuiting behavior in the order of evaluation of its arguments.
 \label{sec:type-check-r2}
 
 It is helpful to think about type checking in two complementary
-ways. A type checker predicts the \emph{type} of value that will be
-produced by each expression in the program.  For $R_2$, we have just
-two types, \key{Integer} and \key{Boolean}. So a type checker should
-predict that
+ways. A type checker predicts the type of value that will be produced
+by each expression in the program.  For $R_2$, we have just two types,
+\key{Integer} and \key{Boolean}. So a type checker should predict that
 \begin{lstlisting}
    (+ 10 (- (+ 12 20)))
 \end{lstlisting}
@@ -3675,12 +3672,13 @@ produces an \key{Integer} while
 \end{lstlisting}
 produces a \key{Boolean}.
 
-As mentioned at the beginning of this chapter, a type checker also
-rejects programs that apply operators to the wrong type of value. Our
-type checker for $R_2$ will signal an error for the below expression
-because, as we have seen above, the expression \code{(+ 10 ...)} has
-type \key{Integer}, and we require the argument of a \code{not} to
-have type \key{Boolean}.
+Another way to think about type checking is that it enforces a set of
+rules about which operators can be applied to which kinds of
+values. For example, our type checker for $R_2$ will signal an error
+for the below expression because, as we have seen above, the
+expression \code{(+ 10 ...)} has type \key{Integer} but the type
+checker enforces the rule that the argument of \code{not} must be a
+\key{Boolean}.
 \begin{lstlisting}
    (not (+ 10 (- (+ 12 20))))
 \end{lstlisting}
@@ -3688,21 +3686,20 @@ have type \key{Boolean}.
 The type checker for $R_2$ is best implemented as a structurally
 recursive function over the AST. Figure~\ref{fig:type-check-R2} shows
 many of the clauses for the \code{type-check-exp} function.  Given an
-input expression \code{e}, the type checker either returns the type
+input expression \code{e}, the type checker either returns a type
 (\key{Integer} or \key{Boolean}) or it signals an error.  Of course,
 the type of an integer literal is \code{Integer} and the type of a
 Boolean literal is \code{Boolean}.  To handle variables, the type
-checker, like the interpreter, uses an association list. However, in
-this case the association list maps variables to types instead of
-values. Consider the clause for \key{let}.  We type check the
+checker, like the interpreter, uses an environment that maps variables
+to types. Consider the clause for \key{let}.  We type check the
 initializing expression to obtain its type \key{T} and then associate
 type \code{T} with the variable \code{x}. When the type checker
 encounters the use of a variable, it can find its type in the
-association list.
+environment.
 
 \begin{figure}[tbp]
 \begin{lstlisting}
-(definepublic (type-check-exp env)
+(define (type-check-exp env)
   (lambda (e)
     (match e
       [(Var x) (dict-ref env x)]
@@ -3908,11 +3905,12 @@ and \key{goto}'s.
 \itm{cmp} &::= & \key{eq?} \mid \key{<}  \\
 \Exp &::= & \gray{\Atm \mid \READ{} \mid \NEG{\Atm} }\\
      &\mid& \gray{ \ADD{\Atm}{\Atm} } 
-     \mid \UNIOP{\key{not}}{\Atm} \\
-     &\mid& \BINOP{\itm{cmp}}{\Atm}{\Atm} \\
-\Stmt &::=& \gray{ \ASSIGN{\Var}{\Exp} } \\
+     \mid \UNIOP{\key{'not}}{\Atm} \\
+     &\mid& \BINOP{'\itm{cmp}}{\Atm}{\Atm} \\
+\Stmt &::=& \gray{ \ASSIGN{\VAR{\Var}}{\Exp} } \\
 \Tail &::= & \gray{\RETURN{\Exp} \mid \SEQ{\Stmt}{\Tail} } \\
-      &\mid& \GOTO{\itm{label}} \mid \IFSTMT{\key{(}\itm{cmp}\,\Atm\,\Atm\key{)}}{\GOTO{\itm{label}}}{\GOTO{\itm{label}}} \\
+    &\mid& \GOTO{\itm{label}} \\
+    &\mid& \IFSTMT{\BINOP{\itm{cmp}}{\Atm}{\Atm}}{\GOTO{\itm{label}}}{\GOTO{\itm{label}}} \\
 C_1 & ::= & \gray{\PROGRAM{\itm{info}}{\CFG{\key{(}\itm{label}\,\key{.}\,\Tail\key{)}^{+}}}}
 \end{array}
 \]
@@ -5353,29 +5351,30 @@ Figure~\ref{fig:expose-alloc-output} shows the output of the
 
 \begin{figure}[tp]
 \fbox{
-\begin{minipage}{0.96\textwidth}
+  \begin{minipage}{0.96\textwidth}
+    \small
 \[
 \begin{array}{lcl}
-\Arg &::=& \gray{ \Int \mid \Var \mid \key{\#t} \mid \key{\#f} }\\
+\Atm &::=& \gray{ \INT{\Int} \mid \VAR{\Var} \mid \BOOL{\itm{bool}} }\\
 \itm{cmp} &::= & \gray{  \key{eq?} \mid \key{<} } \\
-\Exp &::= & \gray{ \Arg \mid (\key{read}) \mid (\key{-}\;\Arg) \mid (\key{+} \; \Arg\;\Arg)
-      \mid (\key{not}\;\Arg) \mid (\itm{cmp}\;\Arg\;\Arg)  } \\
-   &\mid& (\key{allocate} \,\itm{int}\,\itm{type})
-   \mid (\key{vector-ref}\, \Arg\, \Int)  \\
-   &\mid& (\key{vector-set!}\,\Arg\,\Int\,\Arg)
-    \mid (\key{global-value} \,\itm{name}) \mid (\key{void}) \\
-\Stmt &::=& \gray{ \ASSIGN{\Var}{\Exp} \mid \RETURN{\Exp} } 
-       \mid (\key{collect} \,\itm{int}) \\
-\Tail &::= & \gray{\RETURN{\Exp} \mid (\key{seq}\;\Stmt\;\Tail)} \\
-      &\mid& \gray{(\key{goto}\,\itm{label})
-       \mid \IF{(\itm{cmp}\, \Arg\,\Arg)}{(\key{goto}\,\itm{label})}{(\key{goto}\,\itm{label})}} \\
-C_2 & ::= & (\key{program}\;\itm{info}\; ((\itm{label}\,\key{.}\,\Tail)^{+}))
+\Exp &::= & \gray{ \Atm \mid \READ{} \mid \NEG{\Atm} \mid \ADD{\Atm}{\Atm} }\\
+   &\mid& \gray{ \UNIOP{\key{not}}{\Atm} \mid \BINOP{\itm{cmp}}{\Atm}{\Atm}  } \\
+   &\mid& (\key{Allocate} \,\itm{int}\,\itm{type})
+   \mid \BINOP{\key{'vector-ref}}{\Atm}{\Int}  \\
+   &\mid& (\key{Prim}~\key{'vector-set!}\,(\key{list}\,\Atm\,\Int\,\Atm))\\
+   &\mid& (\key{GlobalValue} \,\itm{name}) \mid (\key{Void}) \\
+\Stmt &::=& \gray{ \ASSIGN{\VAR{\Var}}{\Exp} \mid \RETURN{\Exp} } 
+       \mid (\key{Collect} \,\itm{int}) \\
+\Tail &::= & \gray{ \RETURN{\Exp} \mid \SEQ{\Stmt}{\Tail} }\\
+      &\mid& \gray{ \GOTO{\itm{label}} }\\
+      &\mid& \gray{ \IFSTMT{\BINOP{\itm{cmp}}{\Atm}{\Atm}}{\GOTO{\itm{label}}}{\GOTO{\itm{label}}}  }\\
+C_2 & ::= & \PROGRAM{\itm{info}}{\CFG{(\itm{label}\,\key{.}\,\Tail)^{+}}}
 \end{array}
 \]
 \end{minipage}
 }
-\caption{The $C_2$ language, extending $C_1$
-  (Figure~\ref{fig:c1-syntax}) with vectors.}
+\caption{The abstract syntax of the $C_2$ language.
+   TODO: UPDATE}
 \label{fig:c2-syntax}
 \end{figure}