doc-src/Exercises/2003/a6/generated/a6.tex
author wenzelm
Sat, 29 May 2004 15:05:25 +0200
changeset 14830 faa4865ba1ce
parent 14526 51dc6c7b1fd7
permissions -rw-r--r--
removed norm_typ; improved output; refer to Pretty.pp;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14526
mehta
parents:
diff changeset
     1
%
mehta
parents:
diff changeset
     2
\begin{isabellebody}%
mehta
parents:
diff changeset
     3
\def\isabellecontext{a{\isadigit{6}}}%
mehta
parents:
diff changeset
     4
\isamarkupfalse%
mehta
parents:
diff changeset
     5
%
mehta
parents:
diff changeset
     6
\isamarkupsubsection{Optimising Compiler Verification%
mehta
parents:
diff changeset
     7
}
mehta
parents:
diff changeset
     8
\isamarkuptrue%
mehta
parents:
diff changeset
     9
%
mehta
parents:
diff changeset
    10
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    11
Section 3.3 of the Isabelle tutorial describes an expression compiler for a stack machine. In this exercise we will build and verify an optimising expression compiler for a register machine.%
mehta
parents:
diff changeset
    12
\end{isamarkuptext}%
mehta
parents:
diff changeset
    13
\isamarkuptrue%
mehta
parents:
diff changeset
    14
%
mehta
parents:
diff changeset
    15
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    16
\subsubsection*{The Source Language: Expressions}%
mehta
parents:
diff changeset
    17
\end{isamarkuptext}%
mehta
parents:
diff changeset
    18
\isamarkuptrue%
mehta
parents:
diff changeset
    19
%
mehta
parents:
diff changeset
    20
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    21
The arithmetic expressions we will work with consist of variables, constants, and an arbitrary binary operator \isa{oper}.%
mehta
parents:
diff changeset
    22
\end{isamarkuptext}%
mehta
parents:
diff changeset
    23
\isamarkuptrue%
mehta
parents:
diff changeset
    24
\isacommand{consts}\ oper\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequote}\isanewline
mehta
parents:
diff changeset
    25
\isanewline
mehta
parents:
diff changeset
    26
\isamarkupfalse%
mehta
parents:
diff changeset
    27
\isacommand{types}\ var\ {\isacharequal}\ string\isanewline
mehta
parents:
diff changeset
    28
\isanewline
mehta
parents:
diff changeset
    29
\isamarkupfalse%
mehta
parents:
diff changeset
    30
\isacommand{datatype}\ exp\ {\isacharequal}\ \isanewline
mehta
parents:
diff changeset
    31
\ \ \ \ Const\ nat\ \isanewline
mehta
parents:
diff changeset
    32
\ \ {\isacharbar}\ Var\ var\isanewline
mehta
parents:
diff changeset
    33
\ \ {\isacharbar}\ Op\ exp\ exp\isamarkupfalse%
mehta
parents:
diff changeset
    34
%
mehta
parents:
diff changeset
    35
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    36
The state in which an expression is evaluated is modelled by an {\em environment} function that maps variables to constants.%
mehta
parents:
diff changeset
    37
\end{isamarkuptext}%
mehta
parents:
diff changeset
    38
\isamarkuptrue%
mehta
parents:
diff changeset
    39
\isacommand{types}\ env\ {\isacharequal}\ {\isachardoublequote}var\ {\isasymRightarrow}\ nat{\isachardoublequote}\isamarkupfalse%
mehta
parents:
diff changeset
    40
%
mehta
parents:
diff changeset
    41
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    42
Define a function \isa{value} that evaluates an expression in a given environment.%
mehta
parents:
diff changeset
    43
\end{isamarkuptext}%
mehta
parents:
diff changeset
    44
\isamarkuptrue%
mehta
parents:
diff changeset
    45
\isacommand{consts}\ value\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}exp\ {\isasymRightarrow}\ env\ {\isasymRightarrow}\ nat{\isachardoublequote}\isamarkupfalse%
mehta
parents:
diff changeset
    46
%
mehta
parents:
diff changeset
    47
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    48
\subsubsection*{The Register Machine}%
mehta
parents:
diff changeset
    49
\end{isamarkuptext}%
mehta
parents:
diff changeset
    50
\isamarkuptrue%
mehta
parents:
diff changeset
    51
%
mehta
parents:
diff changeset
    52
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    53
As the name suggests, a register machine uses a collection of registers to store intermediate results. There exists a special register, called the accumulator, that serves as an implicit argument to each instruction. The rest of the registers make up the register file, and can be randomly accessed using an index.%
mehta
parents:
diff changeset
    54
