--- a/handouts/ho07.tex Tue Nov 17 04:02:08 2015 +0000
+++ b/handouts/ho07.tex Tue Nov 17 04:38:01 2015 +0000
@@ -488,17 +488,19 @@
\end{tabular}
\end{center}
-Next we need to consider the statement \pcode{write x}, which
-can be used to write out the content of a variable. For this
+Next we need to consider the statement \pcode{write x}, which
+can be used to write out the content of a variable. For this
we need to use a Java library function. In order to avoid
-having to generate a lot of code for each
+having to generate a lot of code for each
\pcode{write}-command, we use a separate method and just call
-this method with an appropriate stack.
+this method with an argument (which needs to be placed on the
+stack). The code is as follows.
+
\begin{lstlisting}[language=JVMIS]
.method public static write(I)V
- .limit locals 5
- .limit stack 5
+ .limit locals 1
+ .limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
iload 0
invokevirtual java/io/PrintStream/println(I)V
@@ -506,6 +508,77 @@
.end method
\end{lstlisting}
+\noindent The first line marks the beginning of the method,
+called \pcode{write}. It takes a single integer argument
+indicated by the \pcode{(I)} and returns no result, indicated
+by the \pcode{V}. Since the method has only one argument, we
+only need a single local variable (Line~2) and a stack with
+two cells will be sufficient (Line 3). Line 4 instructs the
+JVM to get the value of the field \pcode{out} of the class
+\pcode{java/lang/System}. It expects the value to be of type
+\pcode{java/io/PrintStream}. A reference to this value will be
+placed on the stack. Line~5 copies the integer we want to
+print out onto the stack. In the next line we call the method
+\pcode{println} (from the class \pcode{java/io/PrintStream}).
+We want to print out an integer and do not expect anything
+back (that is why the type annotation \pcode{(I)V}). The
+\pcode{return}-instruction in the next line changes the
+control-flow back to the place from where \pcode{write} was
+called. This method needs to be part of a header that is
+included in any code we generate. The method \pcode{write} can
+be invoked with the two instructions
+
+\begin{lstlisting}[mathescape,language=JVMIS]
+iload $E(x)$
+invokestatic XXX/XXX/write(I)V
+\end{lstlisting}
+
+\noindent where we first place the variable to be printed on
+the stack and then call \pcode{write}. The \pcode{XXX} need to
+be replaced by appropriate class name (this will be explained
+shortly).
+
+
+\begin{figure}[t]
+\begin{lstlisting}[mathescape,language=JVMIS]
+.class public XXX.XXX
+.super java/lang/Object
+
+.method public <init>()V
+ aload_0
+ invokenonvirtual java/lang/Object/<init>()V
+ return
+.end method
+
+.method public static main([Ljava/lang/String;)V
+ .limit locals 200
+ .limit stack 200
+
+ $\textit{\ldots{}here comes the compiled code\ldots}$
+
+ return
+.end method
+\end{lstlisting}
+\caption{Boilerplate code needed for running generated code.\label{boiler}}
+\end{figure}
+
+
+By generating code for a While-program, we end up with a list
+of (JVM assembly) instructions. Unfortunately, there is a bit
+more boilerplate code needed before these instructions can be
+run. The code is shown in Figure~\ref{boiler}. This
+boilerplate code is very specific to the JVM. Lines 4 to 8
+contains a method for object creation in the JVM and is called
+\emph{before} the \pcode{main}-method in Lines 10 to 17.
+Interesting are the Lines 11 and 12 where we hardwire that the
+stack of our program will never be larger than 200 and that
+the maximum number of variables is also 200. This seem
+conservative default values that allow is to run some simple
+While-programs. In a real compiler, we would of course need to
+work harder and find out appropriate values for the stack and
+local variables.
+
+
\end{document}
%%% Local Variables: