瀏覽代碼

slight improvement

Jeremy Siek 4 年之前
父節點
當前提交
bc1c7271cc
共有 1 個文件被更改,包括 25 次插入24 次删除
  1. 25 24
      book.tex

+ 25 - 24
book.tex

@@ -5135,7 +5135,7 @@ conclusion:
 \node (x86-2-1) at (3,-6)  {\large $\text{x86}^{*}_1$};
 \node (x86-2-1) at (3,-6)  {\large $\text{x86}^{*}_1$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_1$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_1$};
 
 
-\path[->,bend left=15] (R2) edge [above] node {\ttfamily\footnotesize\color{red} typecheck} (R2-2);
+\path[->,bend left=15] (R2) edge [above] node {\ttfamily\footnotesize\color{red} type-check} (R2-2);
 \path[->,bend left=15] (R2-2) edge [above] node {\ttfamily\footnotesize\color{red} shrink} (R2-3);
 \path[->,bend left=15] (R2-2) edge [above] node {\ttfamily\footnotesize\color{red} shrink} (R2-3);
 \path[->,bend left=15] (R2-3) edge [above] node {\ttfamily\footnotesize uniquify} (R2-4);
 \path[->,bend left=15] (R2-3) edge [above] node {\ttfamily\footnotesize uniquify} (R2-4);
 \path[->,bend left=15] (R2-4) edge [right] node {\ttfamily\footnotesize remove-complex.} (R2-5);
 \path[->,bend left=15] (R2-4) edge [right] node {\ttfamily\footnotesize remove-complex.} (R2-5);
@@ -5563,13 +5563,13 @@ the \code{void?} predicate that returns \code{\#t} when applied to
 \label{fig:interp-R3}
 \label{fig:interp-R3}
 \end{figure}
 \end{figure}
 
 
-Figure~\ref{fig:typecheck-R3} shows the type checker for $R_3$, which
+Figure~\ref{fig:type-check-R3} shows the type checker for $R_3$, which
 deserves some explanation. As we see in Section~\ref{sec:GC}, we
 deserves some explanation. As we see in Section~\ref{sec:GC}, we
 need to know which variables contain pointers into the heap, that is,
 need to know which variables contain pointers into the heap, that is,
 which variables contain vectors. Also, when allocating a vector, we
 which variables contain vectors. Also, when allocating a vector, we
 need to know which elements of the vector are pointers. We can obtain
 need to know which elements of the vector are pointers. We can obtain
 this information during type checking. The type checker in
 this information during type checking. The type checker in
-Figure~\ref{fig:typecheck-R3} not only computes the type of an
+Figure~\ref{fig:type-check-R3} not only computes the type of an
 expression, it also wraps every sub-expression $e$ with the form
 expression, it also wraps every sub-expression $e$ with the form
 $(\key{HasType}~e~T)$, where $T$ is $e$'s type.
 $(\key{HasType}~e~T)$, where $T$ is $e$'s type.
 Subsequently, in the \code{uncover-locals} pass
 Subsequently, in the \code{uncover-locals} pass
@@ -5578,7 +5578,7 @@ propagated to all variables (including the temporaries generated by
 \code{remove-complex-opera*}).
 \code{remove-complex-opera*}).
 
 
 To create the s-expression for the \code{Vector} type in
 To create the s-expression for the \code{Vector} type in
-Figure~\ref{fig:typecheck-R3}, we use the
+Figure~\ref{fig:type-check-R3}, we use the
 \href{https://docs.racket-lang.org/reference/quasiquote.html}{unquote-splicing
 \href{https://docs.racket-lang.org/reference/quasiquote.html}{unquote-splicing
   operator} \code{,@} to insert the list \code{t*} without its usual
   operator} \code{,@} to insert the list \code{t*} without its usual
 start and end parentheses.  \index{unquote-slicing}
 start and end parentheses.  \index{unquote-slicing}
@@ -5620,7 +5620,7 @@ start and end parentheses.  \index{unquote-slicing}
       )))
       )))
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checker for the $R_3$ language.}
 \caption{Type checker for the $R_3$ language.}
-\label{fig:typecheck-R3}
+\label{fig:type-check-R3}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -6256,22 +6256,23 @@ $\itm{arg}'$) at the same time!
 
 
 We compile the \code{allocate} form to operations on the
 We compile the \code{allocate} form to operations on the
 \code{free\_ptr}, as shown below. The address in the \code{free\_ptr}
 \code{free\_ptr}, as shown below. The address in the \code{free\_ptr}
