From 59fea61d2d15dd99fb88b28ad492aec5b1c577bd Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Thu, 2 Oct 2025 17:52:11 -0700 Subject: [PATCH] Add my initial slides Signed-off-by: Danila Fedorin --- alloy/abstract.txt | 22 + alloy/bug.png | Bin 0 -> 137389 bytes alloy/instancefound.png | Bin 0 -> 41491 bytes alloy/slides.md | 688 ++++++++++++++++++++++++++++ type-level/abstract.txt | 32 ++ type-level/slides.md | 979 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1721 insertions(+) create mode 100644 alloy/abstract.txt create mode 100644 alloy/bug.png create mode 100644 alloy/instancefound.png create mode 100644 alloy/slides.md create mode 100644 type-level/abstract.txt create mode 100644 type-level/slides.md diff --git a/alloy/abstract.txt b/alloy/abstract.txt new file mode 100644 index 0000000..ebef3b1 --- /dev/null +++ b/alloy/abstract.txt @@ -0,0 +1,22 @@ +Formal methods are a set of techniques that are used to validate the correctness +of software. A particular category of these methods, model checking, uses the +mathematical language of temporal logic to construct specifications of software’s +behavior. A solver can then validate the constraints described in the formal +language and ensure that undesirable states do not occur. + +This talk will be an experience report of using formal methods, specifically +the Alloy analyzer, to detect a bug in Chapel’s ‘Dyno’ compiler front-end library. +The area in which the bug was discovered is currently used in production, as +well as a part of editor tools such as chplcheck and chpl-language-server. + +Specifically, Alloy was used to construct a formal specification of a part of +Chapel’s use/import lookup algorithm. Chapel has a number of complicated scoping +rules and possible edge cases in this area. By running this specification against +a solver, a sequence of steps was discovered that could cause the algorithm to +malfunction and produce incorrect results. A program that causes these steps to +occur was constructed and served as a concrete reproducer for the bug. This +reproducer was used to adjust the logic and fix the bug. + +This talk will cover the fundamentals of temporal logic required for formal +specifications, the necessary parts of Chapel’s use/import lookup algorithm, +and the steps taken to encode and validate the compiler’s behavior. diff --git a/alloy/bug.png b/alloy/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..193c3da0b9965ba75033dbaaa85a7834a429cd69 GIT binary patch literal 137389 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

