hws/hw08.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Sun, 14 Sep 2025 12:59:23 +0100
changeset 983 d94532448ec8
parent 956 ae365699ef48
child 1009 7fd1997bd14c
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     1
\documentclass{article}
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
     2
\usepackage{../style}
876
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
     3
\usepackage{../langs}
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
     4
\usepackage{../graphics}
59
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     5
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     6
\begin{document}
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
75
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 60
diff changeset
     8
\section*{Homework 8}
59
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
916
2ab96407f350 texupdate
Christian Urban <christian.urban@kcl.ac.uk>
parents: 901
diff changeset
    10
%%\HEADER
359
db106e5b7c4d updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 292
diff changeset
    11
59
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    12
\begin{enumerate}
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
    13
\item Write a program in the WHILE-language that calculates
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    14
  the factorial function.
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    15
956
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    16
%\begin{lstlisting}
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    17
%write "factorial: ";
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    18
%read n;
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    19
%minus1 := 1;
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    20
%while n > 0 do {
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    21
%minus1 := minus1 * n;
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    22
%n := n - 1
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    23
%};
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    24
%write "Result: ";
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    25
%write minus1 ;
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    26
%write "\n"
ae365699ef48 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 955
diff changeset
    27
%\end{lstlisting}
77
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 76
diff changeset
    28
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
    29
\item What optimisations could a compiler perform when
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    30
  compiling a WHILE-program?
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    31
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    32
  \solution{
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    33
    \begin{itemize}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    34
    \item peephole optimisations (more specific instructions)
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    35
    \item common sub-expression elimination %, for example
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    36
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    37
%\begin{lstlisting}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    38
%x := 3 + a
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    39
%y := 3 + a
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    40
%\end{lstlisting}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    41
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    42
    %can be optimised to
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    43
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    44
    %\begin{lstlisting}[numbers=none,language={}]
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    45
    %  z := 3 + a
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    46
    %  x := z
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    47
    %  y := z
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    48
    %\end{lstlisting}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    49
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    50
    \item constant folding / constant propagation (that is calculate the result of 3 + 4 already during
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    51
      compilation)
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    52
    \item tail-recursion optimisation cannot be applied to the WHILE language
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    53
      because there are no recursive functions
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    54
    \end{itemize}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    55
  }
206
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 102
diff changeset
    56
292
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
    57
\item What is the main difference between the Java assembler
7ed2a25dd115 updated
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 206
diff changeset
    58
      (as processed by Jasmin) and Java Byte Code?
206
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 102
diff changeset
    59
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    60
      \solution{ The main difference is that the j-files have symbols
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    61
        for places where to jump, while class files have this resolved
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    62
        to concrete addresses (or relative jumps). That is what the
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    63
        assembler has to generate.  }
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    64
      
940
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    65
\item Remember symbolic labels in the Jasmin-assembler are meant to
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    66
      be used for jumps (like in loops or if-conditions). Assume
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    67
      you generated a Jasmin-file with some redundant
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    68
      labels, that is some labels are not used in your code for any jumps. For
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    69
      example \texttt{L\_begin} and \texttt{L\_end} are not used
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    70
      in the following code-snippet:
940
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    71
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    72
\begin{lstlisting}[language=JVMIS,numbers=none]
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    73
L_begin:        
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    74
ldc 1
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    75
ldc 2
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    76
ldc 3
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    77
imul
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    78
ldc 4
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    79
ldc 3
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    80
isub
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    81
iadd
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    82
iadd
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    83
L_end:
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    84
\end{lstlisting}
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    85
      
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    86
      Do these redundant labels affect the size of the generated
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    87
      JVM-code? (Hint: What are the labels translated to by
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
    88
      the Jasmin-assembler?).      
940
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    89
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    90
      \solution{The answer is no. The reason is that assemblers
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    91
        calculate for labels either relative or explicit adresses,
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    92
        which are then used in the JVM-byte-code. Relative addresses
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    93
        are like ``jump 10 bytes forward'' or ``12 bytes backward''. So
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    94
      additional labels do not increase the size of the generated code.}
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    95
1c1fbf45a03c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 916
diff changeset
    96
      
876
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
    97
\item Consider the following Scala snippet. Are the two functions
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
    98
\texttt{is\_even} and \texttt{is\_odd} tail-recursive?     
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
    99
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   100
\begin{lstlisting}[numbers=none]
901
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 876
diff changeset
   101
def is_even(n: Int) : Boolean = {
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 876
diff changeset
   102
    if (n == 0) true else is_odd(n - 1)
876
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   103
}
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   104
901
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 876
diff changeset
   105
def is_odd(n: Int) : Boolean = {
876
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   106
    if (n == 0) false 
901
01b481e47887 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 876
diff changeset
   107
    else if (n == 1) true else is_even(n - 1)
876
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   108
}
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   109
\end{lstlisting}
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   110
      
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   111
Do they cause stack-overflows when compiled to the JVM (for example by Scala)?
09e4ca6d00a0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 726
diff changeset
   112
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   113
\solution{
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   114
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).
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   115
}  
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   116
530
fd3678dd1465 updated
cu
parents: 359
diff changeset
   117
fd3678dd1465 updated
cu
parents: 359
diff changeset
   118
\item Explain what is meant by the terms lazy evaluation and eager
577
1d6043a87a3e updated
Christian Urban <urbanc@in.tum.de>
parents: 530
diff changeset
   119
  evaluation.
1d6043a87a3e updated
Christian Urban <urbanc@in.tum.de>
parents: 530
diff changeset
   120
955
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   121
  \solution{ Lazy evaluation only evaluates expressions when they are
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   122
    needed and if they are needed twice, the results will be
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   123
    re-used. Eager evaluation immediately evaluates expressions, for
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   124
    example if they are arguments to function calls or allocated to
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   125
    variables.}
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   126
    
ca67172b8fa1 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 940
diff changeset
   127
577
1d6043a87a3e updated
Christian Urban <urbanc@in.tum.de>
parents: 530
diff changeset
   128
\item \POSTSCRIPT    
59
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   129
\end{enumerate}
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   130
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   131
\end{document}
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   132
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   133
%%% Local Variables: 
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   134
%%% mode: latex
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   135
%%% TeX-master: t
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
   136
%%% End: