My PhD dissertation at the University of Edinburgh, Scotland
https://www.dhil.net/research/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
12 KiB
370 lines
12 KiB
%% 12pt font size, PhD thesis, LFCS, print twosided, new chapters on right page
|
|
\documentclass[12pt,phd,lfcs,twoside,openright,logo,leftchapter,normalheadings]{infthesis}
|
|
\shieldtype{0}
|
|
|
|
%% Packages
|
|
\usepackage[utf8]{inputenc} % Enable UTF-8 typing
|
|
\usepackage[british]{babel} % British English
|
|
\usepackage[breaklinks]{hyperref} % Interactive PDF
|
|
\usepackage{url}
|
|
\usepackage[sort&compress,square,numbers]{natbib} % Bibliography
|
|
\usepackage{breakurl}
|
|
\usepackage{amsmath} % Mathematics library
|
|
\usepackage{amssymb} % Provides math fonts
|
|
\usepackage{amsthm} % Provides \newtheorem, \theoremstyle, etc.
|
|
\usepackage{mathtools}
|
|
\usepackage{pkgs/mathpartir} % Inference rules
|
|
\usepackage{stmaryrd} % semantic brackets
|
|
\usepackage{array}
|
|
\usepackage{float} % Float control
|
|
\usepackage{caption,subcaption} % Sub figures support
|
|
\DeclareCaptionFormat{underlinedfigure}{#1#2#3\hrulefill}
|
|
\captionsetup[figure]{format=underlinedfigure}
|
|
\usepackage[T1]{fontenc} % Fixes font issues
|
|
%\usepackage{lmodern}
|
|
\usepackage[activate=true,
|
|
final,
|
|
tracking=true,
|
|
kerning=true,
|
|
spacing=true,
|
|
factor=1100,
|
|
stretch=10,
|
|
shrink=10]{microtype}
|
|
\usepackage{enumerate} % Customise enumerate-environments
|
|
\usepackage{xcolor} % Colours
|
|
\usepackage{xspace} % Smart spacing in commands.
|
|
\usepackage{tikz}
|
|
\usetikzlibrary{fit,calc,trees,positioning,arrows,chains,shapes.geometric,%
|
|
decorations.pathreplacing,decorations.pathmorphing,shapes,%
|
|
matrix,shapes.symbols,intersections}
|
|
|
|
\SetProtrusion{encoding={*},family={bch},series={*},size={6,7}}
|
|
{1={ ,750},2={ ,500},3={ ,500},4={ ,500},5={ ,500},
|
|
6={ ,500},7={ ,600},8={ ,500},9={ ,500},0={ ,500}}
|
|
|
|
\SetExtraKerning[unit=space]
|
|
{encoding={*}, family={bch}, series={*}, size={footnotesize,small,normalsize}}
|
|
{\textendash={400,400}, % en-dash, add more space around it
|
|
"28={ ,150}, % left bracket, add space from right
|
|
"29={150, }, % right bracket, add space from left
|
|
\textquotedblleft={ ,150}, % left quotation mark, space from right
|
|
\textquotedblright={150, }} % right quotation mark, space from left
|
|
|
|
%%
|
|
%% Load macros.
|
|
%%
|
|
\input{macros}
|
|
|
|
%% Information about the title, etc.
|
|
% \title{Higher-Order Theories of Handlers for Algebraic Effects}
|
|
% \title{Handlers for Algebraic Effects: Applications, Compilation, and Expressiveness}
|
|
% \title{Applications, Compilation, and Expressiveness for Effect Handlers}
|
|
% \title{Handling Computational Effects}
|
|
% \title{Programming Computable Effectful Functions}
|
|
% \title{Handling Effectful Computations}
|
|
\title{Foundations for Programming and Implementing Effect Handlers}
|
|
\author{Daniel Hillerström}
|
|
|
|
%% If the year of submission is not the current year, uncomment this line and
|
|
%% specify it here:
|
|
\submityear{2020}
|
|
|
|
%% Specify the abstract here.
|
|
\abstract{%
|
|
An abstract\dots
|
|
}
|
|
|
|
%% Now we start with the actual document.
|
|
\begin{document}
|
|
\raggedbottom
|
|
%% First, the preliminary pages
|
|
\begin{preliminary}
|
|
|
|
%% This creates the title page
|
|
\maketitle
|
|
|
|
%% Acknowledgements
|
|
\begin{acknowledgements}
|
|
List of people to thank
|
|
\begin{itemize}
|
|
\item Sam Lindley
|
|
\item John Longley
|
|
\item Christophe Dubach
|
|
\item KC Sivaramakrishnan
|
|
\item Stephen Dolan
|
|
\item Anil Madhavapeddy
|
|
\item Gemma Gordon
|
|
\item Leo White
|
|
\item Andreas Rossberg
|
|
\item Robert Atkey
|
|
\item Jeremy Yallop
|
|
\item Simon Fowler
|
|
\item Craig McLaughlin
|
|
\item Garrett Morris
|
|
\item James McKinna
|
|
\item Brian Campbell
|
|
\item Paul Piho
|
|
\item Amna Shahab
|
|
\item Gordon Plotkin
|
|
\item Ohad Kammar
|
|
\item School of Informatics (funding)
|
|
\item Google (Kevin Millikin, Dmitry Stefantsov)
|
|
\item Microsoft Research (Daan Leijen)
|
|
\end{itemize}
|
|
\end{acknowledgements}
|
|
|
|
%% Next we need to have the declaration.
|
|
% \standarddeclaration
|
|
\begin{declaration}
|
|
I declare that this thesis was composed by myself, that the work
|
|
contained herein is my own except where explicitly stated otherwise
|
|
in the text, and that this work has not been submitted for any other
|
|
degree or professional qualification except as specified.
|
|
\end{declaration}
|
|
|
|
%% Finally, a dedication (this is optional -- uncomment the following line if
|
|
%% you want one).
|
|
% \dedication{To my mummy.}
|
|
\dedication{\emph{To be or to do}}
|
|
|
|
% \begin{preface}
|
|
% A preface will possibly appear here\dots
|
|
% \end{preface}
|
|
|
|
%% Create the table of contents
|
|
\setcounter{secnumdepth}{2} % Numbering on sections and subsections
|
|
\setcounter{tocdepth}{1} % Show chapters, sections and subsections in TOC
|
|
%\singlespace
|
|
\tableofcontents
|
|
%\doublespace
|
|
|
|
%% If you want a list of figures or tables, uncomment the appropriate line(s)
|
|
% \listoffigures
|
|
% \listoftables
|
|
\end{preliminary}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Main content %%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%%
|
|
%% Introduction
|
|
%%
|
|
\chapter{Introduction}
|
|
\label{ch:introduction}
|
|
An enthralling introduction\dots
|
|
%
|
|
Motivation: 1) compiler perspective: unifying control abstraction,
|
|
lean runtime, desugaring of async/await, generators/iterators, 2)
|
|
giving control to programmers, safer microkernels, everything as a
|
|
library.
|
|
|
|
\section{Thesis outline}
|
|
Thesis outline\dots
|
|
|
|
\section{Typographical conventions}
|
|
Explain conventions\dots
|
|
|
|
\part{Background}
|
|
\label{p:background}
|
|
|
|
\chapter{The state of effectful programming}
|
|
\label{ch:related-work}
|
|
|
|
\section{Type and effect systems}
|
|
\section{Monadic programming}
|
|
|
|
\chapter{Continuations}
|
|
\label{ch:continuations}
|
|
|
|
\section{Zoo of control operators}
|
|
Describe how effect handlers fit amongst shift/reset, prompt/control,
|
|
callcc, J, catchcont, etc.
|
|
|
|
\section{Implementation strategies}
|
|
|
|
|
|
\part{Design}
|
|
|
|
\chapter{A ML-flavoured programming language}
|
|
\label{ch:base-language}
|
|
|
|
In this chapter we introduce a core calculus, \BCalc{}, which we shall
|
|
later use as the basis for exploration of design considerations for
|
|
effect handlers. This calculus is based on \CoreLinks{} by
|
|
\citet{LindleyC12}, which distils the essence of the functional
|
|
multi-tier web-programming language
|
|
\Links{}~\cite{CooperLWY06}. \Links{} belongs to the
|
|
ML-family~\cite{MilnerTHM97} of programming languages as it features
|
|
typical characteristics of ML languages such as a static type system
|
|
supporting parametric polymorphism with type inference support (in
|
|
fact Links supports first-class polymorphism), and its evaluation
|
|
semantics is strict. However, \Links{} differentiates itself from the
|
|
rest of the ML-family by making crucial use of \emph{row polymorphism}
|
|
to support extensible records, variants, and tracking of computational
|
|
effects. Thus \Links{} has a rather strong emphasis on structural
|
|
types rather than nominal types.
|
|
|
|
\CoreLinks{} captures all of these properties of \Links{}. Our
|
|
calculus \BCalc{} differs in several aspects from \CoreLinks{}. For
|
|
example, the underlying formalism of \CoreLinks{} is call-by-value,
|
|
whilst the formalism of \BCalc{} is \emph{fine-grain
|
|
call-by-value}~\cite{LevyPT03}, which shares similarities with
|
|
A-normal form (ANF)~\cite{FlanaganSDF93} as it syntactically
|
|
distinguishes between value and computation terms by mandating every
|
|
intermediate computation being named. However unlike ANF, fine-grain
|
|
call-by-value remains closed under $\beta$-reduction. The reason for
|
|
choosing fine-grain call-by-value as our formalism is entirely due to
|
|
convenience. As we shall see in Chapter~\ref{ch:unary-handlers}
|
|
fine-grain call-by-value is a convenient formalism for working with
|
|
continuations. Another point of difference between \CoreLinks{} and
|
|
\BCalc{} is that the former models the integrated database query
|
|
sublanguage of \Links{}. We do not consider the query sublanguage at
|
|
all, and instead our focus is entirely on modelling the interaction
|
|
and programming with computational effects.
|
|
|
|
\section{Syntax and static semantics}
|
|
\label{sec:syntax-base-language}
|
|
|
|
Typically the presentation of a programming language begins with its
|
|
syntax. If the language is typed there are two possible starting
|
|
points: Either one presents the term syntax first, or alternatively,
|
|
the type syntax first. Although the choice may seem rather benign
|
|
there is, however, a philosophical distinction to be drawn between
|
|
them. Terms are, on their own, entirely meaningless, whilst types
|
|
provide, on their own, an initial approximation of the semantics of
|
|
terms. This is particularly true in an intrinsic typed system perhaps
|
|
less so in an extrinsic typed system. In an intrinsic system types
|
|
must necessarily be precursory to terms, as terms ultimately depend on
|
|
the types. Following this argument leaves us with no choice but to
|
|
first present the type syntax of \BCalc{} and subsequently its term
|
|
syntax.
|
|
|
|
\subsection{Types, kinds, and their environments}
|
|
\label{sec:base-language-types}
|
|
|
|
Figure~\ref{fig:base-language-types} depicts the syntax for types of
|
|
\BCalc{}.
|
|
|
|
\begin{figure}
|
|
\begin{syntax}
|
|
\slab{Value types} &A,B &::= & A \to C
|
|
\mid \alpha
|
|
\mid \forall \alpha^K.C
|
|
\mid \Record{R}
|
|
\mid [R]\\
|
|
\slab{Computation types}
|
|
&C,D &::= & A \eff E \\
|
|
\slab{Effect types} &E &::= & \{R\}\\
|
|
\slab{Row types} &R &::= & \ell : P;R \mid \rho \mid \cdot \\
|
|
\slab{Presence types} &P &::= & \Pre{A} \mid \Abs \mid \theta\\
|
|
%\slab{Labels} &\ell & & \\
|
|
\slab{Handler types} &F &::= & C \Rightarrow D \\
|
|
\slab{Types} &T &::= & A \mid C \mid E \mid R \mid P \mid F \\
|
|
\slab{Kinds} &K &::= & \Type \mid \Row_\mathcal{L} \mid \Presence
|
|
\mid \Comp \mid \Effect \mid \Handler \\
|
|
\slab{Label sets} &\mathcal{L} &::=& \emptyset \mid \{\ell\} \uplus \mathcal{L}\\
|
|
%\slab{Type variables} &\alpha, \rho, \theta& \\
|
|
\slab{Type environments} &\Gamma &::=& \cdot \mid \Gamma, x:A \\
|
|
\slab{Kind environments} &\Delta &::=& \cdot \mid \Delta, \alpha:K
|
|
\end{syntax}
|
|
\caption{Syntax of types in \BCalc{}}\label{fig:base-language-types}
|
|
\end{figure}
|
|
|
|
\subsection{Terms}
|
|
\label{sec:base-language-terms}
|
|
|
|
\section{Dynamic semantics}
|
|
|
|
\section{Type and effect inference}
|
|
\dhil{While I would like to detail the type and effect inference, it
|
|
may not be worth the effort. The reason I would like to do this goes
|
|
back to 2016 when Richard Eisenberg asked me about how we do effect
|
|
inference in Links.}
|
|
|
|
\chapter{Unary handlers}
|
|
\label{ch:unary-handlers}
|
|
|
|
\section{Deep handlers}
|
|
\subsection{Syntax and static semantics}
|
|
\subsection{Effect inference}
|
|
\subsection{Dynamic semantics}
|
|
|
|
\section{Parameterised handlers}
|
|
|
|
\section{Shallow handlers}
|
|
\label{ch:shallow-handlers}
|
|
|
|
\subsection{Syntax and static semantics}
|
|
\subsection{Dynamic semantics}
|
|
|
|
\chapter{N-ary handlers}
|
|
\label{ch:multi-handlers}
|
|
|
|
% \section{Syntax and Static Semantics}
|
|
% \section{Dynamic Semantics}
|
|
\section{Unifying deep and shallow handlers}
|
|
|
|
\part{Implementation}
|
|
|
|
\chapter{Continuation passing styles}
|
|
\chapter{Abstract machine semantics}
|
|
|
|
\part{Expressiveness}
|
|
\chapter{Computability, complexity, and expressivness}
|
|
\label{ch:expressiveness}
|
|
\section{Notions of expressiveness}
|
|
Felleisen's macro-expressiveness, Longley's type-respecting
|
|
expressiveness, Kammar's typability-preserving expressiveness.
|
|
|
|
\section{Interdefinability of deep and shallow Handlers}
|
|
\section{Encoding parameterised handlers}
|
|
|
|
\chapter{The asymptotic power of control}
|
|
\label{ch:handlers-efficiency}
|
|
Describe the methodology\dots
|
|
\section{Generic search}
|
|
\section{Calculi}
|
|
\subsection{Base calculus}
|
|
\subsection{Handler calculus}
|
|
\section{A practical model of computation}
|
|
\subsection{Syntax}
|
|
\subsection{Semantics}
|
|
\subsection{Realisability}
|
|
\section{Points, predicates, and their models}
|
|
\section{Efficient generic search with effect handlers}
|
|
\subsection{Space complexity}
|
|
\section{Best-case complexity of generic search without control}
|
|
\subsection{No shortcuts}
|
|
\subsection{No sharing}
|
|
|
|
\chapter{Robustness of the asymptotic power of control}
|
|
\section{Mutable state}
|
|
\section{Exception handling}
|
|
\section{Effect system}
|
|
|
|
\part{Conclusions}
|
|
|
|
\chapter{Conclusions}
|
|
\label{ch:conclusions}
|
|
Some profound conclusions\dots
|
|
|
|
\chapter{Future Work}
|
|
\label{ch:future-work}
|
|
|
|
%%
|
|
%% Appendices
|
|
%%
|
|
% \appendix
|
|
|
|
%% If you want the bibliography single-spaced (which is allowed), uncomment
|
|
%% the next line.
|
|
%\nocite{*}
|
|
\singlespace
|
|
%\nocite{*}
|
|
%\printbibliography[heading=bibintoc]
|
|
\bibliographystyle{plainnat}
|
|
\bibliography{\jobname}
|
|
|
|
%% ... that's all, folks!
|
|
\end{document}
|
|
|