Browse Source

a little progress

Jeremy Siek 9 years ago
parent
commit
7b4cbc6e87
2 changed files with 9939 additions and 23 deletions
  1. 9856 0
      all.bib
  2. 83 23
      book.tex

File diff suppressed because it is too large
+ 9856 - 0
all.bib


+ 83 - 23
book.tex

@@ -9,6 +9,9 @@
 \usepackage{amsmath}
 \usepackage{amsmath}
 \usepackage{amsthm}
 \usepackage{amsthm}
 \usepackage{amssymb}
 \usepackage{amssymb}
+\usepackage{natbib}
+\usepackage{stmaryrd}
+\usepackage{xypic}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % 'dedication' environment: To add a dedication paragraph at the start of book %
 % 'dedication' environment: To add a dedication paragraph at the start of book %
@@ -48,12 +51,14 @@
 \newcommand{\Atom}{\itm{atom}}
 \newcommand{\Atom}{\itm{atom}}
 \newcommand{\Stmt}{\itm{stmt}}
 \newcommand{\Stmt}{\itm{stmt}}
 \newcommand{\Exp}{\itm{exp}}
 \newcommand{\Exp}{\itm{exp}}
-\newcommand{\Ins}{\itm{inst}}
+\newcommand{\Ins}{\itm{instr}}
+\newcommand{\Prog}{\itm{prog}}
 \newcommand{\Arg}{\itm{arg}}
 \newcommand{\Arg}{\itm{arg}}
 \newcommand{\Int}{\itm{int}}
 \newcommand{\Int}{\itm{int}}
 \newcommand{\Var}{\itm{var}}
 \newcommand{\Var}{\itm{var}}
 \newcommand{\Op}{\itm{op}}
 \newcommand{\Op}{\itm{op}}
 \newcommand{\key}[1]{\mathtt{#1}}
 \newcommand{\key}[1]{\mathtt{#1}}
+\newcommand{\Meaning}[1]{\llbracket#1\rrbracket}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % First page of book which contains 'stuff' like: %
 % First page of book which contains 'stuff' like: %
@@ -78,7 +83,7 @@
 % Add a dedication paragraph to dedicate your book to someone %
 % Add a dedication paragraph to dedicate your book to someone %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \begin{dedication}
 \begin{dedication}
-Dedicated to PL group at Indiana University.
+This book is dedicated to the programming languages group at Indiana University.
 \end{dedication}
 \end{dedication}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -93,8 +98,11 @@ Dedicated to PL group at Indiana University.
 %%%%%%%%%%%
 %%%%%%%%%%%
 % Preface %
 % Preface %
 %%%%%%%%%%%
 %%%%%%%%%%%
-%\chapter*{Preface}
+\chapter*{Preface}
 
 
+\cite{Sarkar:2004fk}
+\cite{Keep:2012aa}
+\cite{Ghuloum:2006bh}
 
 
 %\section*{Structure of book}
 %\section*{Structure of book}
 % You might want to add short description about each chapter in this book.
 % You might want to add short description about each chapter in this book.
@@ -111,7 +119,17 @@ Dedicated to PL group at Indiana University.
 % Give credit where credit is due. %
 % Give credit where credit is due. %
 % Say thanks!                      %
 % Say thanks!                      %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%\section*{Acknowledgements}
+\section*{Acknowledgements}
+
+Need to give thanks to 
+\begin{itemize}
+\item Kent Dybvig
+\item Daniel P. Freidman
+\item Oscar Waddell
+\item Abdulaziz Ghuloum
+\item Dipanwita Sarkar
+\end{itemize}
+
 %\mbox{}\\
 %\mbox{}\\
 %\noindent Amber Jain \\
 %\noindent Amber Jain \\
 %\noindent \url{http://amberj.devio.us/}
 %\noindent \url{http://amberj.devio.us/}
@@ -130,54 +148,93 @@ Dedicated to PL group at Indiana University.
 The $S_0$ language includes integers, operations on integers,
 The $S_0$ language includes integers, operations on integers,
 (arithmetic and input), and local variable definitions. This language
 (arithmetic and input), and local variable definitions. This language
 is rich enough to exhibit several compilation techniques but simple
 is rich enough to exhibit several compilation techniques but simple
-enough so that we can reasonably hope to implement the compilation to
-x86-64 assembly in two weeks of hard work.  The instructor solution
-for the $S_0$ compiler consists of 6 recursive functions and a few
-small helper functions that together span 256 lines of code.
+enough so that we can implement a compiler for it in two weeks of hard
+work.  To give the reader a feeling for the scale of this first
+compiler, the instructor solution for the $S_0$ compiler consists of 6
+recursive functions and a few small helper functions that together
+span 256 lines of code.
 
 
 The syntax of the $S_0$ language is defined by the following grammar.
 The syntax of the $S_0$ language is defined by the following grammar.
 \[
 \[
 \begin{array}{lcl}
 \begin{array}{lcl}
   \Op  &::=& \key{+} \mid \key{-} \mid \key{*} \mid \key{read} \\
   \Op  &::=& \key{+} \mid \key{-} \mid \key{*} \mid \key{read} \\
-  \Exp &::=& \Int \mid \Var \mid (\Op \; \Exp^{+}) \mid (\key{let}\, ([\Var \; \Exp])\, \Exp)
+  \Exp &::=& \Int \mid (\Op \; \Exp^{+}) \mid \Var \mid (\key{let}\, ([\Var \; \Exp])\, \Exp)
 \end{array}
 \end{array}
 \]
 \]
-As usual, evaluating a Scheme expression produces a value.  For $S_0$,
+The result of evaluating an expression is a value.  For $S_0$,
 integers are the only kind of values. To make it straightforward to
 integers are the only kind of values. To make it straightforward to
 map these integers onto x86 assembly, we restrict the integers to just
 map these integers onto x86 assembly, we restrict the integers to just
 those representable with 64-bits, the range $-2^{63}$ to $2^{63}$.
 those representable with 64-bits, the range $-2^{63}$ to $2^{63}$.
 
 
 The following are a some example expressions in $S_0$ and their value.
 The following are a some example expressions in $S_0$ and their value.
-\begin{align*}
-(+ \; 2 \; 3)  &\Longrightarrow 5 \\
+\begin{align}
+(+ \; 2 \; 3)  &\Longrightarrow 5 \label{p0} \\
 (+ \; 2 \; (- (- 3)))  &\Longrightarrow 5 \\
 (+ \; 2 \; (- (- 3)))  &\Longrightarrow 5 \\
 (\key{let}\,([x \; 3])\, (+ \; 2 \; x)) & \Longrightarrow 5 \\
 (\key{let}\,([x \; 3])\, (+ \; 2 \; x)) & \Longrightarrow 5 \\
-(\key{let}\,([x \; 3])\, (+ \; (\key{let}\,([x\;2])\, x) \; x)) & \Longrightarrow 5 
-\end{align*}
-Given user input of 2, the following expression evaluates to $5$.
+(\key{let}\,([x \; 3])\, (+ \; (\key{let}\,([x\;2])\, x) \; x)) & \Longrightarrow 5  \\
+(+ \; (\key{read}) \; 3)  &\Longrightarrow 5 
+  & (\text{given input } 2) \\
+(+ \; (\key{read}) \; (-\; (\key{read}))) 
+& \Longrightarrow 1 \text{ or } -1
+& (\text{given input } 3 \; 2) \label{p1}
+\end{align}
+
+As we can see, the observable behavior of an $S_0$ program is a
+relation between the sequence of inputs and the result value.  The
+behavior of the first program \eqref{p0} is to relate any sequence of
+input values to the result $5$. 
 \[
 \[
-(+ \; (\key{read}) \; 3)  \Longrightarrow 5
+  \Meaning{(+ \; 2 \; 3)} = \{ (s,5) \mid s \in \mathbb{Z}^{*} \} 
 \]
 \]
-Given user input of 2 then 3, the following expression may evaluate to
-either $1$ or $-1$ depending on the whims of the Scheme
-implementation.
+To explain this notation, we write $\Meaning{\exp}$ for the observable
+behavior of an expression.  Why do we not instead say that \eqref{p0}
+relates the empty sequence $\epsilon$ of inputs to $5$? (As in
+$\{(\epsilon,5)\}$.) It is because this program results in $5$
+regardless of what input it receives; it ignores the input.
+
+The observable behavior of program \eqref{p1} is somewhat subtle
+because Scheme does not specify an evaluation order for arguments of
+an operator such as $+$. Thus, the observable behavior for \eqref{p1}
+includes two different possible results.  In general, if $n_1$ and
+$n_2$ are the first two integers in the input sequence, then
+\eqref{p1} can result in either $n_1 + -n_2$ or $n_2 + -n_1$.
+\begin{align*}
+\Meaning{(+ \; (\key{read}) \; (-\; (\key{read})))} &= B_1 \cup B_2 \\
+ \text{where } & B_1 = \{ (n_1\cdot n_2\cdot s, n_1 + -n_2) \mid s \in \mathbb{Z}^{*} \}\\
+ \text{and }  & B_2 = \{ (n_1\cdot n_2\cdot s, n_2 + -n_1) \mid s \in \mathbb{Z}^{*} \}
+\end{align*}
+
+
+The goal for this chapter is to implement a compiler that translates
+any program $p \in S_0$ into a x86-64 assembly program $p'$ such that
+the assembly program exhibits the same behavior on Intel hardward as
+the $S_0$ program running in a Scheme implementation.
 \[
 \[
-(+ \; (\key{read}) \; (-\; (\key{read}))) 
-\Longrightarrow
-1 \text{ or } -1
+\xymatrix{
+p \in S_0  \ar[rr]^{\text{compile}} \ar[drr]_{\text{run in Scheme}\quad}   &&  p' \in \text{x86-64} \ar[d]^{\quad\text{run on Intel HW}}\\
+& & n \in \mathbb{Z}   
+}
 \]
 \]
+In the next section we introduce enough of the x86-64 assembly
+language to compile $S_0$.
 
 
 \section{x86-64 Assembly}
 \section{x86-64 Assembly}
 
 
 \[
 \[
 \begin{array}{lcl}
 \begin{array}{lcl}
+\itm{register} &::=& \key{rax} \mid \key{rbx} \mid \key{rcx}
+              \mid \key{rdx} \mid \key{rsi} \mid \key{rdi} \mid \\
+              && \key{r8} \mid \key{r9} \mid \key{r10}
+              \mid \key{r11} \mid \key{r12} \mid \key{r13}
+              \mid \key{r14} \mid \key{r15} \\
 \Arg &::=&  \Int \mid \itm{register} \mid \Int(\itm{register})\\ 
 \Arg &::=&  \Int \mid \itm{register} \mid \Int(\itm{register})\\ 
 \Ins &::=& \key{addq} \; \Arg \; \Arg \mid 
 \Ins &::=& \key{addq} \; \Arg \; \Arg \mid 
       \key{subq} \; \Arg \; \Arg \mid 
       \key{subq} \; \Arg \; \Arg \mid 
       \key{imulq} \; \Arg \; \Arg \mid 
       \key{imulq} \; \Arg \; \Arg \mid 
       \key{negq} \; \Arg \mid \\
       \key{negq} \; \Arg \mid \\
   && \key{movq} \; \Arg \; \Arg \mid 
   && \key{movq} \; \Arg \; \Arg \mid 
-      \key{callq} \; \mathit{label}
+      \key{callq} \; \mathit{label} \\
+\Prog &::= & \Ins^{*}
 \end{array}
 \end{array}
 \]
 \]
 
 
@@ -192,4 +249,7 @@ implementation.
 \]
 \]
 
 
 
 
+\bibliographystyle{plainnat}
+\bibliography{all}
+
 \end{document}
 \end{document}

Some files were not shown because too many files changed in this diff