| author | Christian Urban <christian.urban@kcl.ac.uk> | 
| Sat, 19 Dec 2020 00:13:58 +0000 | |
| changeset 820 | 9d5e4fa0c64d | 
| parent 752 | 1f1a293549c1 | 
| child 823 | e42a180e2e39 | 
| permissions | -rw-r--r-- | 
| 630 | 1 | % !TEX program = xelatex | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 2 | \documentclass{article}
 | 
| 309 
640e4a05cd9b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 3 | \usepackage{../style}
 | 
| 216 
f5ec7c597c5b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
214diff
changeset | 4 | \usepackage{../langs}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | \begin{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | |
| 354 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 8 | %https://github.com/Storyyeller/Krakatau | 
| 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 9 | %https://docs.oracle.com/javase/specs/jvms/se7/html/ | 
| 
86b2aeae3e98
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
333diff
changeset | 10 | |
| 706 | 11 | % Jasmin Tutorial | 
| 12 | %http://saksagan.ceng.metu.edu.tr/courses/ceng444/link/jvm-cpm.html | |
| 13 | ||
| 751 | 14 | \section*{Coursework 4}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 15 | |
| 751 | 16 | \noindent This coursework is worth 10\% and is due on \cwFOUR{}
 | 
| 719 | 17 | at 18:00. You are asked to implement a compiler for | 
| 309 
640e4a05cd9b
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
298diff
changeset | 18 | the WHILE language that targets the assembler language | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 19 | provided by Jasmin or Krakatau (both have very similar | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 20 | syntax). You can do the implementation in any programming | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 21 | language you like, but you need to submit the source code with | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 22 | which you answered the questions, otherwise a mark of 0\% will | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 23 | be awarded. You should use the lexer and parser from the | 
| 748 | 24 | previous courseworks. Please package \emph{everything}(!) in
 | 
| 25 | a zip-file that creates a directory with the name | |
| 26 | \texttt{YournameYourFamilyname} on my end.
 | |
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 27 | |
| 751 | 28 | \subsection*{Disclaimer\alert}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 29 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 30 | It should be understood that the work you submit represents | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 31 | your own effort. You have not copied from anyone else. An | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 32 | exception is the Scala code I showed during the lectures, | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 33 | which you can use. You can also use your own code from the | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 34 | CW~1, CW~2 and CW~3. | 
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 35 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 36 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 37 | \subsection*{Jasmin Assembler}
 | 
| 358 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 38 | |
| 
b3129cff41e9
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
354diff
changeset | 39 | The Jasmin assembler is available from | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 40 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 41 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 42 | \url{http://jasmin.sourceforge.net}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 43 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 44 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 45 | \noindent | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 46 | There is a user guide for Jasmin | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 47 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 48 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 49 | \url{http://jasmin.sourceforge.net/guide.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 50 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 51 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 52 | \noindent and also a description of some of the instructions | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 53 | that the JVM understands | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 54 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 55 | \begin{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 56 | \url{http://jasmin.sourceforge.net/instructions.html}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 57 | \end{center}
 | 
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 58 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 59 | \noindent If you generated a correct assembler file for | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 60 | Jasmin, for example \texttt{loops.j}, you can use
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 61 | |
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 62 | \begin{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 63 | \texttt{java -jar jasmin-2.4/jasmin.jar loops.j}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 64 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 65 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 66 | \noindent in order to translate it into Java Byte Code. The | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 67 | resulting class file can be run with | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 68 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 69 | \begin{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 70 | \texttt{java loops}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 71 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 72 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 73 | \noindent where you might need to give the correct path to the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 74 | class file. For example: | 
| 322 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 75 | |
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 76 | \begin{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 77 | \texttt{java -cp . loops/loops}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 78 | \end{center}
 | 
| 
698ed1c96cd0
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
321diff
changeset | 79 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 80 | \noindent There are also other resources about Jasmin on the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 81 | Internet, for example | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 82 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 83 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 84 | \small\url{http://www.ceng.metu.edu.tr/courses/ceng444/link/f3jasmintutorial.html}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 85 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 86 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 87 | \noindent and | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 88 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 89 | \begin{center}
 | 
| 607 | 90 |   \small\url{http://www.csc.villanova.edu/~tway/courses/csc4181/s2018/labs/lab4/JVM.pdf}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 91 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 92 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 93 | \subsection*{Krakatau Assembler}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 94 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 95 | The Krakatau assembler is available from | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 96 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 97 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 98 | \url{https://github.com/Storyyeller/Krakatau}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 99 | \end{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 100 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 101 | \noindent This assembler requires Python and a package called | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 102 | \pcode{ply} available from
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 103 | |
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 104 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 105 | \url{https://pypi.python.org/pypi/ply}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 106 | \end{center}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 107 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 108 | \noindent This assembler is largely compatible with the Jasmin | 
| 473 | 109 | syntax---that means for the files we are concerned with here, | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 110 | it understands the same input syntax (no changes to your | 
| 473 | 111 | compiler need to be made; ok maybe some small syntactic | 
| 112 | adjustments are needed). You can generate Java Byte Code by | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 113 | using | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 114 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 115 | \begin{center}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 116 | \texttt{python Krakatau-master/assemble.py loops.j}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 117 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 118 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 119 | \noindent where you may have to adapt the directory where | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 120 | Krakatau is installed (I just downloaded the zip file from | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 121 | Github and \pcode{Krakatau-master} was the directory where it
 | 
| 473 | 122 | was installed). Again the resulting class-file you can run with | 
| 123 | \texttt{java}.
 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 124 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 125 | |
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 126 | %\noindent You need to submit a document containing the answers | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 127 | %for the two questions below. You can do the implementation in | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 128 | %any programming language you like, but you need to submit the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 129 | %source code with which you answered the questions. Otherwise | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 130 | %the submission will not be counted. However, the coursework | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 131 | %will \emph{only} be judged according to the answers. You can
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 132 | %submit your answers in a txt-file or as pdf.\bigskip | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 133 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 134 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
391diff
changeset | 135 | \subsection*{Question 1}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 136 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 137 | You need to lex and parse WHILE programs, and then generate | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 138 | Java Byte Code instructions for the Jasmin assembler (or | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 139 | Krakatau assembler). As solution you need to submit the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 140 | assembler instructions for the Fibonacci and Factorial | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 141 | programs. Both should be so modified that a user can input on | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 142 | the console which Fibonacci number and which Factorial should | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 143 | be calculated. The Fibonacci program is given in | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 144 | Figure~\ref{fibs}. You can write your own program for
 | 
| 473 | 145 | calculating factorials. Submit your assembler code as | 
| 146 | a file that can be run, not as PDF-text. | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 147 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 148 | \begin{figure}[t]
 | 
| 751 | 149 | \lstinputlisting[language=while]{../progs/while-tests/fib.while}
 | 
| 320 
0c43ef11e086
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
313diff
changeset | 150 | \caption{The Fibonacci program in the WHILE language.\label{fibs}}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 151 | \end{figure}
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 152 | |
| 419 
4110ab35e5d8
updated courseworks
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
391diff
changeset | 153 | \subsection*{Question 2}
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 154 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 155 | Extend the syntax of your language so that it contains also | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 156 | \texttt{for}-loops, like
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 157 | |
| 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 158 | \begin{center}
 | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 159 | \lstset{language=While}
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 160 | \code{for} \;\textit{Id} \texttt{:=} \textit{AExp}\; \code{upto} 
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 161 | \;\textit{AExp}\; \code{do} \textit{Block} 
 | 
| 201 
c813506e0ee8
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
200diff
changeset | 162 | \end{center}
 | 
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 163 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 164 | \noindent The intended meaning is to first assign the variable | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 165 | \textit{Id} the value of the first arithmetic expression, test
 | 
| 598 | 166 | whether this value is less or equal than the value of the | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 167 | second arithmetic expression. If yes, go through the loop, and | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 168 | at the end increase the value of the loop variable by 1 and | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 169 | start again with the test. If no, leave the loop. For example | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 170 | the following instance of a \code{for}-loop is supposed to
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 171 | print out the numbers \pcode{2}, \pcode{3}, \pcode{4}.
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 172 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 173 | |
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 174 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 175 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 176 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 177 | for i := 2 upto 4 do {
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 178 | write i | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 179 | } | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 180 | \end{lstlisting}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 181 | \end{minipage}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 182 | \end{center}
 | 
| 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 183 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 184 | \noindent There are two ways how this can be implemented: one | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 185 | is to adapt the code generation part of the compiler and | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 186 | generate specific code for \code{for}-loops; the other is to
 | 
| 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 187 | translate the abstract syntax tree of \code{for}-loops into
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 188 | an abstract syntax tree using existing language constructs. | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 189 | For example the loop above could be translated to the | 
| 391 
f352cb238c32
updated meaning of for-loop
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
390diff
changeset | 190 | following \code{while}-loop:
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 191 | |
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 192 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 193 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 194 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 203 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 195 | i := 2; | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 196 | while (i <= 4) do {
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 197 | write i; | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 198 | i := i + 1; | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 199 | } | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 200 | \end{lstlisting}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 201 | \end{minipage}
 | 
| 
f1335c171d50
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
202diff
changeset | 202 | \end{center}
 | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 203 | |
| 630 | 204 | \subsection*{Question 3}
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 205 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 206 | \noindent In this question you are supposed to give the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 207 | assembler instructions for the program | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 208 | |
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 209 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 210 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 211 | \begin{lstlisting}[language=While, numbers=none]
 | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 212 | for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 213 |   for i := 1 upto 10 do {
 | 
| 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 214 | write i | 
| 205 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 215 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 216 | } | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 217 | \end{lstlisting}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 218 | \end{minipage}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 219 | \end{center}
 | 
| 
0b59588d28d2
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
204diff
changeset | 220 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 221 | \noindent | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 222 | Note that in this program the variable \pcode{i} is used
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 223 | twice. You need to make a decision how it should be compiled? | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 224 | Explain your decision and indicate what this program would | 
| 333 
8890852e18b7
updated coursework
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
328diff
changeset | 225 | print out. | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 226 | |
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 227 | \subsection*{Further Information}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 228 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 229 | The Java infrastructure unfortunately does not contain an | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 230 | assembler out-of-the-box (therefore you need to download the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 231 | additional package Jasmin or Krakatau---see above). But it | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 232 | does contain a disassembler, called \texttt{javap}. A
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 233 | dissembler does the ``opposite'' of an assembler: it generates | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 234 | readable assembler code from Java Byte Code. Have a look at | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 235 | the following example: Compile using the usual Java compiler | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 236 | the simple Hello World program below: | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 237 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 238 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 239 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 240 | \begin{lstlisting}[language=Java,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 241 | class HelloWorld {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 242 |     public static void main(String[] args) {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 243 |         System.out.println("Hello World!");
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 244 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 245 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 246 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 247 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 248 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 249 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 250 | \noindent | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 251 | You can use the command | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 252 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 253 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 254 | \begin{minipage}{12cm}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 255 | \begin{lstlisting}[language={},numbers=none]
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 256 | javap -v HelloWorld | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 257 | \end{lstlisting}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 258 | \end{minipage}
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 259 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 260 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 261 | \noindent to see the assembler instructions of the Java Byte | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 262 | Code that has been generated for this program. You can compare | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 263 | this with the code generated for the Scala version of Hello | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 264 | World. | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 265 | |
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 266 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 267 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 268 | \begin{lstlisting}[language=Scala,numbers=none]
 | 
| 204 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 269 | object HelloWorld {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 270 |    def main(args: Array[String]) {
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 271 |       println("Hello World!")
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 272 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 273 | } | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 274 | \end{lstlisting}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 275 | \end{minipage}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 276 | \end{center}
 | 
| 
fec99c437965
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
203diff
changeset | 277 | |
| 222 
b712519b41d3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
216diff
changeset | 278 | |
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 279 | \subsection*{Library Functions}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 280 | |
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 281 | You need to generate code for the commands \texttt{write} and
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 282 | \texttt{read}. This will require the addition of some
 | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 283 | ``library'' functions to your generated code. The first | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 284 | command even needs two versions, because you need to write out | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 285 | an integer and string. The Java byte code will need two | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 286 | separate functions for this. For writing out an integer, you | 
| 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 287 | can use the assembler code | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 288 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 289 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 290 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 291 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 292 | .method public static write(I)V | 
| 373 
b018234c9126
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 293 | .limit locals 1 | 
| 
b018234c9126
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 294 | .limit stack 2 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 295 | getstatic java/lang/System/out Ljava/io/PrintStream; | 
| 373 
b018234c9126
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
358diff
changeset | 296 | iload 0 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 297 | invokevirtual java/io/PrintStream/println(I)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 298 | return | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 299 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 300 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 301 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 302 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 303 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 304 | \noindent This function will invoke Java's \texttt{println}
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 305 | function for integers. Then if you need to generate code for | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 306 | \texttt{write x} where \texttt{x} is an integer variable, you
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 307 | can generate | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 308 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 309 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 310 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 311 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 312 | iload n | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 313 | invokestatic XXX/XXX/write(I)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 314 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 315 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 316 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 317 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 318 | \noindent where \texttt{n} is the index where the value of the
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 319 | variable \texttt{x} is stored. The \texttt{XXX/XXX} needs to
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 320 | be replaced with the class name which you use to generate the | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 321 | code (for example \texttt{fib/fib} in case of the Fibonacci
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 322 | numbers). | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 323 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 324 | Writing out a string is similar. The corresponding library | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 325 | function uses strings instead of integers: | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 326 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 327 | \begin{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 328 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 329 | \begin{lstlisting}[language=JVMIS, numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 330 | .method public static writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 331 | .limit stack 2 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 332 | .limit locals 1 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 333 | getstatic java/lang/System/out Ljava/io/PrintStream; | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 334 | aload 0 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 335 | invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 336 | return | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 337 | .end method | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 338 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 339 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 340 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 341 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 342 | \noindent The code that needs to be generated for \code{write
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 343 | "some_string"} commands is | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 344 | |
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 345 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 346 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 347 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 210 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 348 | ldc "some_string" | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 349 | invokestatic XXX/XXX/writes(Ljava/lang/String;)V | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 350 | \end{lstlisting}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 351 | \end{minipage}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 352 | \end{center}
 | 
| 
33175abd5474
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
205diff
changeset | 353 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 354 | \noindent Again you need to adjust the \texttt{XXX/XXX} part
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 355 | in each call. | 
| 202 
180cbfc1520a
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
201diff
changeset | 356 | |
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 357 | The code for \texttt{read} is more complicated. The reason is
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 358 | that inputting a string will need to be transformed into an | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 359 | integer. The code in Figure~\ref{read} does this. It can be
 | 
| 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 360 | called with | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 361 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 362 | \begin{center}
 | 
| 390 
a1fe591a3df3
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
373diff
changeset | 363 | \begin{minipage}{12cm}
 | 
| 313 
90ccc385c547
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
309diff
changeset | 364 | \begin{lstlisting}[language=JVMIS,numbers=none]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 365 | invokestatic XXX/XXX/read()I | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 366 | istore n | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 367 | \end{lstlisting}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 368 | \end{minipage}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 369 | \end{center}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 370 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 371 | \noindent | 
| 321 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 372 | where \texttt{n} is the index of the variable that requires an input. If you
 | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 373 | use Windows you need to take into account that a ``return'' is not just a newline, | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 374 | \code{'\\10'}, but \code{'\\13\\10'}. This means you need to change line~12 in 
 | 
| 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 375 | Figure~\ref{read} to \pcode{ldc 13}.  
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 376 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 377 | |
| 321 
c5850f8f3f5e
updated
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
320diff
changeset | 378 | \begin{figure}[t]\small
 | 
| 540 | 379 | \begin{lstlisting}[language=JVMIS,numbers=left]
 | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 380 | .method public static read()I | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 381 | .limit locals 10 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 382 | .limit stack 10 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 383 | |
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 384 | ldc 0 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 385 | istore 1 ; this will hold our final integer | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 386 | Label1: | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 387 | getstatic java/lang/System/in Ljava/io/InputStream; | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 388 | invokevirtual java/io/InputStream/read()I | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 389 | istore 2 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 390 | iload 2 | 
| 706 | 391 | ldc 10 ; the newline delimiter for Unix (Windows 13) | 
| 214 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 392 | isub | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 393 | ifeq Label2 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 394 | iload 2 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 395 | ldc 32 ; the space delimiter | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 396 | isub | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 397 | ifeq Label2 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 398 | iload 2 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 399 | ldc 48 ; we have our digit in ASCII, have to subtract it from 48 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 400 | isub | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 401 | ldc 10 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 402 | iload 1 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 403 | imul | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 404 | iadd | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 405 | istore 1 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 406 | goto Label1 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 407 | Label2: | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 408 | ;when we come here we have our integer computed in Local Variable 1 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 409 | iload 1 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 410 | ireturn | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 411 | .end method | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 412 | \end{lstlisting}\normalsize
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 413 | \caption{Assembler code for reading an integer from the console.\label{read}}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 414 | \end{figure}
 | 
| 
5be68de225e9
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: 
213diff
changeset | 415 | |
| 200 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 416 | \end{document}
 | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 417 | |
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 418 | %%% Local Variables: | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 419 | %%% mode: latex | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 420 | %%% TeX-master: t | 
| 
7415871b1ef5
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 421 | %%% End: |