\end{isamarkuptext}%
mehta
parents:
diff changeset
    55
\isamarkuptrue%
mehta
parents:
diff changeset
    56
\isacommand{types}\ regIndex\ {\isacharequal}\ nat\isanewline
mehta
parents:
diff changeset
    57
\isanewline
mehta
parents:
diff changeset
    58
\isamarkupfalse%
mehta
parents:
diff changeset
    59
\isacommand{datatype}\ cell\ {\isacharequal}\ \isanewline
mehta
parents:
diff changeset
    60
\ \ \ \ Acc\isanewline
mehta
parents:
diff changeset
    61
\ \ {\isacharbar}\ Reg\ regIndex\isamarkupfalse%
mehta
parents:
diff changeset
    62
%
mehta
parents:
diff changeset
    63
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    64
The state of the register machine is denoted by a function that maps storage cells to constants.%
mehta
parents:
diff changeset
    65
\end{isamarkuptext}%
mehta
parents:
diff changeset
    66
\isamarkuptrue%
mehta
parents:
diff changeset
    67
\isacommand{types}\ state\ {\isacharequal}\ {\isachardoublequote}cell\ {\isasymRightarrow}\ nat{\isachardoublequote}\isamarkupfalse%
mehta
parents:
diff changeset
    68
%
mehta
parents:
diff changeset
    69
\begin{isamarkuptext}%
mehta
parents:
diff changeset
    70
The instruction set for the register machine is defined as follows:%
mehta
parents:
diff changeset
    71
\end{isamarkuptext}%
mehta
parents:
diff changeset
    72
\isamarkuptrue%
mehta
parents:
diff changeset
    73
\isacommand{datatype}\ instr\ {\isacharequal}\ \isanewline
mehta
parents:
diff changeset
    74
\ \ LI\ nat\ \ \ \ \ \ \ \ \isanewline
mehta
parents:
diff changeset
    75
\ \ %
mehta
parents:
diff changeset
    76
\isamarkupcmt{Load Immediate: loads a constant into the accumulator.%
mehta
parents:
diff changeset
    77
}
mehta
parents:
diff changeset
    78
\ \isanewline
mehta
parents:
diff changeset
    79
{\isacharbar}\ LOAD\ regIndex\ \isanewline
mehta
parents:
diff changeset
    80
\ \ %
mehta
parents:
diff changeset
    81
\isamarkupcmt{Loads the contents of a register into the accumulator.%
mehta
parents:
diff changeset
    82
}
mehta
parents:
diff changeset
    83
\isanewline
mehta
parents:
diff changeset
    84
{\isacharbar}\ STORE\ regIndex\ \isanewline
mehta
parents:
diff changeset
    85
\ \ %
mehta
parents:
diff changeset
    86
\isamarkupcmt{Saves the contents of the accumulator in a register.%
mehta
parents:
diff changeset
    87
}
mehta
parents:
diff changeset
    88
\ \isanewline
mehta
parents:
diff changeset
    89
{\isacharbar}\ OPER\ regIndex\ \isanewline
mehta
parents:
diff changeset
    90
\ \ %
mehta
parents:
diff changeset
    91
\isamarkupcmt{Performs the binary operation \isa{oper}.%
mehta
parents:
diff changeset
    92
}
mehta
parents:
diff changeset
    93
\isanewline
mehta
parents:
diff changeset
    94
\ \ \ \ %
mehta
parents:
diff changeset
    95
\isamarkupcmt{The first argument is taken from a register.%
mehta
parents:
diff changeset
    96
}
mehta
parents:
diff changeset
    97
\isanewline
mehta
parents:
diff changeset
    98
\ \ \ \ %
mehta
parents:
diff changeset
    99
\isamarkupcmt{The second argument is taken from the accumulator.%
mehta
parents:
diff changeset
   100
}
mehta
parents:
diff changeset
   101
\ \isanewline
mehta
parents:
diff changeset
   102
\ \ \ \ %
mehta
parents:
diff changeset
   103
\isamarkupcmt{The result of the computation is stored in the accumulator.%
mehta
parents:
diff changeset
   104
}
mehta
parents:
diff changeset
   105
\isamarkupfalse%
mehta
parents:
diff changeset
   106
