\documentclass{beamer} \usepackage[utf8]{inputenc} \usepackage{formal-grammar} \usepackage[dvipsnames]{xcolor} \usepackage{mathpartir} \usepackage{stmaryrd} \newcommand{\metavariable}[1]{\textcolor{teal}{#1}} \newcommand{\typeterminal}[1]{\textcolor{brown}{#1}} \newcommand{\exprterminal}[1]{\textcolor{Sepia}{#1}} \title{A functional core calculus with ladder-types} %\date[ISPN ’80]{27th International Symposium of Prime Numbers} \author[Euclid]{Michael Sippel \texttt{michael.sippel@mailbox.tu-dresden.de}\inst{1}} \institute{\inst{1} Technische Universität Dresden} \usetheme{ccc} \begin{document} \begin{frame} \titlepage \end{frame} \begin{frame} \frametitle{Type Systems} \framesubtitle{Tension between Safety and Flexibility} \begin{itemize} \item<1-> Goal: eliminate undefined behaviour, facilitate abstract code \item<2-> simple types are overly restrictive, loss of low level control \item<3-|alert@3> polymorphism (regain flexibility in type-safe way) \begin{itemize} \item<4-> parametric polymorphism (generics) \item<4-> subtype polymorphism (inheritance / coercions) \end{itemize} \end{itemize} \end{frame} \begin{frame}{How to get fast code?} \framesubtitle{Requirements for a type system} \begin{itemize} \item<1-> algorithmic optimization \begin{itemize} \item see which methods are used most frequently \item switch structures to reduce complexity there \item identify special cases \end{itemize} \item<2-> optimize implementation detail: \begin{itemize} \item remove indirection \item bottleneck? memory!\\ (plenty of Main-memory, but FAST memory is scarce\\ \(\rightarrow\) improve cache \& bus efficiency with compact representations) \begin{itemize} \item<3-> Balance De-/Encode Overhead vs. Fetch-Overhead \item<4-> Synchronize locality in access order and memory layout. -> elements accessed in succession shall be close in memory. (e.g. AoS vs SoA) \item<5-> accounting for machine specific cache-sizes \item<6-> accounting for SIMD instructions \item<7-> interfacing with kernels running on accelerator devices \end{itemize} \end{itemize} \end{itemize} \end{frame} \begin{frame}{Abstract Concept - Multiple Representations} \framesubtitle{Requirements for a type system} \begin{itemize} \item \end{itemize} \end{frame} \begin{frame}{Coercions: (In-)Coherence with Transitivity} \begin{itemize} \item<1-> Common example: coerce \texttt{Int -> Real} (subsumption \(\mathbb{N} \subset \mathbb{R}\)) \begin{itemize} \item \texttt{Int -> Real} \item \texttt{Int -> String} \item \texttt{Real -> String} \end{itemize} \item<2-> transitivity creates two extensionally \emph{different} coercion paths: \begin{itemize} \item \texttt{Int -> String} (3 -> "3") \item \texttt{Int -> Real -> String} (3 -> "3.0") \end{itemize} \item<3-> Subsumptive interpretation is misleading! \item<3-> \texttt{Int -> Real} is not as unambiguous as it might seem. \begin{itemize} \item value ranges (e.g. map int to unit interval [0,1]) \item multiple quantization functions (linear, exponential, \dots) \end{itemize} \end{itemize} \end{frame} \begin{frame}{Sea of Types} \includegraphics[width=\textwidth]{sot-int.png} \end{frame} \begin{frame}{Sea of Types} \includegraphics[width=\textwidth]{sot-json.png} \end{frame} \begin{frame}{Ladder Types} \begin{block}{Intuition} Encode "represented-as" relation into type terms \end{block} \begin{block}{} \( \tau_1 \sim \tau_2 \) reads "\(\tau_1\) represented as \(\tau_2\)" \end{block} \begin{example}\( Color \sim sRGB \sim HSV \sim \langle \text{Vec3} \quad \mathbb{R}_{[0,1]} \sim \langle \text{QuantizeLinear} \quad 256 \rangle \sim \mathbb{Z}_{256} \sim \text{machine.UInt8} \sim \text{Byte} \rangle \sim \text{[Byte; 3]} \)\end{example} \end{frame} \begin{frame}{Extending System F} \small \begin{grammar} \firstcase{ T }{ \metavariable{\sigma} }{Base Type} \otherform{ \metavariable{\alpha} }{Type Variable} \otherform{ \typeterminal{\forall} \metavariable{\alpha} \typeterminal{.} \nonterm{T} }{Universal Type} \otherform{ \typeterminal{<} \nonterm{T} \quad \nonterm{T} \typeterminal{>} }{Specialized Type} \otherform{ \nonterm{T} \quad \typeterminal{\rightarrow} \quad \nonterm{T} }{Function Type} \otherform{ \nonterm{T} \quad \typeterminal{\rightarrow_\text{morph}} \quad \nonterm{T} }{Morphism Type} \otherform{ \nonterm{T} \quad \typeterminal{\sim} \quad \nonterm{T} }{Ladder Type} $$\\$$ \firstcase{ E % T_\selexpr } { \metavariable{x} } {Variable} \otherform{ \exprterminal{let} \quad \metavariable{x} \quad \exprterminal{=} \quad \nonterm{ E } \quad \exprterminal{in} \quad \nonterm{ E } }{Variable Binding} \otherform{ $$ \exprterminal{\Lambda} \metavariable{\alpha} \quad \exprterminal{\mapsto} \quad $$ \nonterm{ E } }{Type Abstraction} \otherform{ $$ \exprterminal{\lambda} \metavariable{x} $$ \exprterminal{:} \nonterm{ T } \quad $$\exprterminal{\mapsto}$$ \quad \nonterm{ E } }{Value Abstraction} \otherform{ $$ \exprterminal{\lambda} \metavariable{x} $$ \exprterminal{:} \nonterm{ T } \quad $$\exprterminal{\mapsto_\text{morph}}$$ \quad \nonterm{ E } }{Value Morphism} \otherform{ \nonterm{ E } \quad \nonterm{ T } }{Type Application} \otherform{ \nonterm{ E } \quad \nonterm{ E } }{Value Application} \otherform{ \nonterm{ E } \quad \exprterminal{as} \quad \nonterm{ T } }{Ascension} \otherform{ \nonterm{ E } \quad \exprterminal{des} \quad \nonterm{ T } }{Descension} \end{grammar} \end{frame} \begin{frame}{Morphism Graph} \begin{definition}[Morphism Paths] \label{def:pathrules} \begin{mathpar} \inferrule[M-Sub]{ \metavariable{\tau} \leq \metavariable{\tau'} }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} } \inferrule[M-Single]{ (\metavariable{h} : \metavariable{\tau} \typeterminal{\rightarrow_\text{morph}} \metavariable{\tau'}) \in \Gamma }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} } \inferrule[M-Chain]{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'}\\ \Gamma \vdash \metavariable{\tau'} \leadsto \metavariable{\tau''} }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau''} } \inferrule[M-MapSeq]{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} }{ \Gamma \vdash \typeterminal{\langle\text{Seq } \metavariable{\tau}\rangle} \leadsto \typeterminal{\langle\text{Seq } \metavariable{\tau'}\rangle} } \end{mathpar} \end{definition} \end{frame} \begin{frame}{Morphism Graph} \begin{example}[Morphism Graph] \begin{mathpar} \small \text{Assume } \Gamma := \{\\ \exprterminal{\text{degrees-to-turns}} : \typeterminal{\text{Angle}\sim\text{Degrees}\sim\mathbb{R} \quad \rightarrow_\text{morph} \quad \text{Angle}\sim\text{Turns}\sim\mathbb{R}},\\ \exprterminal{\text{turns-to-radians}} : \typeterminal{\text{Angle}\sim\text{Turns}\sim\mathbb{R} \quad \rightarrow_\text{morph} \quad \text{Angle}\sim\text{Radians}\sim\mathbb{R}},\\ \}. \end{mathpar} \end{example} \end{frame} \begin{frame}{Morphism Graph} \begin{example}[Morphism Graph] Then .. \small \begin{itemize} \item \(\Gamma \vdash \typeterminal{\text{Angle}\sim\text{Degrees}\sim\mathbb{R}} \leadsto \typeterminal{\mathbb{R}}\) (by \textsc{M-Sub}) \item \(\Gamma \vdash \typeterminal{\text{Angle}\sim\text{Degrees}\sim\mathbb{R}} \leadsto \typeterminal{\text{Angle}\sim\text{Radians}\sim\mathbb{R}}\) (by \textsc{M-Chain}) \item \(\Gamma \vdash \typeterminal{\langle\text{Seq }\text{Angle}\sim\text{Degrees}\sim\mathbb{R}\rangle} \leadsto \typeterminal{\langle\text{Seq }\text{Angle}\sim\text{Radians}\sim\mathbb{R}\rangle}\) (by \textsc{M-MapSeq}) \end{itemize} \end{example} \end{frame} \begin{frame}{Typing} \begin{definition}[Typing Relation] \begin{mathpar} \inferrule[T-App]{ \Gamma \vdash \metavariable{f} : \metavariable{\sigma} \typeterminal{\rightarrow} \metavariable{\tau}\\ \Gamma \vdash \metavariable{a} : \metavariable{\sigma'}\\ \Gamma \vdash \metavariable{\sigma'} \leadsto \metavariable{\sigma} }{ \Gamma \vdash (\metavariable{f} \quad \metavariable{a}) : \metavariable{\tau} } \end{mathpar} \end{definition} \end{frame} \begin{frame}{Translation} \begin{definition}[Morphism Translation] \begin{mathpar} \small \Big{\llbracket} \inferrule[M-Sub]{ \metavariable{\tau} \leq \metavariable{\tau'} }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} } \Big{\rrbracket} = \exprterminal{\lambda x:\metavariable{\tau} \mapsto x} \and \Big{\llbracket} \inferrule[M-Single]{ (\metavariable{h} : \metavariable{\tau} \typeterminal{\rightarrow_\text{morph}} \metavariable{\tau'}) \in \Gamma }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} } \Big{\rrbracket} = \metavariable{h} \and \end{mathpar} \end{definition} \end{frame} \begin{frame}{Translation} \begin{definition}[Morphism Translation (2)] \begin{mathpar} \small \Big{\llbracket} \inferrule[M-Chain]{ C_1 :: \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'}\\ C_2 :: \Gamma \vdash \metavariable{\tau'} \leadsto \metavariable{\tau''} }{ \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau''} } \Big{\rrbracket} = \exprterminal{\lambda \text{x}:\metavariable{\tau} \mapsto} \Big{\llbracket} C_2 \Big{\rrbracket} \exprterminal{(}\Big{\llbracket} C_1 \Big{\rrbracket} \exprterminal{\text{x})} \and \Big{\llbracket} \inferrule[M-MapSeq]{ C_1 :: \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'} }{ \Gamma \vdash \typeterminal{\langle\text{Seq } \metavariable{\tau}\rangle} \leadsto \typeterminal{\langle\text{Seq } \metavariable{\tau'}\rangle} } \Big{\rrbracket} = \exprterminal{\lambda \text{xs}:\typeterminal{\langle\text{Seq }\metavariable{\tau}\rangle} \mapsto} \exprterminal{( \text{map}} \Big{\llbracket} C_1 \Big{\rrbracket} \exprterminal{\text{xs})} \end{mathpar} \end{definition} \end{frame} \begin{frame}{Translation} \begin{definition}[Expression Translation] Translates a type-derivation tree into a fully expanded expression \begin{mathpar} \Big{\llbracket} \inferrule[T-App]{ D_1 :: \Gamma \vdash \metavariable{f} : \metavariable{\sigma} \typeterminal{\rightarrow} \metavariable{\tau}\\ D_2 :: \Gamma \vdash \metavariable{a} : \metavariable{\sigma'}\\\\ C :: \Gamma \vdash \metavariable{\sigma'} \leadsto \metavariable{\sigma} }{ \Gamma \vdash (\metavariable{f} \quad \metavariable{a}) : \metavariable{\tau} } \Big{\rrbracket} = \Big{\llbracket}D_1\Big{\rrbracket} \exprterminal{(} \Big{\llbracket}C\Big{\rrbracket} \Big{\llbracket}D_2\Big{\rrbracket} \exprterminal{)} \end{mathpar} \end{definition} \end{frame} \begin{frame}{Soundness} \begin{lemma}[Morphism generation has correct type] \begin{mathpar} C :: \Gamma \vdash \metavariable{\tau} \leadsto \metavariable{\tau'}\\ \Rightarrow \Gamma \vdash \llbracket C \rrbracket : \metavariable{\tau} \typeterminal{\rightarrow_\text{morph}} \metavariable{\tau'} \end{mathpar} \end{lemma} \begin{lemma}[Expression Translation preserves typing] \begin{mathpar} D :: \Gamma \vdash \metavariable{e} : \metavariable{\tau}\\ \Rightarrow \Gamma \vdash \llbracket D \rrbracket : \metavariable{\tau} \end{mathpar} \end{lemma} \end{frame} \begin{frame}{Soundness} \begin{theorem}[Preservation] \begin{mathpar} \forall \Gamma, \metavariable{e}, \metavariable{\tau},\\ D :: \Gamma \vdash \metavariable{e} : \metavariable{\tau}\\ \Rightarrow \llbracket D \rrbracket \rightarrow_{eval} \metavariable{e'} \\ \Rightarrow \Gamma \vdash \metavariable{e'} : \metavariable{\tau} \end{mathpar} \end{theorem} \end{frame} \begin{frame}{Soundness} \begin{theorem}[Progress] \begin{mathpar} \forall \Gamma, \metavariable{e}, \metavariable{\tau},\\ D :: \Gamma \vdash \metavariable{e} : \metavariable{\tau}\\ \Rightarrow \llbracket D \rrbracket \text{ is a value} \\ \vee \\ \exists \metavariable{e'} . \llbracket D \rrbracket \rightarrow_{eval} \metavariable{e'} \\ \end{mathpar} \end{theorem} \end{frame} \begin{frame}{Summary} todo \end{frame} \end{document}