73 \end{lstlisting} | 
    73 \end{lstlisting} | 
    74 \end{textblock} | 
    74 \end{textblock} | 
    75   | 
    75   | 
    76 \end{frame} | 
    76 \end{frame} | 
    77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
    77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
         | 
    78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
    79 \begin{frame}[c,fragile] | 
         | 
    80 \frametitle{\mbox{}\hspace{5cm}Factorial} | 
         | 
    81   | 
         | 
    82 \begin{textblock}{7}(0,1.0)\footnotesize | 
         | 
    83 \begin{minipage}{6cm} | 
         | 
    84 \begin{lstlisting}[language=JVMIS,basicstyle=\ttfamily, numbers=none] | 
         | 
    85 .method public static facT(II)I   | 
         | 
    86 .limit locals 2  | 
         | 
    87 .limit stack 6  | 
         | 
    88   iload 0  | 
         | 
    89   ldc 0  | 
         | 
    90   if_icmpne If_else_2  | 
         | 
    91   iload 1  | 
         | 
    92   goto If_end_3  | 
         | 
    93 If_else_2:  | 
         | 
    94   iload 0  | 
         | 
    95   ldc 1  | 
         | 
    96   isub  | 
         | 
    97   iload 0  | 
         | 
    98   iload 1  | 
         | 
    99   imul  | 
         | 
   100   invokestatic fact/fact/facT(II)I  | 
         | 
   101 If_end_3:  | 
         | 
   102   ireturn  | 
         | 
   103 .end method   | 
         | 
   104 \end{lstlisting} | 
         | 
   105 \end{minipage} | 
         | 
   106 \end{textblock} | 
         | 
   107   | 
         | 
   108 \begin{textblock}{7}(6,7) | 
         | 
   109 \begin{bubble}[7cm]\small | 
         | 
   110 \begin{lstlisting}[language=Lisp, | 
         | 
   111                    basicstyle=\ttfamily,   | 
         | 
   112                    numbers=none,  | 
         | 
   113                    xleftmargin=1mm,linebackgroundcolor=\color{cream}] | 
         | 
   114 def facT(n, acc) =   | 
         | 
   115   if n == 0 then acc   | 
         | 
   116   else facT(n - 1, n * acc);  | 
         | 
   117 \end{lstlisting} | 
         | 
   118 \end{bubble} | 
         | 
   119 \end{textblock} | 
         | 
   120   | 
         | 
   121 \end{frame} | 
         | 
   122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
         | 
   123   | 
         | 
   124 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   125 \begin{frame}[fragile] | 
         | 
   126   | 
         | 
   127 \begin{textblock}{7}(1,-0.2)\footnotesize | 
         | 
   128 \begin{minipage}{6cm} | 
         | 
   129 \begin{lstlisting}[language=JVMIS,basicstyle=\ttfamily, numbers=none, escapeinside={(*@}{@*)}] | 
         | 
   130 .method public static facT(II)I   | 
         | 
   131 .limit locals 2  | 
         | 
   132 .limit stack 6  | 
         | 
   133 (*@\hl{facT\_Start:} @*) | 
         | 
   134   iload 0  | 
         | 
   135   ldc 0  | 
         | 
   136   if_icmpne If_else_2  | 
         | 
   137   iload 1  | 
         | 
   138   goto If_end_3  | 
         | 
   139 If_else_2:  | 
         | 
   140   iload 0  | 
         | 
   141   ldc 1  | 
         | 
   142   isub  | 
         | 
   143   iload 0  | 
         | 
   144   iload 1  | 
         | 
   145   imul  | 
         | 
   146   (*@\hl{istore 1} @*) | 
         | 
   147   (*@\hl{istore 0} @*) | 
         | 
   148   (*@\hl{goto facT\_Start} @*) | 
         | 
   149 If_end_3:  | 
         | 
   150   ireturn  | 
         | 
   151 .end method   | 
         | 
   152 \end{lstlisting} | 
         | 
   153 \end{minipage} | 
         | 
   154 \end{textblock} | 
         | 
   155   | 
         | 
   156 \begin{textblock}{7}(6,7) | 
         | 
   157 \begin{bubble}[7cm]\small | 
         | 
   158 \begin{lstlisting}[language=Lisp, | 
         | 
   159                    basicstyle=\ttfamily,   | 
         | 
   160                    numbers=none,  | 
         | 
   161                    xleftmargin=1mm,linebackgroundcolor=\color{cream}] | 
         | 
   162 def facT(n, acc) =   | 
         | 
   163   if n == 0 then acc   | 
         | 
   164   else facT(n - 1, n * acc);  | 
         | 
   165 \end{lstlisting} | 
         | 
   166 \end{bubble} | 
         | 
   167 \end{textblock} | 
         | 
   168   | 
         | 
   169 \end{frame} | 
         | 
   170 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%     | 
         | 
   171   | 
         | 
   172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   173 \begin{frame}[t, fragile] | 
         | 
   174 \frametitle{Tail Recursion} | 
         | 
   175   | 
         | 
   176 A call to \texttt{f(args)} is usually compiled as\medskip | 
         | 
   177   | 
         | 
   178 {\small\begin{lstlisting}[basicstyle=\ttfamily, numbers=none] | 
         | 
   179   args onto stack  | 
         | 
   180   invokestatic  .../f   | 
         | 
   181 \end{lstlisting}}\pause | 
         | 
   182   | 
         | 
   183   | 
         | 
   184 A call is in tail position provided:\medskip  | 
         | 
   185   | 
         | 
   186 {\small\begin{itemize} | 
         | 
   187 \item \texttt{if Bexp then \hl{Exp} else \hl{Exp}} | 
         | 
   188 \item \texttt{Exp ; \hl{Exp}} | 
         | 
   189 \item \texttt{Exp  op Exp} | 
         | 
   190 \end{itemize}}\medskip | 
         | 
   191   | 
         | 
   192 then a call \texttt{f(args)} can be compiled as\medskip\small | 
         | 
   193   | 
         | 
   194 \begin{lstlisting}[numbers=none] | 
         | 
   195   prepare environment  | 
         | 
   196   jump to start of function  | 
         | 
   197 \end{lstlisting} | 
         | 
   198   | 
         | 
   199 \end{frame} | 
         | 
   200 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   | 
         | 
   201   | 
         | 
   202 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
         | 
   203 \begin{frame}[c, fragile] | 
         | 
   204 \frametitle{Tail Recursive Call} | 
         | 
   205 \footnotesize  | 
         | 
   206   | 
         | 
   207 \begin{textblock}{13}(-0.3,3) | 
         | 
   208 \begin{lstlisting}[language=Scala, numbers=none] | 
         | 
   209 def compile_expT(a: Exp, env: Mem, name: String): Instrs =   | 
         | 
   210   ...  | 
         | 
   211   case Call(n, args) => if (name == n)  | 
         | 
   212   { | 
         | 
   213     val stores =  | 
         | 
   214       args.zipWithIndex.map { case (x, y) => i"istore $y" }  | 
         | 
   215   | 
         | 
   216     args.map(a => compile_expT(a, env, "")).mkString ++  | 
         | 
   217     stores.reverse.mkString ++   | 
         | 
   218     i"goto ${n}_Start"  | 
         | 
   219   } else { | 
         | 
   220     val is = "I" * args.length  | 
         | 
   221     args.map(a => compile_expT(a, env, "")).mkString ++  | 
         | 
   222     i"invokestatic XXX/XXX/${n}(${is})I" | 
         | 
   223   }  | 
         | 
   224 \end{lstlisting} | 
         | 
   225 \end{textblock} | 
         | 
   226   | 
         | 
   227 \end{frame} | 
         | 
   228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   | 
    78   | 
   229   | 
    79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
   230 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  | 
    80 \begin{frame}[c,fragile] | 
   231 \begin{frame}[c,fragile] | 
    81 \frametitle{Factorial Funct.~on the JVM} | 
   232 \frametitle{Factorial Funct.~on the JVM} | 
    82   | 
   233   |