From c590c9a29ba0f88f0a4b19b3be89ed6c52bfd0f9 Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Mon, 12 Dec 2022 17:14:37 +0100 Subject: [PATCH] small updates --- dsl/class.tex | 2 + front/titlepage.tex | 2 +- intro/img/.gitignore | 1 + intro/img/todo0.png | Bin 0 -> 53214 bytes intro/intro.tex | 95 +++++++++++++-------------------------- intro/lst/.gitignore | 1 + intro/lst/nitrile.yml | 5 +++ intro/lst/sharedlist.icl | 24 ++++++++++ preamble.tex | 4 +- top/4iot.tex | 17 ++++--- 10 files changed, 78 insertions(+), 73 deletions(-) create mode 100644 intro/img/todo0.png create mode 100644 intro/lst/sharedlist.icl diff --git a/dsl/class.tex b/dsl/class.tex index e710142..9db7e20 100644 --- a/dsl/class.tex +++ b/dsl/class.tex @@ -2,6 +2,8 @@ \input{subfilepreamble} +\setcounter{chapter}{0} + \begin{document} \input{subfileprefix} \chapter{Deep embedding with class}% diff --git a/front/titlepage.tex b/front/titlepage.tex index fd1b9e1..563bdc3 100644 --- a/front/titlepage.tex +++ b/front/titlepage.tex @@ -69,7 +69,7 @@ \begin{itemize}[label={}] \item prof.\ dr.\ S.B.\ (Sven-Bodo) Scholz \item prof.\ dr.\ G.K.\ (Gabrielle) Keller (Universiteit Utrecht) - \item prof.\ dr.\ M.\ (Mary) Sheeran (Chalmers University of Gothenburg)\todo{Chal\-mers Tek\-nis\-ka H\"og\-sko\-la?} + \item prof.\ dr.\ M.\ (Mary) Sheeran (Chalmers Tekniska H\"ogskola) \end{itemize} \end{itemize} diff --git a/intro/img/.gitignore b/intro/img/.gitignore index ddcb517..806c5d3 100644 --- a/intro/img/.gitignore +++ b/intro/img/.gitignore @@ -1 +1,2 @@ *g.jpg +*g.png diff --git a/intro/img/todo0.png b/intro/img/todo0.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e7ff8c7c6fe79ff1902f2c2ce006e27510a799 GIT binary patch literal 53214 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 UhmeI+fB=hxh^%m>psxS_1<1hzFaQ7m literal 0 HcmV?d00001 diff --git a/intro/intro.tex b/intro/intro.tex index 9ede7fb..a7f4395 100644 --- a/intro/intro.tex +++ b/intro/intro.tex @@ -14,7 +14,6 @@ Finally, it provides a detailed overview of the contributions. \end{chapterabstract} -\todo{\etc{} toch als etc.\ ty\-pe\-se\-ten?: nee} There are at least 13.4 billion devices connected to the internet at the time of writing\footnote{\url{https://transformainsights.com/research/tam/market}, accessed on: \formatdate{13}{10}{2022}}. Each of these senses, acts, or otherwise interacts with people, other computers, and the environment surrounding us. Despite their immense diversity, they are all computers. @@ -45,7 +44,6 @@ For example, the \gls{TOP} system \gls{ITASK} can be used to program all layers It is implemented in \gls{CLEAN} and executes also in \gls{CLEAN}'s run time. The final executable is very low level and contains all these abstraction levels, this results in increased hardware requirements. The high hardware requirements are no problem for regular computers but impractical for the average edge device. -\todo{dit aan\-ge\-past en be\-spre\-ken} This is where \glspl{DSL} must be brought into play. \Glspl{DSL} are programming languages created with a specific domain in mind. @@ -69,7 +67,6 @@ On Wikipedia, a musical rhapsody is defined as follows \citep{wikipedia_contribu The chapters are readable independently. \Cref{prt:top} is a monograph showing \gls{MTASK}, a \gls{TOP} \gls{DSL} for the \gls{IOT}. It introduces \gls{IOT} edge device programming, shows the complete \gls{MTASK} language, provides details on how \gls{MTASK} is integrated with \gls{ITASK}, shows how the byte code compiler is implemented, and concludes with a guide for green computing with \gls{ITASK}. -\todo{Hier een o\-ver\-zicht v.d.\ chap\-ters ge\-ge\-ven} Hence, the chapters are best read in order. \Cref{prt:tvt} is a single chapter based on a journal article in which traditional tiered \gls{IOT} programming is qualitatively and quantitatively compared to tierless programming using a real-world application. The chapter is readable independently. @@ -95,7 +92,6 @@ These connected devices are already in households all around us in the form of s When describing \gls{IOT} systems, a tiered---or layered---architecture is often used for compartmentalisation. The number of tiers heavily depends on the required complexity of the model. For the intents and purposes of this thesis, the layered architecture as shown in \cref{fig:iot-layers} is used. -\todo{ik vind de poten mooi\\namen met tiot syncen: overleggen} \begin{figure} \centering @@ -133,7 +129,7 @@ These problems can be mitigated by dynamically sending code to be interpreted to With interpretation, a specialized interpreter is flashed in the program memory once it receives the program code to execute at run time. Therefore, as the programs are not stored in the flash memory, it does not wear out. It is challenging to create interpreters for small edge devices due to the severe hardware restrictions. -However, the hardware requirements can be reduced by embedding domain-specific data into the langauge, so called \gls{DSL}; and the interpreter, a domain-specific \gls{OS}.\todo{ar\-gu\-ment zo ster\-ker?} +However, the hardware requirements can be reduced by embedding domain-specific data into the langauge, so called \gls{DSL}; and the interpreter, a domain-specific \gls{OS}. \section{\texorpdfstring{\Glsxtrlongpl{DSL}}{Domain-specific languages}}% \label{sec:back_dsl} @@ -162,7 +158,6 @@ This hyponymy is shown in \cref{fig:hyponymy_of_dsls}. \glspl{DSL} where historically created as standalone languages, meaning that all machinery is developed solely for the language. The advantage of this approach is that the language designer is free to define the syntax and type system of the language as they wish, not being restricted by any constraint. Unfortunately it also means that they need to develop a compiler or interpreter, and all the scaffolding for the language, making standalone \glspl{DSL} costly to create. -\todo{Hier heb je toch juist geen extra leercurve, je ziet niets van de implementatietaal} Examples of standalone \glspl{DSL} are regular expressions, make, yacc, XML, SQL, \etc. The dichotomous approach is embedding the \gls{DSL} in a host language, i.e.\ \glspl{EDSL} \citep{hudak_modular_1998}. @@ -193,7 +188,6 @@ For example, \citet{elliott_compiling_2003} describe the language Pan, for which In fact, \gls{ITASK} and \gls{MTASK} are embedded \glspl{DSL}. \Gls{ITASK} runs in its host language as well so it is a homogeneous \gls{DSL}. Tasks written using \gls{MTASK} are dynamically compiled to byte code for an edge device and is therefore a heterogeneous \gls{DSL}. -\todo[inline]{Welk deel van mTask is ``largely, or completely, ignorant of the existence of the other parts of the system.'' Lijkt me een rare definitie die niet echt van toepassing is: het RTS, het heeft geen idee van de taal of de server, dat is een black box, alleen van de gecompileerde code.} \section{\texorpdfstring{\Glsxtrlong{TOP}}{Task-oriented programming}}% \label{sec:back_top} @@ -206,17 +200,8 @@ After describing the layers, the link to the \gls{IOT} architecture is explained \begin{figure} \centering - \begin{subfigure}[t]{.5\textwidth} - \centering - \includestandalone{traditional} - \caption{\Gls{LSOC} approach.} - \end{subfigure}% - \begin{subfigure}[t]{.5\textwidth} - \centering - \includestandalone{tosd} - \caption{\Gls{TOSD} approach.} - \end{subfigure} - \caption{Separation of concerns in a traditional setting compared to \gls{TOSD} (adapted from \citep[\citepage{20}]{wang_maintaining_2018}).}% + \includestandalone{tosd} + \caption{Separation of concerns in \gls{TOSD} (adapted from \citep[\citepage{20}]{wang_maintaining_2018}).}% \label{fig:tosd} \end{figure} @@ -239,25 +224,26 @@ After describing the layers, the link to the \gls{IOT} architecture is explained An \gls{SDS} can represent typed data stored in a file, a chunk of memory, a database \etc. \Glspl{SDS} can also represent external impure data such as the time, random numbers or sensor data. In many \gls{TOP} langauges, combinators are available to filter, combine, transform, and focus \glspl{SDS}. - \item[Programming language (\glsxtrshort{UOD}):] - \todo{Stran\-ge item: from tosd paper} + \item[\Glsxtrshort{UOD} (programming language):] The \gls{UOD} is explicitly and separately modelled by the relations that exist in the functions of the host language. + \todo{uit\-brei\-den} \end{description} -This figure differs from the presented \gls{IOT} architecture because one describes the software architecture and the other a software development model. +This figure differs from the presented \gls{IOT} architecture because they represent separate concepts. +The \gls{IOT} architecture from \cref{fig:iot} describes an execution architecture wheras the \gls{TOSD} figure describes a softwared development model. +E.g.\ from a software development perspective, a task is a task, whether it is executed on a microcontroller, a server or a client. Though some concepts can be mapped upon eachother. -Applying the concepts of \gls{LSOC} to \gls{IOT} systems can be done in two ways. -Firstly, edge devices can be seen as simple resources, thus accessed through the resource access layer. -The second view is that edge devices contain miniature \gls{LSOC} systems in itself as well. -In \gls{TOSD} the same can be applied. -The individual components in the miniature systems, the tasks, the \glspl{SDS}, are connected to the main system. +Applying the concepts of \gls{TOSD} to \gls{IOT} systems can be done in two ways. +Firstly, edge devices can be seen as simple resources, thus accessed through \glspl{SDS}. +The second view is that edge devices contain miniature \gls{TOP} systems in itself. +The individual components in the miniature systems, the tasks, the \glspl{SDS}, are, in the eventual execution, connected to the main system. \todo{legt dit de link goed genoeg uit?} -\Citet{steenvoorden_tophat_2022} distinguishes two instruments for \gls{TOP}: \gls{TOP} languages and \gls{TOP} engines. -The language is the \emph{formal} language for specifying interactive systems. -The engine is the software or hardware that executes these specifications as a ready-for-work application. -\todo{uit\-brei\-den, ver\-wij\-de\-ren?} - +%\Citet{steenvoorden_tophat_2022} distinguishes two instruments for \gls{TOP}: \gls{TOP} languages and \gls{TOP} engines. +%The language is the \emph{formal} language for specifying interactive systems. +%The engine is the software or hardware that executes these specifications as a ready-for-work application. +%\todo{uit\-brei\-den, ver\-wij\-de\-ren?} +% \subsection{\texorpdfstring{\Gls{ITASK}}{ITask}} The concept of \gls{TOP} originated from the \gls{ITASK} framework, a declarative interactive systems language and \gls{TOP} engine for defining multi-user distributed web applications implemented as an \gls{EDSL} in the lazy pure \gls{FP} language \gls{CLEAN} \citep{plasmeijer_itasks:_2007,plasmeijer_task-oriented_2012}. From the structural properties of the data types, the entire user interface is automatically generated. @@ -274,45 +260,24 @@ The allowed task value transitions are shown in \cref{fig:taskvalue}. \label{fig:taskvalue} \end{figure} -As an example, \cref{lst:enter_person,fig:enter_person} show the \gls{ITASK} code and the corresponding \gls{UI} for a simple task for entering information about a person and viewing the entered result after completion. -From the data type definitions (\cref{lst:dt_fro,lst:dt_to}), using generic programming (\cref{lst:dt_derive}), the \glspl{UI} for the data types are automatically generated. -Using task combinators (e.g.\ \cleaninline{>>!} at \cref{lst:task_comb}), the tasks can be combined in sequence. -Only when the user enters a complete value in the web editor, then the continue button enables and the result can be viewed. -Special combinators (e.g.\ \cleaninline{@>>} at \cref{lst:task_ui}) are used to tweak the \gls{UI} to display informative labels. -\todo{Voorbeeldje uitbreiden met parallel en shares} +As an example, \cref{lst:todo,fig:todo} show the code and \gls{UI} for an interactive to-do list application. +The user can modify a shared to-do list through an editor directly or using some of the predefined actions. +Furthermore, in parallel, the length of the list is shown to demonstrate \glspl{SDS}. +From the data type definitions (\cref{lst:todo_dt}), using generic programming (\cref{lst:todo_derive}), the \glspl{UI} for the data types are automatically generated. +Then, using the parallel task combinator (\cleaninline{-\|\|}) that uses the left-hand side's result the task for updating the todos (\cref{lst:todo_update}) and the task for viewing the length are combined (\cref{lst:todo_length}). +Both tasks operate on the todo \gls{SDS} (\cref{lst:todo_sds}). +The task for updating the todo list is just an editor (\cref{lst:todo_editor}) combined using a step combinator (\crefrange{lst:todo_contfro}{lst:todo_contto}). +The actions either change the value, sorting or clearing it, or terminates the task by returning the current value of the \gls{SDS}. +Special combinators (e.g.\ \cleaninline{@>>} at \cref{lst:todo_ui}) are used to tweak the \gls{UI} to display informative labels. \begin{figure} \centering - \begin{subfigure}{.5\textwidth} - \centering - \includegraphics[width=.95\linewidth]{person0g} - \caption{Initial editor.} - \end{subfigure}% - \begin{subfigure}{.45\textwidth} - \centering - \includegraphics[width=.95\linewidth]{person1g} - \caption{Completed editor.} - \end{subfigure} - \begin{subfigure}{.5\textwidth} - \centering - \includegraphics[width=.95\linewidth]{person2g} - \caption{View the result.} - \end{subfigure} - \caption{The \gls{UI} for entering a person in \gls{ITASK}.}% - \label{fig:enter_person} + \includegraphics[width=.75\linewidth]{todo0g} + \caption{The \gls{UI} for the shared to-do list \gls{ITASK}.}% + \label{fig:todo} \end{figure} -\begin{lstClean}[numbers=left,caption={The code for entering a person in \gls{ITASK}.},label={lst:enter_person}] -:: Person = { name :: String, gender :: Gender, dateOfBirth :: Date }[+\label{lst:dt_fro}+] -:: Gender = Male | Female | Other String[+\label{lst:dt_to}+] - -derive class iTask Person, Gender[+\label{lst:dt_derive}+] - -enterPerson :: Task Person -enterPerson - = Hint "Enter a person:" @>> enterInformation [][+\label{lst:task_ui}+] - >>! \result->Hint "You Entered:" @>> viewInformation [] result[+\label{lst:task_comb}+] -\end{lstClean} +\cleaninputlisting[firstline=6,lastline=22,tabsize=3,numbers=left,caption={The code for a shared to-do list in \gls{ITASK}.},label={lst:todo}]{lst/sharedlist.icl} \subsection{\texorpdfstring{\Gls{MTASK}}{MTask}} \Gls{ITASK} seems an obvious candidate at first glance for extending \gls{TOP} to \gls{IOT} edge devices. diff --git a/intro/lst/.gitignore b/intro/lst/.gitignore index ddd7627..9b746c0 100644 --- a/intro/lst/.gitignore +++ b/intro/lst/.gitignore @@ -1 +1,2 @@ blink +sharedlist diff --git a/intro/lst/nitrile.yml b/intro/lst/nitrile.yml index fe13ac6..13e056f 100644 --- a/intro/lst/nitrile.yml +++ b/intro/lst/nitrile.yml @@ -37,3 +37,8 @@ build: - clm: main: blink target: ./blink + sharedlist: + script: + - clm: + main: sharedlist + target: ./sharedlist diff --git a/intro/lst/sharedlist.icl b/intro/lst/sharedlist.icl new file mode 100644 index 0000000..8b0e35c --- /dev/null +++ b/intro/lst/sharedlist.icl @@ -0,0 +1,24 @@ +module sharedlist + +import iTasks +import iTasks.Extensions.DateTime + +:: ToDo = {description :: String, date :: Date}/*\label{lst:todo_dt}*/ +derive class iTask ToDo/*\label{lst:todo_derive}*/ + +todos :: SimpleSDSLens [ToDo] +todos = sharedStore "todos" []/*\label{lst:todo_sds}*/ + +toDoTask :: Task [ToDo] +toDoTask = upToDos/*\label{lst:todo_update}*/ + -|| viewSharedInformation [ViewAs length] todos <<@ Label "Length"/*\label{lst:todo_length}*/ + +upToDos :: Task [ToDo] +upToDos = updateSharedInformation [] todos <<@ Title "My todo-list"/*\label{lst:todo_ui}\label{lst:todo_editor}*/ + >>* [ OnAction (Action "Sort") (hasValue \_->upd sort todos >-| upToDos)/*\label{lst:todo_ui}\label{lst:todo_contfro}*/ + , OnAction (Action "Clear") (always (set [] todos >-| upToDos)) + , OnAction (Action "Quit") (always (get todos))/*\label{lst:todo_ui}\label{lst:todo_contto}*/ + ] +where sort list = sortBy (\x y->x.ToDo.date < y.ToDo.date) list + +Start w = doTasks toDoTask w diff --git a/preamble.tex b/preamble.tex index a14abef..11c34d8 100644 --- a/preamble.tex +++ b/preamble.tex @@ -180,6 +180,7 @@ \lst@Key{moreliterate}{}{\addToLiterate{#1}} \makeatother % General listings settings +\definecolor{lstbg}{gray}{.95} \lstset{% basewidth=0.5em, basicstyle=\tt\small, @@ -189,7 +190,8 @@ columns=[c]fixed, commentstyle=\sl, escapeinside={[+}{+]}, % chktex 9 - frame=L, + frame=, + backgroundcolor=\color{lstbg}, keepspaces=true, keywordstyle=\bf, postbreak=\mbox{\textcolor{gray}{$\hookrightarrow$}\space}, diff --git a/top/4iot.tex b/top/4iot.tex index 039af94..aa78efb 100644 --- a/top/4iot.tex +++ b/top/4iot.tex @@ -2,6 +2,8 @@ \input{subfilepreamble} +\setcounter{chapter}{2} + \begin{document} \input{subfileprefix} \chapter{\texorpdfstring{\Glsxtrlong{TOP} for the \glsxtrlong{IOT}}{Task-oriented programming for the internet of things}}% @@ -18,9 +20,10 @@ \end{itemize} \end{chapterabstract} -The edge layer of \gls{IOT} systems predominantly contains of microcontrollers. +The edge layer of \gls{IOT} systems predominantly consists of microcontrollers. Microcontrollers are tiny computers designed specifically for embedded applications. -They therefore only have a soup\c{c}on of memory, have a slow processor, come with many energy efficient sleep modes and have a lot of peripheral support such as \gls{GPIO} pins. +They therefore only have a soup\c{c}on of memory and have a slow processor. +However, they also come with energy efficient sleep modes and have a lot of peripheral support such as \gls{GPIO} pins. Usually, programming microcontrollers requires an elaborate multi-step toolchain of compilation, linkage, binary image creation, and burning this image onto the flash memory of the microcontroller in order to compile and run a program. The programs are usually cyclic executives instead of tasks running in an operating system, i.e.\ there is only a single task that continuously runs on the bare metal. \Cref{tbl:mcu_laptop} compares the hardware properties of a typical laptop with two very popular microcontrollers. @@ -44,18 +47,20 @@ The programs are usually cyclic executives instead of tasks running in an operat \end{table} Different models of microcontrollers require their own vendor-provided drivers, hardware abstraction layer, compilers and \glspl{RTS}. -There are many platforms that abstract away from this such as \gls{MBED} and \gls{ARDUINO} of which \gls{ARDUINO} is specifically designed for education and prototyping and hence used here. +There are many platforms that abstract away from this such as \gls{MBED} and \gls{ARDUINO}. +\Gls{ARDUINO} is specifically designed for education and prototyping and hence used here to show traditional microcontroller programming. + The popular \gls{ARDUINO} \ccpp{} dialect and accompanying libraries provide an abstraction layer for common microcontroller behaviour allowing the programmer to program multiple types of microcontrollers using a single language. Originally it was designed for the in-house developed open-source hardware with the same name but the setup allows porting to many architectures. It provides an \gls{IDE} and toolchain automation to perform all steps of the toolchain with a single command. -\subsection{\texorpdfstring{\Glsxtrshort{TOP} for the \glsxtrshort{IOT}}{TOP for the IoT}} +\section{\texorpdfstring{\Glsxtrshort{TOP} for the \glsxtrshort{IOT}}{TOP for the IoT}} \Gls{TOP} is a programming paradigm that allows multi-tier systems to be generated from a single declarative source. \Gls{ITASK} is a general-purpose \gls{TOP} system for programming distributed web applications. These distributed web applications often form the core of \gls{IOT} applications as well but integrating these devices in \gls{ITASK} is not straightforward. \Gls{ITASK} targets relatively fast but energy-hungry systems with large amounts of \gls{RAM} and a speedy connections. -Edge devices in \gls{IOT} systems are typically slow but energy efficient and do not have the memory to run the naturally heap-heavy functional programs that \gls{ITASK} results in. -\Gls{MTASK} bridges this gap by providing a \gls{TOP} \gls{DSL} for \gls{IOT} edge devices that can, because domain-specific knowledge is built in, run on hardware with much less memory and processor speed. +Edge devices in \gls{IOT} systems are typically slow but energy efficient and do not have the memory to run the naturally heap-heavy functional programs that \gls{ITASK} programs are. +\Gls{MTASK} bridges this gap by providing a \gls{TOP} \gls{DSL} for \gls{IOT} edge devices that can, because domain-specific knowledge is embedded in the language and execution platform, run on hardware with much less memory and processor speed. The following sections compare traditional microcontroller programming with programming the devices using \gls{MTASK}. \section{Hello world!} -- 2.20.1