36 research outputs found
Continuation Passing Style for Effect Handlers
We present Continuation Passing Style (CPS) translations for Plotkin and Pretnar's effect handlers with Hillerström and Lindley's row-typed fine-grain call-by-value calculus of effect handlers as the source language. CPS translations of handlers are interesting theoretically, to explain the semantics of handlers, and also offer a practical implementation technique that does not require special support in the target language's runtime. We begin with a first-order CPS translation into untyped lambda calculus which manages a stack of continuations and handlers as a curried sequence of arguments. We then refine the initial CPS translation first by uncurrying it to yield a properly tail-recursive translation and second by making it higher-order in order to contract administrative redexes at translation time. We prove that the higher-order CPS translation simulates effect handler reduction. We have implemented the higher-order CPS translation as a JavaScript backend for the Links programming language
Portable, Efficient, and Practical Library-Level Choreographic Programming
Choreographic programming (CP) is an emerging paradigm for programming
distributed applications that run on multiple nodes. In CP, the programmer
writes one program, called a choreography, that is then transformed to
individual programs for each node via a compilation step called endpoint
projection (EPP). While CP languages have existed for over a decade,
library-level CP -- in which choreographies are expressed as programs in an
existing host language, and choreographic language constructs and EPP are
provided entirely by a host-language library -- is in its infancy.
Library-level CP has great potential, but existing implementations have
portability, efficiency, and practicality drawbacks that hinder its adoption.
In this paper, we aim to advance the state of the art of library-level CP
with two novel techniques for choreographic library design and implementation:
endpoint projection as dependency injection (EPP-as-DI), and choreographic
enclaves. EPP-as-DI is a language-agnostic technique for implementing EPP at
the library level. Unlike existing library-level approaches, EPP-as-DI asks
little from the host language -- support for higher-order functions is all that
is required -- making it usable in a wide variety of host languages.
Choreographic enclaves are a language feature that lets the programmer define
sub-choreographies within a larger choreography. Within an enclave, "knowledge
of choice" is propagated only among the enclave's participants, enabling the
seamless use of the host language's conditional constructs while addressing the
efficiency limitations of existing library-level CP implementations.
We implement EPP-as-DI and choreographic enclaves in ChoRus, the first CP
library for the Rust programming language. Our case studies and benchmarks
demonstrate that the usability and performance of ChoRus compares favorably to
traditional distributed programming in Rust
Concurrent system programming with effect handlers
© Springer International Publishing AG, part of Springer Nature 2018. Algebraic effects and their handlers have been steadily gaining attention as a programming language feature for composably expressing user-defined computational effects. While several prototype implementations of languages incorporating algebraic effects exist, Multicore OCaml incorporates effect handlers as the primary means of expressing concurrency in the language. In this paper, we make the observation that effect handlers can elegantly express particularly difficult programs that combine system programming and concurrency without compromising performance. Our experimental results on a highly concurrent and scalable web server demonstrate that effect handlers perform on par with highly optimised monadic concurrency libraries, while retaining the simplicity of direct-style code
Effects and Effect Handlers for Programmable Inference
Inference algorithms for probabilistic programming are complex imperative
programs with many moving parts. Efficient inference often requires customising
an algorithm to a particular probabilistic model or problem, sometimes called
inference programming. Most inference frameworks are implemented in languages
that lack a disciplined approach to side effects, which can result in
monolithic implementations where the structure of the algorithms is obscured
and inference programming is hard. Functional programming with typed effects
offers a more structured and modular foundation for programmable inference,
with monad transformers being the primary structuring mechanism explored to
date.
This paper presents an alternative approach to programmable inference, based
on algebraic effects, building on recent work that used algebraic effects to
represent probabilistic models. Using effect signatures to specify the key
operations of the algorithms, and effect handlers to modularly interpret those
operations for specific variants, we develop three abstract algorithms, or
inference patterns, representing three important classes of inference:
Metropolis-Hastings, particle filtering, and guided optimisation. We show how
our approach reveals the algorithms' high-level structure, and makes it easy to
tailor and recombine their parts into new variants. We implement the three
inference patterns as a Haskell library, and discuss the pros and cons of
algebraic effects vis-a-vis monad transformers as a structuring mechanism for
modular imperative algorithm design. It should be possible to reimplement our
library in any typed functional language able to emulate effects and effect
handlers
Runners in action
Runners of algebraic effects, also known as comodels, provide a mathematical
model of resource management. We show that they also give rise to a programming
concept that models top-level external resources, as well as allows programmers
to modularly define their own intermediate "virtual machines". We capture the
core ideas of programming with runners in an equational calculus
, which we equip with a sound and coherent
denotational semantics that guarantees the linear use of resources and
execution of finalisation code. We accompany with
examples of runners in action, provide a prototype language implementation in
OCaml, as well as a Haskell library based on .Comment: ESOP 2020 final version + online appendi