=0Csyn 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 b7XH{j_nbTR-V*KQ3_#%N>gTe~DWM4fk10{V literal 0 HcmV?d00001 diff --git a/alloy/instancefound.png b/alloy/instancefound.png new file mode 100644 index 0000000000000000000000000000000000000000..0a497a968e55a73911ebe5f2e522d7237f0f004f GIT binary patch literal 41491 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 literal 0 HcmV?d00001 diff --git a/alloy/slides.md b/alloy/slides.md new file mode 100644 index 0000000..47bdf68 --- /dev/null +++ b/alloy/slides.md @@ -0,0 +1,688 @@ +--- +theme: gaia +title: Using Formal Methods to Discover a Bug in the Chapel Compiler +backgroundColor: #fff +--- + + + +# **Using Formal Methods to Discover a Bug in the Chapel Compiler** +Daniel Fedorin, HPE + +--- + +# Terms + +* What are **formal methods**? + * Techniques rooted in computer science and mathematics to specify and verify systems +* What part of the **Chapel compiler**? + * The 'Dyno' compiler front-end, particularly its use/import resolution phase. + * This piece is used by the production Chapel compiler. + +--- + +# The Story + +I have a story in three parts. + +1. I found it very hard to think through a section of compiler code. + - Specifically, code that performed lookups in `use`s/`import`s + +2. I used the [Alloy Analyzer](https://alloytools.org/) to model the assumptions and behavior of the code. + - I had little background in Alloy, but some background in (formal) logic + +3. This led me to discover a bug in the compiler that I then fixed. + - Re-creating the bug required some gymanstics that were unlikely to occur in practice. + +--- + + +# Background: Chapel's Scope Lookups + +--- + +# The Humble `foo` +Imagine you see the following snippet of Chapel code: + +```chapel +foo(); +``` + +Where do you look for `foo`? The answer is quite complicated, and depends +strongly on the context of the call. + +Moreover, the order of where to look matters: method calls are preferred +over global functions, "nearer" functions are preferred over "farther" ones. + +--- + +# The Humble `foo` (example 1) + +```chapel +module M1 { + record R { + proc foo() { writeln("R.foo"); } + } + proc foo() { writeln("M1.foo"); } + + foo(); // which 'foo'? +} +``` + +Here, things are pretty straightforward: we look in scope `M1`. `R.foo` is not +in it, but `M1.foo` is. We return it. + +--- + +# The Humble `foo` (example 2) + +```chapel +module M1 { + record R {} + + proc R.foo() { writeln("R.foo"); } + proc foo() { writeln("M1.foo"); } + + foo(); // which 'foo'? +} +``` + +Here, things are bit trickier. Since we are not inside a method, we know +that `foo()` could not be a call to a method. Thus, we rule out `R.foo`, +and find `M1.foo` in `M1`. + +--- + +# The Humble `foo` (example 3) + +```chapel +module M1 { + record R {} + + proc R.foo() { writeln("R.foo"); } + proc foo() { writeln("M1.foo"); } + + proc R.someMethod() { + foo(); // which 'foo'? + } +} +``` + +* Both `R.foo` and `M1.foo` would be valid candidates. +* We give priority to methods over global functions. So, the compiler would: + * Search `R` and its scope (`M1`) for methods named `foo`. + * If that fails, search `M1` for any symbols `foo`. +* We've had to look at `M1` twice! (once for methods, once for non-methods) + +--- + +# The Humble `foo` (example 4) + +```chapel +module M1 { + record R {} + + proc foo() { writeln("R.foo"); } +} +module M2 { + use M1; + + proc R.someMethod() { + foo(); // which 'foo'? + } +} +``` + +Here, we search the scope of `R` and `M1`, but **only for public symbols**. + +--- + + +# How Chapel's Compiler Handles This + +We want to: +- Respect the priority order + - Including prefering methods over non-methods + - As a result, we search the scopes multiple times +- Avoid any extra work + - This includes redundant re-searches + - Example redundant search: looked up "all symbols", then later "all public symbols" + +```C++ +enum { PUBLIC = 1, NOT_PUBLIC = 2, METHOD_FIELD = 4, NOT_METHOD_FIELD = 8, /* ... */ }; +``` + +1. For each scope, save the flags we've already searched with +2. When searching a scope again, exclude the flags we've already searched with + +This was handled by two bitfields: `filter` and `excludeFilter`. + +--- + +# Populating `filter` and `excludeFilter` + +```C++ +if (skipPrivateVisibilities) { // depends on context of 'foo()' + filter |= IdAndFlags::PUBLIC; +} + +if (onlyMethodsFields) { + filter |= IdAndFlags::METHOD_FIELD; + +} else if (!includeMethods && receiverScopes.empty()) { + filter |= IdAndFlags::NOT_METHOD; +} +``` + +```C++ +excludeFilter = previousFilter; +``` + +```C++ +// scary! +previousFilter = filter & previousFilter; +``` + +Code notes `previousFilter` is an approximation. + +--- +# Possible Problems + +* `previousFilter` is an approximation. + * For `previousFilter = PUBLIC` and `filter = METHOD_FIELD`, we get + `previousFilter = 0`, indicating no more searches should be donne. + * But we're missing private non-methods! +* However, no case we knew of hit this combination of searches, or any like it. + * All of our language tests passed. + * Code seemed to work. +* If only there was a way I could get a computer to check whether such a combination + could occur... + +--- + + +# Formal Methods + +--- +# Types of Formal Methods + +- Model checking involves formally describing the behavior of a system, then having a solver check whether other desired properties hold. + - Alloy is an example of a model checker. + - TLA is another famous example. +- Theorem proving is a heavier weight approach that involves building a formal proof of correctness. + - Coq and Isabelle are examples of theorem provers. +--- + +# Types of Formal Methods + +- Model checking involves formally describing the behavior of a system, then having a solver check whether other desired properties hold. + - Alloy is an example of a model checker. + - TLA is another famous example. +- Theorem proving is a heavier weight approach that involves building a formal proof of correctness. + - Coq and Isabelle are examples of theorem provers. + + + +**Reason**: I was in the middle of developing compiler code. I wanted to sketch +the assumptions I was making and see if they held up. + +--- + +# A Primer on Logic + +Model checkers like Alloy are rooted in temporal logic, which builds on +first-order logic. This includes: + +- Variables (e.g. $x$, $y$) + - These represent any objects in the logical system. +- Predicates (e.g. $P(x)$, $Q(x,y)$) + - These represent properties of objects, or relationships between objects. +- Logical connectives (e.g. $\land$, $\lor$, $\neg$, $\Rightarrow$) + - These are used to combine predicates into more complex statements. + - $\land$ is "and", $\lor$ is "or", $\neg$ is "not", $\Rightarrow$ is "implies". +- Quantifiers (e.g. $\forall$, $\exists$) + - $\forall x. P(x)$ (in Alloy: `all x { P(x) }`) means "for all $x$, $P(x)$ is true". + - $\exists x. P(x)$ (in Alloy: `some x { P(x)}`) means "there exists an $x$ such that $P(x)$ is true". + +--- + +# A Primer on Logic (example) + +Example statement: "Bob has a son who likes all compilers". + +$$ +\exists x. (\text{Son}(x, \text{Bob}) \land \forall y. (\text{Compiler}(y) \Rightarrow \text{Likes}(x, y))) +$$ + +In Alloy: + +```alloy +some x { Son[x, Bob] and all y { Compiler[y] implies Likes[x, y] } } +``` + +--- + +# A Primer on Temporal Logic + +Temporal logic provides additional operators to reason about how properties change over time. + +- $\Box p$ (in Alloy: `always p`): A statement that is always true. +- $\Diamond p$ (in Alloy: `eventually p`) : A statement that will be true at some point in the future. + +In Alloy specifically, we can mention the next state of a variable using `'`. + +```alloy +// pseudocode: +// the next future value of previousFilter will be the intersection of filter +// and the current value +previousFilter' = filter & previousFilter; +``` + +--- + +# A Primer on Temporal Logic (example) + +Some examples: + +$$ +\Box(\text{like charges repel}) +$$ +$$ +\Diamond(\text{the sun is in the sky}) +$$ + +In Alloy: + +```alloy +// likeChargesRepel and theSunIsInTheSky are predicates defined elsewhere + +always likeChargesRepel + +// good thing it's not `always` +eventually theSunIsInTheSky +``` + +--- + +# Search Configuration in Alloy + +Instead of duplcating `METHOD` and `NOT_METHOD`, use two sets of flags (the regular and the "not"). + +```alloy +enum Flag {Method, MethodOrField, Public} + +sig Bitfield { + , positiveFlags: set Flag + , negativeFlags: set Flag +} + +sig FilterState { , curFilter: Bitfield } + +``` + + +__Takeaway__: We represent the search flags as a `Bitfield`, which encodes `PUBLIC`, `NOT_PUBLIC`, etc. + +--- + +# Constructing Bitfields + +Alloy doesn't allow us to define functions that somehow combine bitfields. We might want to write: + +```chapel +proc addFlag(b: Bitfield, flag: Flag): Bitfield { + return Bitfield(b.positiveFlags + flag, b.negativeFlags); +} +``` + +Instead, we can _relate_ two bitfields using a predicate. + +> This bitfield is like that bitfield, but with this flag added. + +```chapel +pred addBitfieldFlag[b1: Bitfield, b2: Bitfield, flag: Flag] { + b2.positiveFlags = b1.positiveFlags + flag + b2.negativeFlags = b1.negativeFlags +} +``` + +--- + +# Constructing Bitfields + +Alloy doesn't allow us to define functions that somehow combine bitfields. We might want to write: + +```chapel +proc addFlag(b: Bitfield, flag: Flag): Bitfield { + return Bitfield(b.positiveFlags + flag, b.negativeFlags); +} +``` + +Instead, we can _relate_ two bitfields using a predicate. + +> This bitfield is exactly like that bitfield. + +```chapel +pred bitfieldEqual[b1: Bitfield, b2: Bitfield] { + b1.positiveFlags = b2.positiveFlags and b1.negativeFlags = b2.negativeFlags +} +``` + +--- + +# Modeling Possible Searches + +Alloy isn't an imperative language. We can't mutate variables like we do in C++. Instead, we model how each statement changes the state, by relating the "current" state to the "next" state. + +

+
+ +```C++ + filter |= IdAndFlags::PUBLIC; +``` + +
+
+ +```alloy + addBitfieldFlag[filterNow, filterNext, Public] +``` + +
+
+ +This might remind you of [Hoare Logic](https://en.wikipedia.org/wiki/Hoare_logic), where statements like: + +$$ + \{ P \} \; s \; \{ Q \} +$$ + +Read as: + +> If $P$ is true before executing $s$, then $Q$ will be true after executing $s$. + +$$ + \{ \text{filter} = \text{filterNow} \} \; \texttt{filter |= PUBLIC} \; \{ \text{filter} = \text{filterNext} \} +$$ + +--- + +# Modeling Possible Searches + +To combine several statements, we make it so that the "next" state of one statement is the "current" state of the next statement. + +
+
+ +```C++ + curFilter |= IdAndFlags::PUBLIC; + curFilter |= IdAndFlags::METHOD_FIELD; +``` + +
+
+ +```alloy + addBitfieldFlag[filterNow, filterNext1, Public] + addBitfieldFlag[filterNext1, filterNext2, Method] +``` + +
+
+ +This is reminiscent of sequencing hoare triples: + +$$ + \{ P \} \; s_1 \; \{ Q \} \; s_2 \; \{ R \} +$$ + +--- + +# Modeling Possible Searches + +Finally, if C++ code has conditionals, we need to allow for the possibility of either branch being taken. We do this by using "or" on descriptions of the next state. + +
+
+ +```C++ + if (skipPrivateVisibilities) { + curFilter |= IdAndFlags::PUBLIC; + } + + + + + + + if (onlyMethodsFields) { + curFilter |= IdAndFlags::METHOD_FIELD; + } else if (!includeMethods && receiverScopes.empty()) { + curFilter |= IdAndFlags::NOT_METHOD; + } + + + +``` +
+
+ +```alloy + addBitfieldFlag[initialState.curFilter, bitfieldMiddle, Public] or + bitfieldEqual[initialState.curFilter, bitfieldMiddle] + + + + + + + + // If it's a method receiver, add method or field restriction + addBitfieldFlag[bitfieldMiddle, filterState.curFilter, MethodOrField] or + + // if it's not a receiver, filter to non-methods (could be overridden) + addBitfieldFlagNeg[bitfieldMiddle, filterState.curFilter, Method] or + + // Maybe methods are not being curFilterd but it's not a receiver, so no change. + bitfieldEqual[bitfieldMiddle, filterState.curFilter] +``` +
+
+ +Putting this into a predicate, `possibleState`, we encode what searches the compiler can undertake. + +**Takeaway**: We encoded the logic that configures possible searches in Alloy. This instructs the analyzer about possible cases to consider. + +--- + +# Modeling `previousFilter` + +So far, all we've done is encoded what queries the compiler might make about a scope. + +We still need to encode how we save the flags we've already searched with. + +Model the search state with a "global" (really, unique) variable: + +```alloy +/* Initially, no search has happeneed for a scope, so its 'previousFilter' is not set to anything. */ +one sig NotSet {} + +one sig SearchState { + , var previousFilter: Bitfield + NotSet +} +``` + +Above, `+` is used for union. `previousFilter` can either be a `Bitfield` or `NotSet`. + +--- + +# Modeling `previousFilter` + +If no previous search has happened, we set `previousFilter` to the current `filter`. + +Otherwise, we set `previousFilter` to the intersection of `filter` and `previousFilter`, as mentioned before. + +
+
+ +```C++ + if (hasPrevious) { + previousFilter = filter & previousFilter; + } else { + previousFilter = filter; + } +``` + +
+
+ +```alloy + pred update[toSet: Bitfield + NotSet, setTo: FilterState] { + toSet' != NotSet and bitfieldIntersection[toSet, setTo.include, toSet'] + } + + pred updateOrSet[toSet: Bitfield + NotSet, setTo: FilterState] { + (toSet = NotSet and toSet' = setTo.include) or + (toSet != NotSet and update[toSet, setTo]) + } +``` + +
+
+ +--- + +# Putting it Together + +We now have a model of what our C++ program is doing: it computes some set of filter flags, then runs a search, excluding the previous flags. It then updates the previous flags with the current search. We can encode +this as follows: + +``` +fact step { + always { + // Model that a new doLookupInScope could've occurred, with any combination of flags. + all searchState: SearchState { + some fs: FilterState { + // This is a possible combination of lookup flags + possibleState[fs] + + // If a search has been performed before, take the intersection; otherwise, + // just insert the current filter flags. + updateOrSet[searchState.previousFilter, fs] + } + } + } +} +``` + +--- +# Are there any bugs? + +Model checkers ensure that all properties we want to hold, do hold. To find a counter example, we ask it to prove the negation of what we want. + +```C +wontFindNeeded: run { + all searchState: SearchState { + eventually some props: Props, fs: FilterState, fsBroken: FilterState { + // Some search (fs) will cause a transition / modification of the search state... + configureState[fs] + updateOrSet[searchState.previousFilter, fs] + // Such that a later, valid search... (fsBroken) + configureState[fsBroken] + + // Will allow for a set of properties... + // ... that are left out of the original search... + not bitfieldMatchesProperties[searchState.previousFilter, props] + // ... and out of the current search + not (bitfieldMatchesProperties[fs.include, props] and not bitfieldMatchesProperties[searchState.previousFilter, props]) + // But would be matched by the broken search... + bitfieldMatchesProperties[fsBroken.include, props] + // ... to not be matched by a search with the new state: + not (bitfieldMatchesProperties[fsBroken.include, props] and not bitfieldOrNotSetMatchesProperties[searchState.previousFilter', props]) + } + } +} +``` + +--- +# Uh-Oh! + +![](./instancefound.png) + +--- +# The Bug + +![bg left width:600px](./bug.png) + +We need some gymnastics to figure out what varibles make this model possible. + +Alloy has a nice visualizer, but it has a lot of information. + +In the interest of time, I found: + +* If the compiler searches a scope firt for `PUBLIC` symbols, ... +* ...then for `METHOD_OR_FIELD`, ... +* ...then for any symbols, they will miss things! + +--- + + +# The Reproducer +To trigger this sequence of searches, we needed a lot more gymnastics. + +
+
+ +```chapel +module TopLevel { + module XContainerUser { + public use TopLevel.XContainer; + } + module XContainer { + private var x: int; + record R {} + module MethodHaver { + use TopLevel.XContainerUser; + use TopLevel.XContainer; + proc R.foo() { + var y = x; + } + } + } +} +``` +
+
+ +* the scope of `R` is searched with for methods +* The scope of `R`’s parent (`XContainer`) is searched for methods +* The scope of `XContainerUser` is searched for public symbols (via the `use`) +* The scope of `XContainer` is searched with public symbols (via the `public use`) +* The scope of `XContainer` searched for with no filters via the second use; but the stored filter is bad, so the lookup returns early, not finding `x`. + +
+
diff --git a/type-level/abstract.txt b/type-level/abstract.txt new file mode 100644 index 0000000..781c219 --- /dev/null +++ b/type-level/abstract.txt @@ -0,0 +1,32 @@ +Chapel’s type system can be surprisingly powerful. In addition to “usual” +features such as generics and polymorphism, Chapel provides the ability to +manipulate types using functions; this involves both taking types as arguments +to functions and returning them from these functions. This can enable powerful +programming techniques that are typically confined to the domain of +metaprogramming. + +For example, although Chapel’s notion of compile-time values — ‘param’s — is +limited to primitive types such as integers, booleans, and strings, one can +encode compile-time lists of these values as types. Such encodings can be used +to create compile-time specializations of functions that would be otherwise +tedious to write by hand. One use case for such specializations is the +implementation of a family of functions for approximating differential +equations, the Adams-Bashforth methods. Some variants of these methods can be +encoded as lists of coefficients. Thus, it becomes possible to define a single +function that accepts a type-level list of coefficients and produces a +“stamped out” implementation of the corresponding method. This reduces the +need to implement each method explicitly by hand. Another use case of function +specialization is a type-safe ‘printf’ function that validates that users’ +format specifiers match the type of arguments to the function. + +More generally, Chapel’s types can be used to encode algebraic sums (disjoint +unions) and products (Cartesian) of types. This, in turn, makes it possible to +build arbitrary data structures at the type level. The lists-of-values case +above is an instance of this general principle. Functions can be defined on +type-level data structures by relying on overloading and type arguments. +Programming in this manner starts to resemble programming in a purely +functional language such as Haskell. + +Though this style of programming has not seen much use thus far, it can be a +powerful technique for controlling types of arguments or constructing highly +customized functions with no runtime overhead. diff --git a/type-level/slides.md b/type-level/slides.md new file mode 100644 index 0000000..0ca3d09 --- /dev/null +++ b/type-level/slides.md @@ -0,0 +1,979 @@ +--- +theme: gaia +title: Type-Level Programming in Chapel for Compile-Time Specialization +backgroundColor: #fff +--- + + + +# **Type-Level Programming in Chapel for Compile-Time Specialization** +Daniel Fedorin, HPE + +--- + +# Compile-Time Programming in Chapel + +* **Type variables**, as their name suggests, store types instead of values. + + ```Chapel + type myArgs = (int, real); + ``` + +* **Procedures with `type` return intent** can construct new types. + + ```Chapel + proc toNilableIfClassType(type arg) type do + if isNonNilableClassType(arg) then return arg?; else return arg; + ``` +* **`param` variables** store values that are known at compile-time. + + ```Chapel + param numberOfElements = 3; + var threeInts: numberOfElements * int; + ``` +* **Compile-time conditionals** are inlined at compile-time. + + ```Chapel + if false then somethingThatWontCompile(); + ``` + +--- + +# Restrictions on Compile-Time Programming + +* Compile-time operations do not have mutable state. + - Cannot change values of `param` or `type` variables. +* Chapel's compile-time programming does not support loops. + - `param` loops are kind of an aception, but are simply unrolled. + - Without mutability, this unrolling doesn't give us much. +* Without state, our `type` and `param` functions are pure. + +--- + +# Did someone say "pure"? + +I can think of another language that has pure functions... + +* :white_check_mark: Haskell doesn't have mutable state by default. +* :white_check_mark: Haskell doesn't have imperative loops. +* :white_check_mark: Haskell functions are pure. + +--- + +# Programming in Haskell + +Without mutability and loops, Haskell programmers use pattern-matching and recursion to express their algorithms. + +* Data structures are defined by enumerating their possible cases. A list is either empty, or a head element followed by a tail list. + + ```Haskell + data ListOfInts = Nil | Cons Int ListOfInts + + -- [] = Nil + -- [1] = Cons 1 Nil + -- [1,2,3] = Cons 1 (Cons 2 (Cons 3 Nil)) + ``` +* Pattern-matching is used to examine the cases of a data structure and act accordingly. + + ```Haskell + sum :: ListOfInts -> Int + sum Nil = 0 + sum (Cons i tail) = i + sum tail + ``` + +--- + +# Evaluating Haskell + +Haskell simplifies calls to functions by pickign the case based on the arguments. + +```Haskell +sum (Cons 1 (Cons 2 (Cons 3 Nil))) + +-- case: sum (Cons i tail) = i + sum tail += 1 + sum (Cons 2 (Cons 3 Nil)) + +-- case: sum (Cons i tail) = i + sum tail += 1 + (2 + sum (Cons 3 Nil)) + +-- case: sum (Cons i tail) = i + sum tail += 1 + (2 + (3 + sum Nil)) + +-- case: sum Nil = 0 += 1 + (2 + (3 + 0)) + += 6 +``` + +--- + +# A Familiar Pattern + +Picking a case based on the arguments is very similar to Chapel's function overloading. + +* **A very familiar example**: + ```Chapel + proc foo(x: int) { writeln("int"); } + proc foo(x: real) { writeln("real"); } + foo(1); // prints "int" + ``` +* **A slightly less familiar example**: + ```Chapel + proc foo(type x: int) { compilerWarning("int"); } + proc foo(type x: real) { compilerWarning("real"); } + foo(int); // compiler prints "int" + ``` + +--- + +# A Type-Level List + +Hypothesis: we can use Chapel's function overloading and types to write functional-ish programs. + +
+
+ +```Chapel +record Nil {} +record Cons { param head: int; type tail; } + + +type myList = Cons(1, Cons(2, Cons(3, Nil))); + + + +proc sum(type x: Nil) param do return 0; +proc sum(type x: Cons(?i, ?tail)) param do return i + sum(tail); + +compilerWarning(sum(myList) : string); // compiler prints 6 +``` +
+
+ +```Haskell +data ListOfInts = Nil + | Cons Int ListOfInts + + +myList = Cons 1 (Cons 2 (Cons 3 Nil)) + + +sum :: ListOfInts -> Int +sum Nil = 0 +sum (Cons i tail) = i + sum tail + + +``` +
+
+ +--- + +# Type-Level Programming at Compile-Time + +After resolution, our original program: + +```Chapel +record Nil {} +record Cons { param head: int; type tail; } + +type myList = Cons(1, Cons(2, Cons(3, Nil))); + +proc sum(type x: Nil) param do return 0; +proc sum(type x: Cons(?i, ?tail)) param do return i + sum(tail); + +writeln(sum(myList) : string); // compiler prints 6 +``` + +Becomes: + +```Chapel +writeln("6"); +``` + +There is no runtime overhead! + +--- + +# Type-Level Programming at Compile-Time + +> Why would I want to do this?! +> +> \- You, probably + +* Do you want to write parameterized code, without paying runtime overhead for the runtime parameters? + - **Worked example**: linear multi-step method approximator +* Do you want to have powerful compile-time checks and constraints on your function types? + - **Worked example**: type-safe `printf` function + +--- + + +# Linear Multi-Step Method Approximator + +--- + +# Euler's Method + +A first-order differential equation can be written in the following form: + +$$ +y' = f(t, y) +$$ + +In other words, the derivative of of $y$ depends on $t$ and $y$ itself. There is no solution to this equation in general; we have to approximate. + +If we know an initial point $(t_0, y_0)$, we can approximate other points. To get the point at $t_1 = t_0 + h$, we can use the formula: + +$$ +\begin{align*} +y'(t_0) & = f(t_0, y_0) \\ +y(t_0+h) & \approx y_0 + h \times y'(t_0) \\ + & \approx y_0 + h \times f(t_0, y_0) +\end{align*} +$$ + +We can name the the first approximated $y$-value $y_1$, and set it: + +$$ +y_1 = y_0 + h \times f(t_0, y_0) +$$ + +--- + +# Euler's Method + +On the previous slide, we got a new point $(t_1, y_1)$. We can repeat the process to get $y_2$: + +$$ +\begin{array}{c} +y_2 = y_1 + h \times f(t_1, y_1) \\ +y_3 = y_2 + h \times f(t_2, y_2) \\ +y_4 = y_3 + h \times f(t_3, y_3) \\ +\cdots \\ +y_{n+1} = y_n + h \times f(t_n, y_n) \\ +\end{array} +$$ + +--- + +# Euler's Method in Chapel + +This can be captured in a simple Chapel procedure: + +```Chapel +proc runEulerMethod(step: real, count: int, t0: real, y0: real) { + var y = y0; + var t = t0; + for i in 1..count { + y += step*f(t,y); + t += step; + } + return y; +} +``` + +--- + +# Other Methods + +* In Euler's method, we look at the slope of a function at a particular point, and use it to extrapolate the next point. +* Once we've computed a few points, we have more information we can incorporate. + - When computing $y_2$, we can use both $y_0$ and $y_1$. + - To get a good approximation, we have to weight the points differently. + $$ + y_{n+2} = y_{n+1} + h \left(\frac{3}{2}f(t_{n+1}, y_{n+1}) - \frac{1}{2}f(t_{n}, y_{n})\right) + $$ + + - More points means better accuracy, but more computation. + +* There are other methods that use more points and different weights. + - Another method is as follows: + $$ + y_{n+3} = y_{n+2} + h \left(\frac{23}{12}f(t_{n+2}, y_{n+2}) - \frac{16}{12}f(t_{n+1}, y_{n+1}) + \frac{5}{12}f(t_{n}, y_{n})\right) + $$ + +--- + +# Generalizing Multi-Step Methods + +Explicit Adams-Bashforth methods in general can be encoded as the coefficients used to weight the previous points. + +| Method | Equation | Coefficient List +|---------------------------|--------------------------------------|----------------- +| Euler's method | $y_{n+1} = y_n + h \times f(t_n, y_n)$ | $1$ +| Two-step A.B. | $y_{n+2} = y_{n+1} + h \left(\frac{3}{2}f(t_{n+1}, y_{n+1}) - \frac{1}{2}f(t_{n}, y_{n})\right)$ | $\frac{3}{2},-\frac{1}{2}$ + +--- + +# Generalizing Multi-Step Methods + +Explicit Adams-Bashforth methods in general can be encoded as the coefficients used to weight the previous points. + +| Method | Equation | Chapel Type Expression +|---------------------------|--------------------------------------|----------------- +| Euler's method | $y_{n+1} = y_n + h \times f(t_n, y_n)$ | `Cons(1,Nil)` +| Two-step A.B. | $y_{n+2} = y_{n+1} + h \left(\frac{3}{2}f(t_{n+1}, y_{n+1}) - \frac{1}{2}f(t_{n}, y_{n})\right)$ | `Cons(3/2,Cons(-1/2, Nil))` + +--- + +# Supporting Functions for Coefficient Lists + +```Chapel +proc length(type x: Cons(?w, ?t)) param do return 1 + length(t); +proc length(type x: Nil) param do return 0; + +proc coeff(param x: int, type lst: Cons(?w, ?t)) param where x == 0 do return w; +proc coeff(param x: int, type lst: Cons(?w, ?t)) param where x > 0 do return coeff(x-1, t); +``` + +--- + +# A General Solver + +```Chapel +proc runMethod(type method, h: real, count: int, start: real, + in ys: real ... length(method)): real { +``` + +* `type method` accepts a type-level list of coefficients. +* `h` encodes the step size. +* `start` is $t_0$, the initial time. +* `count` is the number of steps to take. +* `in ys` makes the function accept as many `real` values (for $y_0, y_1, \ldots$) as there are weights + +--- + +# A General Solver + +```Chapel +param coeffCount = length(method); +// Repeat the methods as many times as requested +for i in 1..count { + // We're computing by adding h*b_j*f(...) to y_n. + // Set total to y_n. + var total = ys(coeffCount - 1); + // 'for param' loops are unrolled at compile-time -- this is just + // like writing out each iteration by hand. + for param j in 1..coeffCount do + // For each coefficient b_j given by coeff(j, method), + // increment the total by h*bj*f(...) + total += step * coeff(j, method) * + f(start + step*(i-1+coeffCount-j), ys(coeffCount-j)); + // Shift each y_i over by one, and set y_{n+s} to the + // newly computed total. + for param j in 0..< coeffCount - 1 do + ys(j) = ys(j+1); + ys(coeffCount - 1) = total; +} +// return final y_{n+s} +return ys(coeffCount - 1); +``` + +--- + +# Using the General Solver + + +```Chapel +type euler = cons(1.0, empty); +type adamsBashforth = cons(3.0/2.0, cons(-0.5, empty)); +type someThirdMethod = cons(23.0/12.0, cons(-16.0/12.0, cons(5.0/12.0, empty))); +``` + +Take a simple differential equation $y' = y$. For this, define `f` as follows: + +```Chapel +proc f(t: real, y: real) do return y; +``` + +Now, we can run Euler's method like so: + +```Chapel +writeln(runMethod(euler, step=0.5, count=4, start=0, 1)); // 5.0625 +``` + +To run the 2-step Adams-Bashforth method, we need two initial values: + +```Chapel +var y0 = 1.0; +var y1 = runMethod(euler, step=0.5, count=1, start=0, 1); +writeln(runMethod(adamsBashforth, step=0.5, count=3, start=0.5, y0, y1)); // 6.02344 +``` + +--- + +# The General Solver + +We can now construct solvers for any explicit Adams-Bashforth method, without writing any new code. + +--- + + + +# Type-Safe `printf` + +--- + +# The `printf` Function + +The `printf` function accepts a format string, followed by a variable number of arguments that should match: + +```C +// totally fine: +printf("Hello, %s! Your ChapelCon submission is #%d\n", "Daniel", 18); + +// not good: +printf("Hello, %s! Your ChapelCon submission is #%d\n", 18, "Daniel"); +``` + +Can we define a `printf` function in Chapel that is type-safe? + +--- + +# Yet Another Type-Level List + +- The general idea for type-safe `printf`: take the format string, and extract a list of the expected argument types. + +- To make for nicer error messages, include a human-readable description of each type in the list. + +- I've found it more convenient to re-define lists for various problems when needed, rather than having a single canonical list definition. + +```chapel +record _nil { + proc type length param do return 0; +} +record _cons { + type expectedType; // type of the argument to printf + param name: string; // human-readable name of the type + type rest; + + proc type length param do return 1 + rest.length(); +} +``` + +--- + +# Extracting Types from Format Strings + +```Chapel +proc specifiers(param s: string, param i: int) type { + if i >= s.size then return _nil; + + if s[i] == "%" { + if i + 1 >= s.size then + compilerError("Invalid format string: unterminted %"); + + select s[i + 1] { + when "%" do return specifiers(s, i + 2); + when "s" do return _cons(string, "a string", specifiers(s, i + 2)); + when "i" do return _cons(int, "a signed integer", specifiers(s, i + 2)); + when "u" do return _cons(uint, "an unsigned integer", specifiers(s, i + 2)); + when "n" do return _cons(numeric, "a numeric value", specifiers(s, i + 2)); + otherwise do compilerError("Invalid format string: unknown format type"); + } + } else { + return specifiers(s, i + 1); + } +} +``` + +--- + +# Extracting Types from Format Strings + +Let's give it a quick try: + +```Chapel +writeln(specifiers("Hello, %s! Your ChapelCon submission is #%i\n", 0) : string); +``` + +The above prints: + +```Chapel +_cons(string,"a string",_cons(int(64),"a signed integer",_nil)) +``` + +--- + +# Validating Argument Types + +* The Chapel standard library has a nice `isSubtype` function that we can use to check if an argument matches the expected type. + +* Suppose the `.length` of our type specifiers matches the number of arguments to `printf` + +* Chapel doesn't currently support empty tuples, so if the lengths match, we know that `specifiers` is non-empty. + +* Then, we can validate the types as follows: + ```Chapel + proc validate(type specifiers: _cons(?t, ?s, ?rest), type argTup, param idx) { + if !isSubtype(argTup[idx], t) then + compilerError("Argument " + (idx + 1) : string + " should be " + s + " but got " + argTup[idx]:string, idx+2); + + if idx + 1 < argTup.size then + validate(rest, argTup, idx + 1); + } + ``` + +* The `idx+2` argument to `compilerError` avoids printing the recursive `validate` calls in the error message. + +--- + +# The `fprintln` overloads + +* I named it `fprintln` for "formatted print line". + +* To support the empty-specifier case (Chapel varargs don't allow zero arguments): + + ```Chapel + proc fprintln(param format: string) where specifiers(format, 0).length == 0 { + writeln(format); + } + ``` +* If we do have type specifiers, to ensure our earlier assumption of `size` matching: + ```Chapel + proc fprintln(param format: string, args...) + where specifiers(format, 0).length != args.size { + compilerError("'fprintln' with this format string expects " + + specifiers(format, 0).length : string + + " argument(s) but got " + args.size : string); + } + ``` + +--- + +# The `fprintln` overloads + +* All that's left is the main `fprintln` implementation: + + ```Chapel + proc fprintln(param format: string, args...) { + validate(specifiers(format, 0), args.type, 0); + + writef(format + "\n", (...args)); + } + ``` + +--- + +# Using `fprintln` + +```Chapel +fprintln("Hello, world!"); // fine, prints "Hello, world!" +fprintln("The answer is %i", 42); // fine, prints "The answer is 42" + +// compiler error: Argument 3 should be a string but got int(64) +fprintln("The answer is %i %i %s", 1, 2, 3); +``` + +More work could be done to support more format specifiers, escapes, etc., but the basic idea is there. + +--- + + + +# Beyond Lists + +--- + +# Beyond Lists + +* I made grand claims earlier + - "Write functional-ish program at the type level!" +* So far, we've just used lists and some recursion. +* Is that all there is? + +--- + +# Algebraic Data Types + +* The kinds of data types that Haskell supports are called *algebraic data types*. +* At a fundamental level, they can be built up from two operations: _cartesian product_ and _disjoint union_. +* There are other concepts to build recursive data types, but we won't need them in Chapel. + - To prove to you I know what I'm talking about, some jargon: + _initial algebras_, _the fixedpoint functor_, _catamorphisms_... + - Check out _Bananas, Lenses, Envelopes and Barbed Wire_ by Meijer et al. for more. +* __This matters because, if Chapel has these operations, we can build any data type that Haskell can.__ + +--- + + + +# Algebraic Data Types + +- The kinds of data types that Haskell supports are called *algebraic data types*. +- At a fundamental level, they can be built up from two operations: _cartesian product_ and _disjoint union_. +- There are other concepts to build recursive data types, but we won't need them in Chapel. + - To prove to you I know what I'm talking about, some jargon: + _initial algebras_, _the fixedpoint functor_, _catamorphisms_... + - Check out _Bananas, Lenses, Envelopes and Barbed Wire_ by Meijer et al. for more. +- __This matters because, if Chapel has these operations, we can build any data type that Haskell can.__ + +--- + +# Cartesian Product +For any two types, the _cartesian product_ of these two types defines all pairs of values from these types. + - This is like a two-element tuple _at the value level_ in Chapel. + - We write this as $A \times B$ for two types $A$ and $B$. + - In (type-level) Chapel and Haskell: +
+
+ + ```Chapel + record Pair { + type fst; + type snd; + } + + type myPair = Pair(myVal1, myVal2); + ``` +
+
+ + ```Haskell + data Pair = MkPair + { fst :: A + , snd :: B + } + + myPair = MkPair myVal1 myVal2 + ``` +
+
+ +--- + +# Disjoint Union +For any two types, the _disjoint union_ of these two types defines values that are either from one type or the other. + - This is _almost_ like a `union` in Chapel or C... + - But there's extra information to tell us which of the two types the value is from. + - We write this as $A + B$ for two types $A$ and $B$. + - In Chapel and Haskell: +
+
+ + ```Chapel + + record InL { type value; } + record InR { type value; } + + type myFirstCase = InL(myVal1); + type mySecondCase = InR(myVal2); + ``` +
+
+ + ```Haskell + data Sum + = InL A + | InR B + + myFirstCase = InL myVal1 + mySecondCase = InR myVal2 + ``` +
+
+ +--- + +# Algebraic Data Types + +* We can build up more compelx types by combining these two operations. + * Need a triple of types $A$, $B$, and $C$? Use $A \times (B \times C)$. + * Similarly, "any one of three types" can be expressed as $A + (B + C)$. + * A `Result` type (in Rust, or `optional` in C++) is $T + \text{Unit}$. + * `Unit` is a type with a single value (there's only one `None` / `std::nullopt`). + +* Notice that in Chapel, we moved up one level + | Thing | Chapel | Haskell | + |-------|------------------|-------------------| + | `Nil` | type | value | + | `Cons`| type constructor | value constructor | + | List | **???** | type | + +--- + +# Algebraic Data Types + +* Since Chapel has no notion of a type-of-types, we can't enforce that our values are _only_ `InL` or `InR` (in the case of `Sum`). +* This is why, in Chapel versions, type annotations like `A` and `B` are missing. +
+
+ + ```Chapel + record Pair { + type fst; /* : A */ + type snd; /* : B */ + } + ``` +
+
+ + ```Haskell + data Pair = MkPair + { fst :: A + , snd :: B + } + ``` +
+
+* So, we can't enforce that the user doesn't pass `int` to our `length` function defined on lists. +* We also can't enforce that `InL` is instantiated with the right type. +* So, we lose some safety compare to Haskell... +* ...but we're getting the compiler to do arbitrary computations for us at compile-time. + +--- + +# Worked Example: Binary Search Tree + +In Haskell, binary search trees can be defined as follows: + +```Haskell +data BSTree = Empty + | Node Int BSTree BSTree + +balancedOneTwoThree = Node 2 (Node 1 Empty Empty) (Node 3 Empty Empty) +``` + +Written using Algebraic Data Types, this is: + +$$ +\text{BSTree} = \text{Unit} + (\text{Int} \times \text{BSTree} \times \text{BSTree}) +$$ + +In Haskell (using sums and products): + +```Haskell +type BSTree' = Unit `Sum` (Int `Pair` (BSTree' `Pair` BSTree')) + +balancedOneTwoThree' = InR (2 `MkPair` (InR (1 `MkPair` (InL MkUnit `MkPair` InL Unit)) `MkPair` + InR (3 `MkPair` (InL MkUnit `MkPair` InL Unit)))) +``` + +--- + +# Worked Example: Binary Search Tree + +* Recalling the Haskell version: + + ```Haskell + type BSTree' = Unit `Sum` (Int `Pair` (BSTree' `Pair` BSTree')) + + balancedOneTwoThree' = InR (2 `MkPair` (InR (1 `MkPair` (InL MkUnit `MkPair` InL Unit)) `MkPair` + InR (3 `MkPair` (InL MkUnit `MkPair` InL Unit)))) + ``` + +* We can't define `BSTree'` in Chapel (no type-of-types), but we can define `balancedOneTwoThree'`: + + ```Chapel + type balancedOneTwoThree = + InR(Pair(2, Pair(InR(Pair(1, Pair(InL(), InL()))), + InR(Pair(3, Pair(InL(), InL())))))); + ``` + +* :white_check_mark: We can use algebraic data types to build arbitrarily complex data structures ◼. + +--- + +# Returning to Pragmatism + +* We could've defined our list type in terms of `InL`, `InR`, and `Pair`. +* However, it was cleaner to make it look more like the non-ADT Haskell version. +* Recall that it looked like this: +
+
+ + ```Chapel + record Nil {} + record Cons { param head: int; type tail; } + + type myList = Cons(1, Cons(2, Cons(3, Nil))); + ``` +
+
+ + ```Haskell + data ListOfInts = Nil + | Cons Int ListOfInts + + myList = Cons 1 (Cons 2 (Cons 3 Nil)) + ``` +
+
+* We can do the same thing for our binary search tree: + +
+
+ + ```Chapel + record Empty {} + record Node { param value: int; type left; type right; } + + type balancedOneTwoThree = Node(2, Node(1, Empty, Empty), + Node(3, Empty, Empty)); + ``` +
+
+ + ```Haskell + data BSTree = Empty + | Node Int BSTree BSTree + + balancedOneTwoThree = Node 2 (Node 1 Empty Empty) + (Node 3 Empty Empty) + ``` +
+
+ +--- + +# A General Recipe + +To translate a Haskell data type definition to Chapel: + +* For each constructor, define a `record` with that constructor's name +* The fields of that record are `type` fields for each argument of the constructor + - If the argument is a value (like `Int`), you can make it a `param` field instead +* A visual example, again: + +
+
+ + ```Chapel + record C1 { type arg1; /* ... */ type argi; } + // ... + record Cn { type arg1; /* ... */ type argj; } + ``` +
+
+ + ```Haskell + data T = C1 arg1 ... argi + | ... + | Cn arg1 ... argj + ``` +
+
+ +--- + +# Inserting and Looking Up in a BST + +
+
+ +```Chapel + +proc insert(type t: Empty, param x: int) type do return Node(x, Empty, Empty); +proc insert(type t: Node(?v, ?left, ?right), param x: int) type do + select true { + when x < v do return Node(v, insert(left, x), right); + otherwise do return Node(v, left, insert(right, x)); + } + +type test = insert(insert(insert(Empty, 2), 1), 3); + + + +proc lookup(type t: Empty, param x: int) param do return false; +proc lookup(type t: Node(?v, ?left, ?right), param x: int) param do + select true { + when x == v do return true; + when x < v do return lookup(left, x); + otherwise do return lookup(right, x); + } +``` +
+
+ +```Haskell +insert :: Int -> BSTree -> BSTree +insert x Empty = Node x Empty Empty +insert x (Node v left right) + + | x < v = Node v (insert x left) right + | otherwise = Node v left (insert x right) + + +test = insert 3 (insert 1 (insert 2 Empty)) + + +lookup :: Int -> BSTree -> Bool +lookup x Empty = False +lookup x (Node v left right) + + | x == v = True + | x < v = lookup x left + | otherwise = lookup x right + +``` +
+
+ +It really works! + +```Chapel +writeln(test : string); +// prints Node(2,Node(1,Empty,Empty),Node(3,Empty,Empty)) + +writeln(lookup(test, 1)); +// prints true for this one, but false for '4' +``` + +--- + +# A Key-Value Map +```Chapel +record Empty {} +record Node { param key: int; param value; type left; type right; } + +proc insert(type t: Empty, param k: int, param v) type do return Node(k, v, Empty, Empty); +proc insert(type t: Node(?k, ?v, ?left, ?right), param nk: int, param nv) type do + select true { + when nk < k do return Node(k, v, insert(left, nk, nv), right); + otherwise do return Node(k, v, left, insert(right, nk, nv)); + } + +proc lookup(type t: Empty, param k: int) param do return "not found"; +proc lookup(type t: Node(?k, ?v, ?left, ?right), param x: int) param do + select true { + when x == k do return v; + when x < k do return lookup(left, x); + otherwise do return lookup(right, x); + } + +type test = insert(insert(insert(Empty, 2, "two"), 1, "one"), 3, "three"); +writeln(lookup(test, 1)); // prints "one" +writeln(lookup(test, 3)); // prints "three" +writeln(lookup(test, 4)); // prints "not found" +``` + +--- + +# Conclusion + +* Chapel's type-level programming is surprisingly powerful. +* We can write compile-time programs that are very similar to Haskell programs. +* This allows us to write highly parameterized code without paying runtime overhead. +* This also allows us to devise powerful compile-time checks and constraints on our code. +* This approach allows for general-purpose programming, which can be applied to `your use-case`