--- paginate: true _paginate: false footer: Topics in Compilers and Concurrency · Julius Fischer · 10.06.2026 _footer: "" style: | h1 { position: absolute; top: 60px; left: 75px; right: 75px; } --- $$ \def\leftcirc{{\triangleleft\kern-0.1em\circ}} \def\myor{{\;|\;}} \def\dest{{\rightarrow}} \def\lad{\lambda_d\;} \newcommand{\htype}[1]{{\lfloor #1 \rfloor}} \newcommand{\ampar}[3]{{\;_#1\langle #2 \;_{\tiny \land} \; #3 \rangle}} \newcommand{\mapstom}[1]{{\sideset{_#1}{}\mapsto}} $$ # Destination Calculus: ## A Linear 𝜆-Calculus for Purely Functional Memory Writes ## Thomas Bagrel, Arnaud Spiwack #### Topics in Compiler and Concurrency #### Julius Fischer ###### 10. Juni 2026 --- # What are Destinations? - Destination Passing Style - Imperative - Function takes destination instead of returning structure --- # Example in C ``` int* vec_add(int v1[], int v2[], int size) { int* res = malloc(size * sizeof(int)); for (int i = 0; i < size; i++) { res[i] = v1[i] + v2[i]; } return res; } ``` - Add an 'out parameter' ``` void dps_vec_add(int res[], int v1[], int v2[], int size) { for (int i = 0; i < size; i++) { res[i] = v1[i] + v2[i]; } } ``` --- # Motivation for DPS - Typical functional map implementation ``` map f (x:xs) = (f x : map f xs1) > (f x : map f xs) > (map f x1 : (f x2 : map f xs2)) > ... ``` - Not tail recursive - Performance issue - Inefficient stack growth ``` map f (x:xs) dest = map f xs (push dest (f x)) > map f xs1 (push dest (f x1)) > map f xs2 (push dest (f x2)) ``` --- # DPS in functional languages - Just add pointers to mutable data? - $Int \mapsto Int \mapsto \textcolor{red}{T}$ - $\textcolor{red}{T *}\mapsto Int \mapsto Int \mapsto \dots$ - Multiple issues with this - Memory safety - Multilpe writes on shared memory - Purity --- # Destination Calculus: Terminology - Holes Values $h_1, h_2, \dots$ - Destination $\dest h_1 \dest h_2, \dots$ - Ampars $\ampar{H}{v_1}{v_2}$, i.e. $\ampar{{\{h\}}}{(h, 15)}{\dest h}$ - $v_1$ "value with holes" - $v_2$ "value of destinations" --- # Destination Calculus: Terms in $\lad$ - Basic FP terms $$ t, u := x \myor t' t \;|\; t ; t' \;|\; \dots $$ - Case for all datatypes $$ \begin{align} \dots \myor &case\;t\;of\;(v_1, v_2) \mapsto u \myor\\ &case\;t\;of\;(Inl\;v_1) \mapsto u \myor \dots \end{align} $$ - Additions for destination passing $$ \begin{align} \dots \myor & new_\ltimes \myor from_\ltimes t \myor to_\ltimes t \myor upd_\ltimes \; t \; with \; x \mapsto t' \myor\\ & t \blacktriangleleft t' \myor t \leftcirc t' \myor t \triangleleft () \myor t \triangleleft Inl \myor t \triangleleft (,) \myor \dots \end{align} $$ --- # Destination Calculus: Constructors - Usually constructors are required $Inl, Inr, (a, b), \lambda x \mapsto t$ - In $\lad$ we simply 'refine' holes $Inl \; t \triangleq from_\ltimes' (upd_\ltimes\; new_\ltimes\; with \; d \mapsto d \triangleleft Inl \blacktriangleleft t)$ $\lambda x \mapsto t \; \triangleq from_\ltimes' (upd_\ltimes\; new_\ltimes\; with \; d \mapsto d \triangleleft (\lambda x \mapsto t))$ --- # Destination Calculus: Map example ![h:450](img/map_dps.jpg) [1] Thomas Bagel --- # Destination Calculus: Linearity and Modality - Double writes are an issue - If a hole is used more than once $(dest \blacktriangleleft v_1; dest \blacktriangleleft v_2; \dots)$ - In types like $\htype{\htype{T}}$ - Solved using modality of *Multiplicity* and *Age* $m = p \cdot a$ $p = 1 \myor \omega$ $a =\; \uparrow^k \myor \infty$ for $k \in \mathbb{N}_0$ - With $1 \underset{\raise{0.4em}{\leftarrow}}{<}^p \omega, \uparrow^k \underset{\raise{0.4em}{\leftarrow}}{<}^a \infty$ --- # Destination Calculus: Linearity and Modality - Add modalities to variable bindings $$ \begin{align} \dots \myor &case_m\;t\;of\;(v_1, v_2) \mapsto u \myor\\ &case_m\;t\;of\;(Inl\;v_1) \mapsto u \myor\\ &\lambda x\; \mapstom{m} \; t \myor \dots \end{align} $$ - And add add exponential modality to weaken constraints $$ \begin{align} \dots \myor &Mod_m\; t \myor \dots \end{align} $$ --- # Destination Calculus: Typing - Mostly standard --- # Referenes and Further Reading --- # Extra Slides If needed --- # Example for linear types ![](img/linear_works.jpg) [1] Page 7 --- # Example for linear types ![](img/linear_fails.jpg) [1] Page 8