%
mehta
parents:
diff changeset
   107
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   108
A program is a list of such instructions. The result of running a program is a change of state of the register machine. Define a function \isa{exec} that models this.%
mehta
parents:
diff changeset
   109
\end{isamarkuptext}%
mehta
parents:
diff changeset
   110
\isamarkuptrue%
mehta
parents:
diff changeset
   111
\isacommand{consts}\ exec\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}state\ {\isasymRightarrow}\ instr\ list\ {\isasymRightarrow}\ state{\isachardoublequote}\isamarkupfalse%
mehta
parents:
diff changeset
   112
%
mehta
parents:
diff changeset
   113
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   114
\subsubsection*{Compilation}%
mehta
parents:
diff changeset
   115
\end{isamarkuptext}%
mehta
parents:
diff changeset
   116
\isamarkuptrue%
mehta
parents:
diff changeset
   117
%
mehta
parents:
diff changeset
   118
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   119
The task now is to translate an expression into a sequence of instructions that computes it. At the end of execution, the result should be stored in the accumulator.
mehta
parents:
diff changeset
   120
mehta
parents:
diff changeset
   121
Before execution, the values of each variable need to be stored somewhere in the register file. A {\it mapping} function maps variables to positions in the register file.%
mehta
parents:
diff changeset
   122
\end{isamarkuptext}%
mehta
parents:
diff changeset
   123
\isamarkuptrue%
mehta
parents:
diff changeset
   124
\isacommand{types}\ map\ {\isacharequal}\ {\isachardoublequote}var\ {\isasymRightarrow}\ regIndex{\isachardoublequote}\isamarkupfalse%
mehta
parents:
diff changeset
   125
%
mehta
parents:
diff changeset
   126
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   127
Define a function \isa{cmp} that compiles an expression into a sequence of instructions. The evaluation should proceed in a bottom-up depth-first manner.
mehta
parents:
diff changeset
   128
mehta
parents:
diff changeset
   129
State and prove a theorem expressing the correctness of \isa{cmp}.
mehta
parents:
diff changeset
   130
mehta
parents:
diff changeset
   131
Hints:
mehta
parents:
diff changeset
   132
\begin{itemize}
mehta
parents:
diff changeset
   133
  \item The compilation function is dependent on the mapping function.
mehta
parents:
diff changeset
   134
  \item The compilation function needs some way of storing intermediate results. It should be clever enough to reuse registers it no longer needs.
mehta
parents:
diff changeset
   135
  \item It may be helpful to assume that at each recursive call, compilation is only allowed to use registers with indices greater than a given value to store intermediate results.
mehta
parents:
diff changeset
   136
\end{itemize}%
mehta
parents:
diff changeset
   137
\end{isamarkuptext}%
mehta
parents:
diff changeset
   138
\isamarkuptrue%
mehta
parents:
diff changeset
   139
%
mehta
parents:
diff changeset
   140
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   141
\subsubsection*{Compiler Optimisation: Common Subexpressions}%
mehta
parents:
diff changeset
   142
\end{isamarkuptext}%
mehta
parents:
diff changeset
   143
\isamarkuptrue%
mehta
parents:
diff changeset
   144
%
mehta
parents:
diff changeset
   145
\begin{isamarkuptext}%
mehta
parents:
diff changeset
   146
In the previous section, the compiler \isa{cmp} was allowed to evaluate a subexpression every time it occurred. In situations where arithmetic operations are costly, one may want to compute commonly occurring subexpressions only once.
mehta
parents:
diff changeset
   147
mehta
parents:
diff changeset
   148
For example, to compute \isa{{\isacharparenleft}a\ op\ b{\isacharparenright}\ op\ {\isacharparenleft}a\ op\ b{\isacharparenright}}, \isa{cmp} was allowed three calls to \isa{oper}, when only two were needed.
mehta
parents:
diff changeset
   149
mehta
parents:
diff changeset
   150
Develop an optimised compiler \isa{optCmp}, that evaluates every commonly occurring subexpression only once. Prove its correctness.%
mehta
parents:
diff changeset
   151
\end{isamarkuptext}%
mehta
parents:
diff changeset
   152
\isamarkuptrue%
mehta
parents:
diff changeset
   153
\isamarkupfalse%
mehta
parents:
diff changeset
   154
\end{isabellebody}%
mehta
parents:
diff changeset
   155
%%% Local Variables:
mehta
parents:
diff changeset
   156
%%% mode: latex
mehta
parents:
diff changeset
   157
%%% TeX-master: "root"
mehta
parents:
diff changeset
   158
%%% End: