X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=methods.tex;h=8b5b1fe6c32bedc66275e8e27272260d238fbddf;hb=50bd4ce74dd1fe83cadc14e7c0736c1e75605961;hp=9726a2f423e57358a19865420804f984e9e81c4e;hpb=6dca5a0ebb686cc11b0cb90f98c3d8347d0b7eeb;p=msc-thesis1617.git diff --git a/methods.tex b/methods.tex index 9726a2f..8b5b1fe 100644 --- a/methods.tex +++ b/methods.tex @@ -1,9 +1,103 @@ +\section{\acrlong{TOP}} +\gls{TOP} is a recent new programming paradigm implemented as +\gls{iTasks}~\cite{achten_introduction_2015} in +the pure lazy functional language \gls{Clean} + +\todo{Main terms} +The lazy functional programming language based on graph rewriting +\gls{Clean}~\cite{brus_cleanlanguage_1987} + +\section{\acrlong{EDSL}s} +\glspl{mTask} are expressed in a class based shallowly embedded \gls{EDSL}. +There are two main types of \glspl{EDSL}. +\todo{Small shallow embedded dsl intro} +\todo{Small deep embedded dsl} +\todo{Show that class based has the best of both worlds} + \section{Devices} +The client code for the devices is compiled from one codebase. For a device to +be eligible for \glspl{mTask} it must be able to compile the shared codebase +and implement (part of) the device specific interface. The shared codebase only +uses standard \gls{C} and no special libraries or tricks are used. Therefore +the code is compilable for almost any device or system. Note that it is not +needed to implement a full interface\todo{handshake}. The full interface, +listed in Appendix~\label{app:device-interface}\todo{update interface listing}, +also includes functions for accessing the peripherals that not every device +might have. Devices can choose what to implement by setting the correct macros +in the top of the file. + \subsection{Specification} +Devices are stored in a record type and all devices in the system are stored in +a \gls{SDS} containing all devices. From the macro settings in the interface +file a profile is created for the device that describes the specification. When +a connection between the server and a client is established the server will +send a request for specification. The client will serialize his specs and send +it to the server so that the server knows what the client is capable of. The +exact specification is listed in Listing~\ref{lst:devicespec} + +\begin{lstlisting}[language=Clean,label={lst:devicespec}, + caption={Device specification for \glspl{mTask}}] +:: MTaskDeviceSpec = + {haveLed :: Bool + ,haveAio :: Bool + ,haveDio :: Bool + ,taskSpace :: Int // Bytes + ,sdsSpace :: Int // Bytes + } +\end{lstlisting} +\todo{Explain specification, combine task and share space} \subsection{Communication} \section{mTasks} -\subsection{\gls{DSL}} +\subsection{\gls{EDSL}} +The \gls{mTask}-\gls{EDSL} contains several classes that need to be implemented +by a type for it to be an \gls{mTask}. For numeric and boolean arithmetic the +classes \texttt{arith} and \texttt{boolExpr} are available and listed in a +shortened version in Listing~\ref{lst:arithbool}. All classes are to be +implemented by types of kind \texttt{*->*->*} a type \texttt{v t p}, +respectively a view with a type and the role. + +\texttt{lit} lifts a constant to the \gls{mTask} domain. For a type to be a +valid \gls{mTask} type it needs to implement the \texttt{mTaskType} class. The +binary operators work as expected. + +\begin{lstlisting}[language=Clean,label={lst:arithbool}, + caption={Basic classes for expressions}] +class mTaskType a | toByteCode, fromByteCode, iTask, TC a + +class arith v where + lit :: t -> v t Expr | mTaskType t + (+.) infixl 6 :: (v t p) (v t q) -> v t Expr | type, +, zero t & isExpr p & isExpr q + ... +class boolExpr v where + (&.) infixr 3 :: (v Bool p) (v Bool q) -> v Bool Expr | isExpr p & isExpr q + Not :: (v Bool p) -> v Bool Expr | isExpr p + ... + (==.) infix 4 :: (v a p) (v a q) -> v Bool Expr | ==, toCode a & isExpr p & isExpr q +\end{lstlisting} + + +\subsection{Tasks} \subsection{Shares} +Shares can live on multiple clients at the same time. For every share created +for an \gls{mTask} a real \gls{SDS} is created that mirrors the value on the +client. All shares currently in use are stored in a system-wide \gls{SDS} in +such a way that the actual share can be retrieved at any moment. All shares +have a unique numeric identifier and an initial value. + +\begin{lstlisting}[language=Clean,label={lst:sharespec}, caption={\acrlong{SDS}}] +:: BCValue = E.e: BCValue e & mTaskType e +:: MTaskShareType = MTaskWithShare String | MTaskLens String +:: MTaskShare = + {withTask :: [String] + ,withDevice :: [String] + ,identifier :: Int + ,realShare :: MTaskShareType + ,value :: BCValue + } + +sdsStore :: Shared [MTaskShare] +\end{lstlisting} +\todo{Do something with the sharetype}