-is the next free address in the FromSpace, so we move it into the
-\itm{lhs} and then move it forward by enough space for the tuple being
-allocated, which is $8(\itm{len}+1)$ bytes because each element is 8
-bytes (64 bits) and we use 8 bytes for the tag. Last but not least, we
-initialize the \itm{tag}. Refer to Figure~\ref{fig:tuple-rep} to see
-how the tag is organized. We recommend using the Racket operations
+is the next free address in the FromSpace, so we copy it into
+\code{r11} and then move it forward by enough space for the tuple
+being allocated, which is $8(\itm{len}+1)$ bytes because each element
+is 8 bytes (64 bits) and we use 8 bytes for the tag.  We then
+initialize the \itm{tag} and finally copy the address in \code{r11} to
+the left-hand-side. Refer to Figure~\ref{fig:tuple-rep} to see how the
+tag is organized. We recommend using the Racket operations
 \code{bitwise-ior} and \code{arithmetic-shift} to compute the tag
 \code{bitwise-ior} and \code{arithmetic-shift} to compute the tag
 during compilation.  The type annotation in the \code{vector} form is
 during compilation.  The type annotation in the \code{vector} form is
 used to determine the pointer mask region of the tag.
 used to determine the pointer mask region of the tag.
 \begin{lstlisting}
 \begin{lstlisting}
    |$\itm{lhs}$| = (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|));
    |$\itm{lhs}$| = (allocate |$\itm{len}$| (Vector |$\itm{type} \ldots$|));
    |$\Longrightarrow$|
    |$\Longrightarrow$|
-   movq free_ptr(%rip), |$\itm{lhs}'$|
+   movq free_ptr(%rip), %r11
    addq |$8(\itm{len}+1)$|, free_ptr(%rip)
    addq |$8(\itm{len}+1)$|, free_ptr(%rip)
-   movq |$\itm{lhs}'$|, %r11
    movq $|$\itm{tag}$|, 0(%r11)
    movq $|$\itm{tag}$|, 0(%r11)
+   movq %r11, |$\itm{lhs}'$|
 \end{lstlisting}
 \end{lstlisting}
 
 
 The \code{collect} form is compiled to a call to the \code{collect}
 The \code{collect} form is compiled to a call to the \code{collect}
@@ -6578,7 +6579,7 @@ conclusion:
 \node (x86-2-1) at (3,-6)  {\large $\text{x86}^{*}_2$};
 \node (x86-2-1) at (3,-6)  {\large $\text{x86}^{*}_2$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_2$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_2$};
 
 
-\path[->,bend left=15] (R3) edge [above] node {\ttfamily\footnotesize\color{red} typecheck} (R3-2);
+\path[->,bend left=15] (R3) edge [above] node {\ttfamily\footnotesize\color{red} type-check} (R3-2);
 \path[->,bend left=15] (R3-2) edge [above] node {\ttfamily\footnotesize shrink} (R3-3);
 \path[->,bend left=15] (R3-2) edge [above] node {\ttfamily\footnotesize shrink} (R3-3);
 \path[->,bend left=15] (R3-3) edge [above] node {\ttfamily\footnotesize uniquify} (R3-4);
 \path[->,bend left=15] (R3-3) edge [above] node {\ttfamily\footnotesize uniquify} (R3-4);
 \path[->,bend left=15] (R3-4) edge [right] node {\ttfamily\footnotesize\color{red} expose-alloc.} (R3-5);
 \path[->,bend left=15] (R3-4) edge [right] node {\ttfamily\footnotesize\color{red} expose-alloc.} (R3-5);
@@ -7754,7 +7755,7 @@ of your previously created test programs.
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_3$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_3$};
 
 
 \path[->,bend left=15] (R4) edge [above] node
 \path[->,bend left=15] (R4) edge [above] node
-     {\ttfamily\footnotesize\color{red} typecheck} (R4-2);
+     {\ttfamily\footnotesize\color{red} type-check} (R4-2);
 \path[->,bend left=15] (R4-2) edge [above] node
 \path[->,bend left=15] (R4-2) edge [above] node
      {\ttfamily\footnotesize uniquify} (R4-3);
      {\ttfamily\footnotesize uniquify} (R4-3);
 \path[->,bend left=15] (R4-3) edge [right] node
 \path[->,bend left=15] (R4-3) edge [right] node
@@ -8134,7 +8135,7 @@ values.
 \label{sec:type-check-r5}
 \label{sec:type-check-r5}
 \index{type checking}
 \index{type checking}
 
 
-Figure~\ref{fig:typecheck-R5} shows how to type check the new
+Figure~\ref{fig:type-check-R5} shows how to type check the new
 \key{lambda} form. The body of the \key{lambda} is checked in an
 \key{lambda} form. The body of the \key{lambda} is checked in an
 environment that includes the current environment (because it is
 environment that includes the current environment (because it is
 lexically scoped) and also includes the \key{lambda}'s parameters.  We
 lexically scoped) and also includes the \key{lambda}'s parameters.  We
