hws/hw08.tex
changeset 956 ae9782e62bdd
parent 941 66adcae6c762
child 957 34b3aeb65fbe
--- a/hws/hw08.tex	Fri Nov 17 20:06:43 2023 +0000
+++ b/hws/hw08.tex	Tue Nov 28 11:42:31 2023 +0000
@@ -11,20 +11,63 @@
 
 \begin{enumerate}
 \item Write a program in the WHILE-language that calculates
-      the factorial function.
+  the factorial function.
+
+\begin{lstlisting}
+write "factorial: ";
+read n;
+minus1 := 1;
+while n > 0 do {
+minus1 := minus1 * n;
+n := n - 1
+};
+write "Result: ";
+write minus1 ;
+write "\n"
+\end{lstlisting}
 
 \item What optimisations could a compiler perform when
-      compiling a WHILE-program?
+  compiling a WHILE-program?
+
+  \solution{
+    \begin{itemize}
+    \item peephole optimisations (more specific instructions)
+    \item common sub-expression elimination %, for example
+
+%\begin{lstlisting}
+%x := 3 + a
+%y := 3 + a
+%\end{lstlisting}
+
+    %can be optimised to
+
+    %\begin{lstlisting}[numbers=none,language={}]
+    %  z := 3 + a
+    %  x := z
+    %  y := z
+    %\end{lstlisting}
+
+    \item constant folding / constant propagation (that is calculate the result of 3 + 4 already during
+      compilation)
+    \item tail-recursion optimisation cannot be applied to the WHILE language
+      because there are no recursive functions
+    \end{itemize}
+  }
 
 \item What is the main difference between the Java assembler
       (as processed by Jasmin) and Java Byte Code?
 
+      \solution{ The main difference is that the j-files have symbols
+        for places where to jump, while class files have this resolved
+        to concrete addresses (or relative jumps). That is what the
+        assembler has to generate.  }
+      
 \item Remember symbolic labels in the Jasmin-assembler are meant to
       be used for jumps (like in loops or if-conditions). Assume
       you generated a Jasmin-file with some redundant
       labels, that is some labels are not used in your code for any jumps. For
       example \texttt{L\_begin} and \texttt{L\_end} are not used
-      in the fol,lowing code-snippet:
+      in the following code-snippet:
 
 \begin{lstlisting}[language=JVMIS,numbers=none]
 L_begin:        
@@ -42,7 +85,7 @@
       
       Do these redundant labels affect the size of the generated
       JVM-code? (Hint: What are the labels translated to by
-      the Jasmin-assembler?).
+      the Jasmin-assembler?).      
 
       \solution{The answer is no. The reason is that assemblers
         calculate for labels either relative or explicit adresses,
@@ -67,10 +110,21 @@
       
 Do they cause stack-overflows when compiled to the JVM (for example by Scala)?
 
+\solution{
+Scala cannot generate jumps in between different methods (to which functions are compiled to). So cannot eliminate the tail-calls. Haskell for example can do this because it compiles the code in a big ``blob'' inside a main-method (similar to the WHILE language).
+}  
+
 
 \item Explain what is meant by the terms lazy evaluation and eager
   evaluation.
 
+  \solution{ Lazy evaluation only evaluates expressions when they are
+    needed and if they are needed twice, the results will be
+    re-used. Eager evaluation immediately evaluates expressions, for
+    example if they are arguments to function calls or allocated to
+    variables.}
+    
+
 \item \POSTSCRIPT    
 \end{enumerate}