| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Sun, 29 Oct 2023 00:06:30 +0100 | |
| changeset 946 | 2d579af2bb98 | 
| parent 940 | 1c1fbf45a03c | 
| child 957 | 03c5a8987141 | 
| permissions | -rw-r--r-- | 
| 208 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 1 | \documentclass{article}
 | 
| 292 
7ed2a25dd115
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
208diff
changeset | 2 | \usepackage{../style}
 | 
| 
7ed2a25dd115
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
208diff
changeset | 3 | \usepackage{../graphics}
 | 
| 459 | 4 | \usepackage{../langs}
 | 
| 906 | 5 | \usepackage{../grammar}
 | 
| 208 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | |
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | \begin{document}
 | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 8 | |
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 9 | \section*{Homework 9}
 | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 10 | |
| 916 | 11 | %\HEADER | 
| 359 
db106e5b7c4d
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
314diff
changeset | 12 | |
| 208 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 13 | \begin{enumerate}
 | 
| 292 
7ed2a25dd115
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
208diff
changeset | 14 | \item Describe what is meant by \emph{eliminating tail
 | 
| 459 | 15 | recursion}? When can this optimization be applied and | 
| 16 | why is it of benefit? | |
| 17 | ||
| 18 | \item A programming language has arithmetic expression. For an | |
| 19 | arithmetic expression the compiler of this language produces the | |
| 20 | following snippet of JVM code. | |
| 21 | ||
| 22 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | |
| 23 | ldc 1 | |
| 24 | ldc 2 | |
| 25 | ldc 3 | |
| 26 | imul | |
| 27 | ldc 4 | |
| 28 | ldc 3 | |
| 29 | isub | |
| 30 | iadd | |
| 31 | iadd | |
| 32 | \end{lstlisting}
 | |
| 33 | ||
| 34 | Give the arithmetic expression that produced this code. Make sure | |
| 35 | you give all necessary parentheses. | |
| 36 | ||
| 647 | 37 | \item Describe what the following JVM instructions do! | 
| 459 | 38 | |
| 647 | 39 | |
| 40 | \begin{lstlisting}[language=JVMIS2,numbers=none]
 | |
| 41 | ldc 3 | |
| 459 | 42 | iload 3 | 
| 43 | istore 1 | |
| 525 | 44 | ifeq label | 
| 647 | 45 | if_icmpge label | 
| 459 | 46 | \end{lstlisting}
 | 
| 47 | ||
| 901 | 48 | \item What does the following JVM function calculate? | 
| 49 | ||
| 50 | \begin{lstlisting}[language=JVMIS2,numbers=none]    
 | |
| 51 | .method public static bar(I)I | |
| 52 | .limit locals 1 | |
| 53 | .limit stack 9 | |
| 54 | iload 0 | |
| 55 | ldc 0 | |
| 56 | if_icmpne If_else_8 | |
| 57 | ldc 0 | |
| 58 | goto If_end_9 | |
| 59 | If_else_8: | |
| 60 | iload 0 | |
| 61 | ldc 1 | |
| 62 | if_icmpne If_else_10 | |
| 63 | ldc 1 | |
| 64 | goto If_end_11 | |
| 65 | If_else_10: | |
| 66 | iload 0 | |
| 67 | ldc 1 | |
| 68 | isub | |
| 69 | invokestatic bar(I)I | |
| 70 | iload 0 | |
| 71 | ldc 2 | |
| 72 | isub | |
| 73 | invokestatic bar(I)I | |
| 74 | iadd | |
| 75 | If_end_11: | |
| 76 | If_end_9: | |
| 77 | ireturn | |
| 78 | .end method | |
| 79 | \end{lstlisting}
 | |
| 577 | 80 | |
| 703 | 81 | \item What does the following LLVM function calculate? Give the | 
| 82 | corresponding arithmetic expression . | |
| 648 | 83 | |
| 84 | \begin{lstlisting}[language=LLVM,numbers=none]  
 | |
| 85 | define i32 @foo(i32 %a, i32 %b)  {
 | |
| 86 | %1 = mul i32 %a, %a | |
| 87 | %2 = mul i32 %a, 2 | |
| 88 | %3 = mul i32 %2, %b | |
| 89 | %4 = add i32 %1, %3 | |
| 90 | %5 = mul i32 %b, %b | |
| 91 | %6 = add i32 %5, %4 | |
| 92 | ret i32 %6 | |
| 93 | } | |
| 94 | \end{lstlisting}
 | |
