X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=results.mtask.tex;h=1b46df106c84f958e62eb7ab145d1c86f0510e5f;hb=2a4d91380ae0d2a7dfac58b8d5194d57d61af3ae;hp=2ad243a5a03089d378e917f884fb496b883988d3;hpb=e0645e1487f71512352f4fe8ace2e7a8e1e73d71;p=msc-thesis1617.git diff --git a/results.mtask.tex b/results.mtask.tex index 2ad243a..1b46df1 100644 --- a/results.mtask.tex +++ b/results.mtask.tex @@ -94,8 +94,8 @@ accordingly. , sdsval :: BCValue } :: BCState = - { freshl :: [Int] - , freshs :: [Int] + { freshl :: Int + , freshs :: Int , sdss :: [BCShare] } @@ -209,7 +209,7 @@ since the labels are resolved to real addresses later on anyways. \begin{lstlisting}[label={lst:controlflow},% caption={Bytecode view for \texttt{arith}}] -freshlabel = get >>= \st=:{freshl=[fr:frs]}->put {st & freshl=frs} >>| pure fr +freshlabel = get >>= \st=:{freshl}->put {st & freshl=freshl+1} >>| pure freshl instance If ByteCode Stmt Stmt Stmt where If b t e = BCIfStmt b t e instance If ByteCode e Stmt Stmt where If b t e = BCIfStmt b t e @@ -238,7 +238,7 @@ implementation is shown in Listing~\ref{lst:shareview}. \begin{lstlisting}[label={lst:shareview},% caption={Bytecode view for \texttt{arith}}] -freshshare = get >>= \st=:{freshl=[fr:frs]}->put {st & freshl=frs} >>| pure fr +freshshare = get >>= \st=:{freshs}->put {st & freshs=freshs+1} >>| pure freshs instance sds ByteCode where sds f = {main = BC (freshshare @@ -324,7 +324,50 @@ position in the program memory. 20 : BCDigitalWrite (Digital D0) \end{lstlisting} -\todo{add more elaborate example?} - -\section{Interpretation} -\todo{details about the interpreter on the client} +\section{Interpreter} +The client contains an interpreter to execute a \gls{Task}'s bytecode. + +First some preparatory work is done. The stack will be initialized and the +program counter and stack pointer are set to zero and the bottom respectively. +Then the interpreter executes one step at the time while the program counter is +smaller than the program length. The code for this is listed in +Listing~\ref{lst:interpr}. One execution step is basically a big switch +statement going over all possible bytecode instructions. Some instructions are +detailed upon in the listing. The \CI{BCPush} instruction is a little more +complicated in real life because some decoding will take place as not all +\CI{BCValue}'s are of the same length. + +\begin{lstlisting}[language=C,label={lst:interpr},% + caption={Rough code outline for interpretation}] +#define f16(p) program[pc]*265+program[pc+1] + +void run_task(struct task *t){ + uint8_t *program = t->bc; + int plen = t->tasklength; + int pc = 0; + int sp = 0; + while(pc < plen){ + switch(program[pc++]){ + case BCNOP: + break; + case BCPUSH: + stack[sp++] = pc++ //Simplified + break; + case BCPOP: + sp--; + break; + case BCSDSSTORE: + sds_store(f16(pc), stack[--sp]); + pc+=2; + break; + // ... + case BCADD: trace("add"); + stack[sp-2] = stack[sp-2] + stack[sp-1]; + sp -= 1; + break; + // ... + case BCJMPT: trace("jmpt to %d", program[pc]); + pc = stack[--sp] ? program[pc]-1 : pc+1; + break; +} +\end{lstlisting}