cws/main_cw05.tex
changeset 429 126d0e47ac85
parent 426 b51467741af2
child 463 0315d9983cd0
equal deleted inserted replaced
428:cdfa6a293453 429:126d0e47ac85
    13 %% change Console to scala.io.StdIn.readByte()
    13 %% change Console to scala.io.StdIn.readByte()
    14 
    14 
    15 
    15 
    16 \begin{document}
    16 \begin{document}
    17 
    17 
    18 \section*{Main Part 5 (Scala, 9 Marks)}
    18 \section*{Main Part 5 (Scala, 10 Marks)}
    19 
    19 
    20 \mbox{}\hfill\textit{``If there's one feature that makes Scala, `Scala',}\\
    20 \mbox{}\hfill\textit{``If there's one feature that makes Scala, `Scala',}\\
    21 \mbox{}\hfill\textit{ I would pick implicits.''}\smallskip\\
    21 \mbox{}\hfill\textit{ I would pick implicits.''}\smallskip\\
    22 \mbox{}\hfill\textit{ --- Martin Odersky (creator of the Scala language)}\bigskip\bigskip
    22 \mbox{}\hfill\textit{ --- Martin Odersky (creator of the Scala language)}\bigskip\bigskip
    23 
    23 
    87 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    87 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    88 \end{lstlisting}%$
    88 \end{lstlisting}%$
    89 
    89 
    90 \newpage
    90 \newpage
    91 
    91 
    92 \subsection*{Part A (5 Marks)}
    92 \subsection*{Part A (6 Marks)}
    93 
    93 
    94 Coming from Java or C++, you might think Scala is a rather esoteric
    94 Coming from Java or C++, you might think Scala is a rather esoteric
    95 programming language.  But remember, some serious companies have built
    95 programming language.  But remember, some serious companies have built
    96 their business on
    96 their business on
    97 Scala.\footnote{\url{https://en.wikipedia.org/wiki/Scala_(programming_language)\#Companies}}
    97 Scala.\footnote{\url{https://en.wikipedia.org/wiki/Scala_(programming_language)\#Companies}}
   107 its minimalistic set of instructions---just 8 instructions in total
   107 its minimalistic set of instructions---just 8 instructions in total
   108 and all of which are single characters. Despite the minimalism, this
   108 and all of which are single characters. Despite the minimalism, this
   109 language has been shown to be Turing complete\ldots{}if this doesn't
   109 language has been shown to be Turing complete\ldots{}if this doesn't
   110 ring any bell with you: it roughly means that every(!) algorithm can,
   110 ring any bell with you: it roughly means that every(!) algorithm can,
   111 in principle, be implemented in brainf***. It just takes a lot of
   111 in principle, be implemented in brainf***. It just takes a lot of
   112 determination and quite a lot of memory resources.
   112 determination and quite a lot of memory and time.
   113 
   113 
   114 Some relatively sophisticated sample programs in brainf*** are given
   114 Some relatively sophisticated sample programs in brainf*** are given
   115 in the file \texttt{bf.scala}, including a brainf*** program for the
   115 in the file \texttt{bf.scala}, including a brainf*** program for the
   116 Sierpinski triangle and the Mandelbrot set.  There seems to be even a
   116 Sierpinski triangle and the Mandelbrot set.  There seems to be even a
   117 dedicated Windows IDE for bf programs, though I am not sure whether
   117 dedicated Windows IDE for bf programs, though I am not sure whether
   389   \end{center}
   389   \end{center}
   390   \caption{The rules for how commands in the brainf*** language update the
   390   \caption{The rules for how commands in the brainf*** language update the
   391     program counter \texttt{pc},
   391     program counter \texttt{pc},
   392     the memory pointer \texttt{mp} and the memory \texttt{mem}.\label{comms}}
   392     the memory pointer \texttt{mp} and the memory \texttt{mem}.\label{comms}}
   393   \end{figure}
   393   \end{figure}
   394 \end{itemize}\bigskip  
   394 
   395 
   395 
       
   396 \item[(5)] Let us also generate some BF programs ourselves: 
       
   397   Write a function
       
   398   \texttt{generate} which takes a list of characters as input and generates
       
   399   a corresponding BF program that prints out this list of characters. One
       
   400   way to generate such a program is to consider each character in the list,
       
   401   add as many \texttt{"+"} given by the ASCII code of the character, then add the
       
   402   \texttt{"."} command for printing and add the loop \texttt{"[-]"} for ``zero-ing'' the memory
       
   403   cell; then go to the next character in the list. For example
       
   404   the list \texttt{"ABC".toString} produces (as a single string)
       
   405 
       
   406   \begin{center}
       
   407     \texttt{+++++++++++++++++++++++++++++++++++++++++++++++++++++}
       
   408     \texttt{++++++++++++.[-]+++++++++++++++++++++++++++++++++++++}
       
   409     \texttt{+++++++++++++++++++++++++++++.[-]++++++++++++++++++++}
       
   410     \texttt{+++++++++++++++++++++++++++++++++++++++++++++++.[-]}
       
   411   \end{center}\mbox{}\hfill[1 Mark]
       
   412 
       
   413 \end{itemize}\bigskip    
   396 %%\newpage
   414 %%\newpage
   397 
   415 
   398 \subsection*{Part B (4 Marks)}
   416 \subsection*{Part B (4 Marks)}
   399 
   417 
   400 I am sure you agree while it is fun to marvel at bf-programs, like the
   418 I am sure you agree while it is fun to marvel at bf-programs, like the
   403 
   421 
   404 
   422 
   405 \subsubsection*{Tasks (file bfc.scala)}
   423 \subsubsection*{Tasks (file bfc.scala)}
   406 
   424 
   407 \begin{itemize}
   425 \begin{itemize}
   408 \item[(5)] Compilers, in general, attempt to make programs run
   426 \item[(6)] Compilers, in general, attempt to make programs run
   409   faster by precomputing as much information as possible
   427   faster by precomputing as much information as possible
   410   before running the program. In our case we can precompute the
   428   before running the program. In our case we can precompute the
   411   addresses where we need to jump at the beginning and end of
   429   addresses where we need to jump at the beginning and end of
   412   loops. 
   430   loops. 
   413 
   431 
   446   and \texttt{jumpRight} was called previously, you should look
   464   and \texttt{jumpRight} was called previously, you should look
   447   up the jump address in the \texttt{jtable}. Feel free to reuse
   465   up the jump address in the \texttt{jtable}. Feel free to reuse
   448   the function \texttt{jumpLeft} and \texttt{jumpRight} for
   466   the function \texttt{jumpLeft} and \texttt{jumpRight} for
   449   calculating the \texttt{jtable}.\hfill{[1 Mark]}
   467   calculating the \texttt{jtable}.\hfill{[1 Mark]}
   450 
   468 
   451 \item[(6)] Compilers try to eliminate any ``dead'' code that could
   469 \item[(7)] Compilers try to eliminate any ``dead'' code that could
   452   slow down programs and also perform what is often called
   470   slow down programs and also perform what is often called
   453   \emph{peephole
   471   \emph{peephole
   454     optimisations}.\footnote{\url{https://en.wikipedia.org/wiki/Peephole_optimization}}
   472     optimisations}.\footnote{\url{https://en.wikipedia.org/wiki/Peephole_optimization}}
   455   For the latter consider that it is difficult for compilers to
   473   For the latter consider that it is difficult for compilers to
   456   comprehend what is intended with whole programs, but they are very good
   474   comprehend what is intended with whole programs, but they are very good
   474   not a bf-command. Similarly, the
   492   not a bf-command. Similarly, the
   475   regular expression \pcode{"""\\[-\\]"""} finds all occurrences of \pcode{[-]}.  By using the Scala method \pcode{.replaceAll} you can replace substrings
   493   regular expression \pcode{"""\\[-\\]"""} finds all occurrences of \pcode{[-]}.  By using the Scala method \pcode{.replaceAll} you can replace substrings
   476   with new strings.\\
   494   with new strings.\\
   477   \mbox{}\hfill{[1 Mark]}
   495   \mbox{}\hfill{[1 Mark]}
   478 
   496 
   479 \item[(7)] Finally, real compilers try to take advantage of modern
   497 \item[(8)] Finally, real compilers try to take advantage of modern
   480   CPUs which often provide complex operations in hardware that can
   498   CPUs which often provide complex operations in hardware that can
   481   combine many smaller instructions into a single faster instruction.
   499   combine many smaller instructions into a single faster instruction.
   482 
   500 
   483   In our case we can optimise the several single increments performed at a
   501   In our case we can optimise the several single increments performed at a
   484   memory cell, for example \pcode{++++}, by a single ``increment by
   502   memory cell, for example \pcode{++++}, by a single ``increment by