As an example for the bytecode compilation the following listing shows the
thermostat example given in Listing~\ref{lst:exmtask} compiled to bytecode.
The left column indicates the position in the program memory. The \CI{endif}
label is resolved to an address outside of the program space. This is not a
problem since this is included in the stopping condition of the interpreter.
When the program counter exceeds the length of the program, the task
terminates.

\begin{lstlisting}[language=Clean,caption={Thermostat bytecode},language=c]
 0-1 : BCAnalogRead (Analog A0)
 2-5 : BCPush (Int 50)
 6   : BCGre
 7-8 : BCJmpF 17                   //Jump to else
 9-11: BCPush (Bool 1)
12-13: BCDigitalWrite (Digital D0)
14-15: BCJmp 21                    //Jump to endif
16-18: BCPush (Bool 0)             //Else label
19   : BCDigitalWrite (Digital D0)
20   :                             //Endif label
\end{lstlisting}

The factorial function can be expressed as an \gls{mTask}-\gls{Task} and uses
the \CI{sds} and the \CI{return} functionality. Typically this \gls{Task} is
called with the \CI{OnInterval} scheduling strategy and will calculate the
factorial after which is will return. The following listings shows the actual
\gls{mTask} and the generated messages followed by the actual bytecode in a
readable form.

\begin{lstlisting}[language=Clean,caption={Factorial as an \gls{mTask}-\gls{Task}}]
factorial :: Int -> Main (ByteCode () Stmt)
factorial i = sds \y=i In
	namedsds \x=1 Named "result" In
	{main =
		IF (y <=. lit 1) (
			pub x :. retrn
		) (
			x =. x *. y :. y =. y -. lit 1
		)}

//Generating the actual messages with:
Start = fst $ toMessages (OnInterval 500) (factorial 5) zero

//The output will be
//[MTSds 2 (BCValue 5), MTSds 1 (BCValue 1), MTTask (OnInterval 500) ...]
\end{lstlisting}

\begin{lstlisting}[language=Clean,label={lst:actualbc},%
	caption={The resulting bytecode for the factorial function},language=C]
 0-2 : BCSdsFetch 1
 3-6 : BCPush (Int 1)
 7   : BCLeq
 8-9 : BCJmpF 16                    //Jump to else
10-12: BCSdsPublish 2 ("result")
13   : BCReturn
14-15: BCJmp 37                     //Jump to endif
16-18: BCSdsFetch 2 ("result")      //Else label
19-21: BCSdsFetch 1
22   : BCMul
23-25: BCSdsStore 2 ("result")
26-28: BCSdsFetch 1
29-32: BCPush (Int 1)
33   : BCSub
34-36: BCSdsStore 1
37   :                               //Endif label
\end{lstlisting}