@@ -8142,7 +8143,7 @@ require the body's type to match the declared return type.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}
 \begin{lstlisting}
-(define (typecheck-R5 env)
+(define (type-check-R5 env)
   (lambda (e)
   (lambda (e)
     (match e
     (match e
       [(Lambda (and bnd `([,xs : ,Ts] ...)) rT body)
       [(Lambda (and bnd `([,xs : ,Ts] ...)) rT body)
@@ -8158,7 +8159,7 @@ require the body's type to match the declared return type.
       )))
       )))
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checking the \key{lambda}'s in $R_5$.}
 \caption{Type checking the \key{lambda}'s in $R_5$.}
-\label{fig:typecheck-R5}
+\label{fig:type-check-R5}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -8338,7 +8339,7 @@ $\Downarrow$
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_3$};
 \node (x86-2-2) at (6,-6)  {\large $\text{x86}^{*}_3$};
 
 
 \path[->,bend left=15] (R4) edge [above] node
 \path[->,bend left=15] (R4) edge [above] node
-     {\ttfamily\footnotesize\color{red} typecheck} (R4-2);
+     {\ttfamily\footnotesize\color{red} type-check} (R4-2);
 \path[->,bend left=15] (R4-2) edge [above] node
 \path[->,bend left=15] (R4-2) edge [above] node
      {\ttfamily\footnotesize uniquify} (R4-3);
      {\ttfamily\footnotesize uniquify} (R4-3);
 \path[->] (R4-3) edge [right] node
 \path[->] (R4-3) edge [right] node
@@ -8641,16 +8642,16 @@ if the tag corresponds to the predicate, and return \key{\#t}
 otherwise.
 otherwise.
 %
 %
 Selections from the type checker for $R_6$ are shown in
 Selections from the type checker for $R_6$ are shown in
-Figure~\ref{fig:typecheck-R6} and the interpreter for $R_6$ is in
+Figure~\ref{fig:type-check-R6} and the interpreter for $R_6$ is in
 Figure~\ref{fig:interp-R6}.
 Figure~\ref{fig:interp-R6}.
 
 
 \begin{figure}[btp]
 \begin{figure}[btp]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 (define (flat-ty? ty) ...)
 (define (flat-ty? ty) ...)
 
 
-(define (typecheck-R6 env)
+(define (type-check-R6 env)
   (lambda (e)
   (lambda (e)
-    (define recur (typecheck-R6 env))
+    (define recur (type-check-R6 env))
     (match e
     (match e
        [`(inject ,e ,ty)
        [`(inject ,e ,ty)
         (unless (flat-ty? ty)
         (unless (flat-ty? ty)
@@ -8683,7 +8684,7 @@ Figure~\ref{fig:interp-R6}.
       )))
       )))
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checker for parts of the $R_6$ language.}
 \caption{Type checker for parts of the $R_6$ language.}
-\label{fig:typecheck-R6}
+\label{fig:type-check-R6}
 \end{figure}
 \end{figure}
 
 
 % to do: add rules for vector-ref, etc. for Vectorof
 % to do: add rules for vector-ref, etc. for Vectorof
@@ -9307,7 +9308,7 @@ registers.
 %%  LocalWords:  runtime Liveness liveness undirected Balakrishnan je
 %%  LocalWords:  runtime Liveness liveness undirected Balakrishnan je
 %%  LocalWords:  Rosen DSATUR SDO Gebremedhin Omari morekeywords cnd
 %%  LocalWords:  Rosen DSATUR SDO Gebremedhin Omari morekeywords cnd
 %%  LocalWords:  fullflexible vertices Booleans Listof Pairof thn els
 %%  LocalWords:  fullflexible vertices Booleans Listof Pairof thn els
-%%  LocalWords:  boolean typecheck notq cmpq sete movzbq jmp al xorq
+%%  LocalWords:  boolean type-check notq cmpq sete movzbq jmp al xorq
 %%  LocalWords:  EFLAGS thns elss elselabel endlabel Tuples tuples os
 %%  LocalWords:  EFLAGS thns elss elselabel endlabel Tuples tuples os
 %%  LocalWords:  tuple args lexically leaq Polymorphism msg bool nums
 %%  LocalWords:  tuple args lexically leaq Polymorphism msg bool nums
 %%  LocalWords:  macosx unix Cormen vec callee xs maxStack numParams
 %%  LocalWords:  macosx unix Cormen vec callee xs maxStack numParams