| 95 | ||
| 906 | 96 | \item As an optimisation technique, a compiler might want to detect `dead code' and | 
| 97 | not generate anything for this code. Why does this optimisation technique have the | |
| 940 | 98 | potential of speeding up the run-time of a program? (Hint: On what kind of CPUs are programs | 
| 906 | 99 | run nowadays?) | 
| 100 | ||
| 101 | \item In an earlier question, we analysed the advantages of having a lexer-phase | |
| 102 | before running the parser (having a lexer is definitely a good thing to have). But you | |
| 103 | might wonder if a lexer can also be implemented by a parser and some simple | |
| 104 | grammar rules. Consider for example: | |
| 105 | ||
| 106 |   \begin{plstx}[margin=1cm]
 | |
| 107 |     : \meta{S\/} ::= (\meta{Kw\/}\mid \meta{Id\/}\mid \meta{Ws\/}) \cdot \meta{S\/} \;\mid\; \epsilon\\
 | |
| 108 |     : \meta{Kw\/} ::= \texttt{if} \mid \texttt{then} \mid \ldots\\
 | |
| 109 |     : \meta{Id\/} ::= (\texttt{a} \mid\ldots\mid \texttt{z}) \cdot \meta{Id\/} \;\mid\; \epsilon\\
 | |
| 110 |     : \meta{Ws\/} ::= \ldots\\
 | |
| 111 |   \end{plstx}
 | |
| 112 | ||
| 113 | What is wrong with implementing a lexer in this way? | |
| 114 | ||
| 705 | 115 | \item What is the difference between a parse tree and an abstract | 
| 116 | syntax tree? Give some simple examples for each of them. | |
| 648 | 117 | |
| 940 | 118 | \item What are the two main features of code in | 
| 119 | static single assignment form (SSA)? | |
| 577 | 120 | |
| 940 | 121 |   \solution{
 | 
| 122 | Variables are only assigned once and all operations are | |
| 123 | primitive (in the sense of simple arithmetic operations, | |
| 124 | function calls and so on). | |
| 125 | } | |
| 126 | ||
| 127 | ||
| 128 | %\item Give a description of how the Brzozowski matcher works. | |
| 129 | % The description should be coherent and logical. | |
| 130 | ||
| 131 | %\item Give a description of how a compiler for the While-language can | |
| 132 | % be implemented. You should assume you are producing code for the JVM. | |
| 133 | % The description should be coherent and logical. | |
| 805 | 134 | |
| 135 | ||
| 459 | 136 | \item \POSTSCRIPT | 
| 208 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 137 | |
| 314 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 138 | % \item It is true (I confirmed it) that | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 139 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 140 | %  \begin{center} if $\varnothing$ does not occur in $r$
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 141 | %  \;\;then\;\;$L(r) \not= \{\}$ 
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 142 | %  \end{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 143 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 144 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 145 | % holds, or equivalently | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 146 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 147 | %  \begin{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 148 | %  $L(r) = \{\}$ \;\;implies\;\; $\varnothing$ occurs in $r$.
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 149 | %  \end{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 150 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 151 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 152 | % You can prove either version by induction on $r$. The best way to | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 153 | % make more formal what is meant by `$\varnothing$ occurs in $r$', you can define | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 154 | % the following function: | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 155 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 156 | %  \begin{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 157 | %  \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 158 | % $occurs(\varnothing)$ & $\dn$ & $true$\\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 159 | % $occurs(\epsilon)$ & $\dn$ & $f\!alse$\\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 160 | % $occurs (c)$ & $\dn$ & $f\!alse$\\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 161 | % $occurs (r_1 + r_2)$ & $\dn$ & $occurs(r_1) \vee occurs(r_2)$\\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 162 | % $occurs (r_1 \cdot r_2)$ & $\dn$ & $occurs(r_1) \vee occurs(r_2)$\\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 163 | % $occurs (r^*)$ & $\dn$ & $occurs(r)$ \\ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 164 | %  \end{tabular}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 165 | %  \end{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 166 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 167 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 168 | % Now you can prove | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 169 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 170 | %  \begin{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 171 | %  $L(r) = \{\}$ \;\;implies\;\; $occurs(r)$.
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 172 | %  \end{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 173 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 174 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 175 | % The interesting cases are $r_1 + r_2$ and $r^*$. | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 176 | %  The other direction is not true, that is if $occurs(r)$ then $L(r) = \{\}$. A counter example
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 177 | % is $\varnothing + a$: although $\varnothing$ occurs in this regular expression, the corresponding | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 178 | % language is not empty. The obvious extension to include the not-regular expression, $\sim r$, | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 179 | % also leads to an incorrect statement. Suppose we add the clause | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 180 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 181 | %  \begin{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 182 | %  \begin{tabular}{@ {}l@ {\hspace{2mm}}c@ {\hspace{2mm}}l@ {}}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 183 | % $occurs(\sim r)$ & $\dn$ & $occurs(r)$ | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 184 | %  \end{tabular}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 185 | %  \end{center}  
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 186 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 187 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 188 | % to the definition above, then it will not be true that | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 189 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 190 | %  \begin{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 191 | %  $L(r) = \{\}$ \;\;implies\;\; $occurs(r)$.
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 192 | %  \end{center}
 | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 193 | % | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 194 | % \noindent | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 195 | % Assume the alphabet contains just $a$ and $b$, find a counter example to this | 
| 
7dd5797a5ffa
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
292diff
changeset | 196 | % property. | 
| 208 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 197 | |
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 198 | \end{enumerate}
 | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 199 | |
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 200 | \end{document}
 | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 201 | |
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 202 | %%% Local Variables: | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 203 | %%% mode: latex | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 204 | %%% TeX-master: t | 
| 
bd5a8a6b3871
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 205 | %%% End: |