Demonstration venue · read-only. Every page can be browsed; the buttons that would change it are switched off. Create an account to run TaxoReview on your own data. A simulation from public publication records: the people listed were not invited and did not agree to review.
? Tutorial for this page

Michael D. Adams 0001

dblp:37/3316-1 · DBLP profile ↗
← Back
20ranked-venue papers
11as first author
1since 2021 · last 2025
0000-0003-3160-6972ORCID · conflict

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 19 · 11 first-author · 1 since 2021Systems, architecture and hardware · 1

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
5 papers
Programming languages and type systems · 86% Program analysis · 9% Compilers and program optimization · 4%
Theoretical computer science
2 papers
Automata and formal languages · 95% Computational complexity · 5%
Computer architecture, parallel and distributed computing, and storage systems
1 paper
Distributed systems · 100%

Topics — the 18 heaviest of 19, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Programming languages and type systems › type checking
bidirectional type checking
0.912025
Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus · Proc. ACM Program. Lang. 2025
Programming languages and type systems › programming environment
structure editors
0.912025
Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus · Proc. ACM Program. Lang. 2025
Programming languages and type systems
type systems
0.912025
Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus · Proc. ACM Program. Lang. 2025
Program analysis
control flow analysis
0.422016
Pushdown control-flow analysis for free · POPL 2016
Flow-sensitive type recovery in linear-log time · OOPSLA 2011
Automata and formal languages › parsing
ambiguity resolution
0.312017
Restricting grammars with tree automata · Proc. ACM Program. Lang. 2017
Automata and formal languages › formal grammars
context-free grammar
0.312017
Restricting grammars with tree automata · Proc. ACM Program. Lang. 2017
Automata and formal languages
tree automata
0.312017
Restricting grammars with tree automata · Proc. ACM Program. Lang. 2017
Programming languages and type systems › type systems
gradual typing
0.312025
Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus · Proc. ACM Program. Lang. 2025
Distributed systems › replication › replicated data types
conflict-free replicated data types
0.312025
Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus · Proc. ACM Program. Lang. 2025
Automata and formal languages › parsing
context-free grammar parsing
0.212016
On the complexity and performance of parsing with derivatives · PLDI 2016
Automata and formal languages › parsing › context-free grammar parsing
parsing with derivatives
0.212016
On the complexity and performance of parsing with derivatives · PLDI 2016
Programming languages and type systems › metaprogramming
macro systems
0.212015
Towards the Essence of Hygiene · POPL 2015
Compilers and program optimization
parsing
0.212013
Principled parsing for indentation-sensitive languages: revisiting landin's offside rule · POPL 2013
Programming languages and type systems
type inference
0.112011
Flow-sensitive type recovery in linear-log time · OOPSLA 2011
Programming languages and type systems › program manipulation
continuation-passing style
0.112016
Pushdown control-flow analysis for free · POPL 2016
Programming languages and type systems
higher-order languages
0.112016
Pushdown control-flow analysis for free · POPL 2016
Computational complexity › language complexity
parsing complexity
0.112016
On the complexity and performance of parsing with derivatives · PLDI 2016
Runtime systems and virtual machines › dynamic compilation
just-in-time compilation
0.012011
Flow-sensitive type recovery in linear-log time · OOPSLA 2011

Methods — techniques the papers use, named apart from their topics

unification-based type inference · 1.7bidirectional marking · 1.7CmRDT · 1.7tree automata intersection · 0.3state-dependent allocation · 0.2performance evaluation · 0.2complexity analysis · 0.2abstract interpretation · 0.2PDCFA · 0.2CFA2 · 0.2AAC · 0.2lexical scope · 0.2alpha-equivalence · 0.2
YearPublicationVenuePosition
2025 Grove: A Bidirectionally Typed Collaborative Structure Editor Calculus
abstract
Version control systems typically rely on a patch language , heuristic patch synthesis algorithms like diff , and three-way merge algorithms . Standard patch languages and merge algorithms often fail to identify conflicts correctly when there are multiple edits to one line of code or code is relocated. This paper introduces Grove, a collaborative structure editor calculus that eliminates patch synthesis and three-way merge algorithms entirely. Instead, patches are derived directly from the log of the developer’s edit actions and all edits commute, i.e. the repository state forms a commutative replicated data type (CmRDT). To handle conflicts that can arise due to code relocation, the core datatype in Grove is a labeled directed multi-graph with uniquely identified vertices and edges. All edits amount to edge insertion and deletion, with deletion being permanent. To support tree-based editing, we define a decomposition from graphs into groves , which are a set of syntax trees with conflicts–including local, relocation, and unicyclic relocation conflicts–represented explicitly using holes and references between trees. Finally, we define a type error localization system for groves that enjoys a totality property, i.e. all editor states in Grove are statically meaningful, so developers can use standard editor services while working to resolve these explicitly represented conflicts. The static semantics is defined as a bidirectional marking system in line with recent work, with gradual typing employed to handle situations where errors and conflicts prevent type determination. We then layer on a unification-based type inference system to opportunistically fill type holes and fail gracefully when no solution exists. We mechanize the metatheory of Grove using the Agda theorem prover. We implement these ideas as the Grove Workbench , which generates the necessary data structures and algorithms in OCaml given a syntax tree specification.
Michael D. Adams 0001, Eric Griffis, Thomas Porter, Sundara Vishnu Satish, Eric Zhao 0006, Cyrus Omar
Proc. ACM Program. Lang.1
2020 Liberate Abstract Garbage Collection from the Stack by Decomposing the Heap
abstract
Abstract Abstract garbage collection and the use of pushdown systems each enhance the precision of control-flow analysis (CFA). However, their respective needs conflict: abstract garbage collection requires the stack but pushdown systems obscure it. Though several existing techniques address this conflict, none take full advantage of the underlying interplay. In this paper, we dissolve this conflict with a technique which exploits the precision of pushdown systems to decompose the heap across the continuation.This technique liberates abstract garbage collection from the stack, increasing its effectiveness and the compositionality of its host analysis. We generalize our approach to apply compositional treatment to abstract timestamps which induces the context abstraction of m-CFA, an abstraction more precise than k-CFA’s for many common programming patterns.
Kimball Germane, Michael D. Adams 0001
ESOP2
2020 Parsing with zippers (functional pearl)
abstract
Parsing with Derivatives (PwD) is an elegant approach to parsing context-free grammars (CFGs). It takes the equational theory behind Brzozowski's derivative for regular expressions and augments that theory with laziness, memoization, and fixed points. The result is a simple parser for arbitrary CFGs. Although recent work improved the performance of PwD, it remains inefficient due to the algorithm repeatedly traversing some parts of the grammar. In this functional pearl, we show how to avoid this inefficiency by suspending the state of the traversal in a zipper. When subsequent derivatives are taken, we can resume the traversal from where we left off without retraversing already traversed parts of the grammar. However, the original zipper is designed for use with trees, and we want to parse CFGs. CFGs can include shared regions, cycles, and choices between alternates, which makes them incompatible with the traditional tree model for zippers. This paper develops a generalization of zippers to properly handle these additional features. Just as PwD generalized Brzozowski's derivatives from regular expressions to CFGs, we generalize Huet's zippers from trees to CFGs. Abstract The resulting parsing algorithm is concise and efficient: it takes only 31 lines of OCaml code to implement the derivative function but performs 6,500 times faster than the original PwD and 3.24 times faster than the optimized implementation of PwD.
Pierce Darragh, Michael D. Adams 0001
Proc. ACM Program. Lang.2
2019 Demand Control-Flow Analysis
Kimball Germane, Jay McCarthy, Michael D. Adams 0001, Matthew Might
VMCAI3
2018 Abstract allocation as a unified approach to polyvariance in control-flow analyses
abstract
Abstract In higher order settings, control-flow analysis aims to model the propagation of both data and control by finitely approximating program behaviors across all possible executions. The polyvariance of an analysis describes the number of distinct abstract representations, or variants, for each syntactic entity (e.g., functions, variables, or intermediate expressions). Monovariance, one of the most basic forms of polyvariance, maintains only a single abstract representation for each variable or expression. Other polyvariant strategies allow a greater number of distinct abstractions and increase analysis complexity with the aim of increasing analysis precision. For example, k -call sensitivity distinguishes flows by the most recent k call sites, k -object sensitivity by a history of allocation points, and argument sensitivity by a tuple of dynamic argument types. From this perspective, even a concrete operational semantics may be thought of as an unboundedly polyvariant analysis. In this paper, we develop a unified methodology that fully captures this design space. It is easily tunable and guarantees soundness regardless of how tuned. We accomplish this by extending the method of abstracting abstract machines, a systematic approach to abstract interpretation of operational abstract-machine semantics. Our approach permits arbitrary instrumentation of the underlying analysis and arbitrary tuning of an abstract-allocation function. We show that the design space of abstract allocators both unifies and generalizes existing notions of polyvariance. Simple changes to the behavior of this function recapitulate classic styles of analysis and yield novel combinations and variants.
Thomas Gilray, Michael D. Adams 0001, Matthew Might
J. Funct. Program.2
2017 Restricting grammars with tree automata
abstract
Precedence and associativity declarations in systems like yacc resolve ambiguities in context-free grammars (CFGs) by specifying restrictions on allowed parses. However, they are special purpose and do not handle the grammatical restrictions that language designers need in order to resolve ambiguities like dangling else, the interactions between binary operators and functional if expressions in ML, and the interactions between object allocation and function calls in JavaScript. Often, language designers resort to restructuring their grammars in order to encode these restrictions, but this obfuscates the designer's intent and can make grammars more difficult to read, write, and maintain. In this paper, we show how tree automata can modularly and concisely encode such restrictions. We do this by reinterpreting CFGs as tree automata and then intersecting them with tree automata encoding the desired restrictions. The results are then reinterpreted back into CFGs that encode the specified restrictions. This process can be used as a preprocessing step before other CFG manipulations and is well behaved. It performs well in practice and never introduces ambiguities or LR( k ) conflicts.
Michael D. Adams 0001, Matthew Might
Proc. ACM Program. Lang.1
2016 Allocation characterizes polyvariance: a unified methodology for polyvariant control-flow analysis
abstract
The polyvariance of a static analysis is the degree to which it structurally differentiates approximations of program values. Polyvariant techniques come in a number of different flavors that represent alternative heuristics for managing the trade-off an analysis strikes between precision and complexity. For example, call sensitivity supposes that values will tend to correlate with recent call sites, object sensitivity supposes that values will correlate with the allocation points of related objects, the Cartesian product algorithm supposes correlations between the values of arguments to the same function, and so forth.
Thomas Gilray, Michael D. Adams 0001, Matthew Might
ICFP2
2016 On the complexity and performance of parsing with derivatives
abstract
Current algorithms for context-free parsing inflict a trade-off between ease of understanding, ease of implementation, theoretical complexity, and practical performance. No algorithm achieves all of these properties simultaneously. Might et al. introduced parsing with derivatives, which handles arbitrary context-free grammars while being both easy to understand and simple to implement. Despite much initial enthusiasm and a multitude of independent implementations, its worst-case complexity has never been proven to be better than exponential. In fact, high-level arguments claiming it is fundamentally exponential have been advanced and even accepted as part of the folklore. Performance ended up being sluggish in practice, and this sluggishness was taken as informal evidence of exponentiality. In this paper, we reexamine the performance of parsing with derivatives. We have discovered that it is not exponential but, in fact, cubic. Moreover, simple (though perhaps not obvious) modifications to the implementation by Might et al. lead to an implementation that is not only easy to understand but also highly performant in practice.
Michael D. Adams 0001, Celeste Hollenbeck, Matthew Might
PLDI1
2016 Pushdown control-flow analysis for free
abstract
Traditional control-flow analysis (CFA) for higher-order languages introduces spurious connections between callers and callees, and different invocations of a function may pollute each other's return flows. Recently, three distinct approaches have been published that provide perfect call-stack precision in a computable manner: CFA2, PDCFA, and AAC. Unfortunately, implementing CFA2 and PDCFA requires significant engineering effort. Furthermore, all three are computationally expensive. For a monovariant analysis, CFA2 is in O(2^n), PDCFA is in O(n^6), and AAC is in O(n^8). In this paper, we describe a new technique that builds on these but is both straightforward to implement and computationally inexpensive. The crucial insight is an unusual state-dependent allocation strategy for the addresses of continuations. Our technique imposes only a constant-factor overhead on the underlying analysis and costs only O(n^3) in the monovariant case. We present the intuitions behind this development, benchmarks demonstrating its efficacy, and a proof of the precision of this analysis.
Thomas Gilray, Steven Lyde, Michael D. Adams 0001, Matthew Might, David Van Horn
POPL3
2016 Specifying and executing optimizations for generalized control flow graphs
William Mansky, Elsa L. Gunter, Dennis Griffith, Michael D. Adams 0001
Sci. Comput. Program.4
2015 Towards the Essence of Hygiene
abstract
Hygiene is an essential aspect of Scheme's macro system that prevents unintended variable capture. However, previous work on hygiene has focused on algorithmic implementation rather than precise, mathematical definition of what constitutes hygiene. This is in stark contrast with lexical scope, alpha-equivalence and capture-avoiding substitution, which also deal with preventing unintended variable capture but have widely applicable and well-understood mathematical definitions.
Michael D. Adams 0001
POPL1
2015 Optimizing SYB traversals is easy!
Michael D. Adams 0001, Andrew Farmer, José Pedro Magalhães
Sci. Comput. Program.1
2014 Indentation-sensitive parsing for Parsec
abstract
Several popular languages including Haskell and Python use the indentation and layout of code as an essential part of their syntax. In the past, implementations of these languages used ad hoc techniques to implement layout. Recent work has shown that a simple extension to context-free grammars can replace these ad hoc techniques and provide both formal foundations and efficient parsing algorithms for indentation sensitivity.
Michael D. Adams 0001, Ömer S. Agacan
Haskell1
2014 Optimizing SYB is easy!
abstract
The most widely used generic-programming system in the Haskell community, Scrap Your Boilerplate (SYB), also happens to be one of the slowest. Generic traversals in SYB are often an order of magnitude slower than equivalent handwritten, non-generic traversals. Thus while SYB allows the concise expression of many traversals, its use incurs a significant runtime cost. Existing techniques for optimizing other generic-programming systems are not able to eliminate this overhead.
Michael D. Adams 0001, Andrew Farmer, José Pedro Magalhães
PEPM1
2013 Principled parsing for indentation-sensitive languages: revisiting landin's offside rule
abstract
Several popular languages, such as Haskell, Python, and F#, use the indentation and layout of code as part of their syntax. Because context-free grammars cannot express the rules of indentation, parsers for these languages currently use ad hoc techniques to handle layout. These techniques tend to be low-level and operational in nature and forgo the advantages of more declarative specifications like context-free grammars. For example, they are often coded by hand instead of being generated by a parser generator.
Michael D. Adams 0001
POPL1
2012 Template your boilerplate: using template haskell for efficient generic programming
abstract
Generic programming allows the concise expression of algorithms that would otherwise require large amounts of handwritten code. A number of such systems have been developed over the years, but a common drawback of these systems is poor runtime performance relative to handwritten, non-generic code. Generic-programming systems vary significantly in this regard, but few consistently match the performance of handwritten code. This poses a dilemma for developers. Generic-programming systems offer concision but cost performance. Handwritten code offers performance but costs concision.
Michael D. Adams 0001, Thomas DuBuisson
Haskell1
2012 A Structural Soundness Proof for Shivers's Escape Technique - A Case for Galois Connections
Jan Midtgaard, Michael D. Adams 0001, Matthew Might
SAS2
2011 Flow-sensitive type recovery in linear-log time
abstract
The flexibility of dynamically typed languages such as JavaScript, Python, Ruby, and Scheme comes at the cost of run-time type checks. Some of these checks can be eliminated via control-flow analysis. However, traditional control-flow analysis (CFA) is not ideal for this task as it ignores flow-sensitive information that can be gained from dynamic type predicates, such as JavaScript's 'instanceof' and Scheme's 'pair?', and from type-restricted operators, such as Scheme's 'car'. Yet, adding flow-sensitivity to a traditional CFA worsens the already significant compile-time cost of traditional CFA. This makes it unsuitable for use in just-in-time compilers. In response, we have developed a fast, flow-sensitive type-recovery algorithm based on the linear-time, flow-insensitive sub-0CFA. The algorithm has been implemented as an experimental optimization for the commercial Chez Scheme compiler, where it has proven to be effective, justifying the elimination of about 60% of run-time type checks in a large set of benchmarks. The algorithm processes on average over 100,000 lines of code per second and scales well asymptotically, running in only O(n log n) time. We achieve this compile-time performance and scalability through a novel combination of data structures and algorithms.
Michael D. Adams 0001, Andrew W. Keep, Jan Midtgaard, Matthew Might, Arun Chauhan 0001, R. Kent Dybvig
OOPSLA1
2008 Efficient nondestructive equality checking for trees and graphs
abstract
The Revised6 Report on Scheme requires its generic equivalence predicate, equal?, to terminate even on cyclic inputs. While the terminating equal? can be implemented via a DFA-equivalence or union-find algorithm, these algorithms usually require an additional pointer to be stored in each object, are not suitable for multithreaded code due to their destructive nature, and may be unacceptably slow for the small acyclic values that are the most likely inputs to the predicate.
Michael D. Adams 0001, R. Kent Dybvig
ICFP1
2007 Representation-transparent matrix algorithms with scalable performance
abstract
Positive results from new object-oriented tools for scientific programming are reported. Using template classes, abstractions of matrix representations are available that subsume conventional row-major, column-major, either Z- or И-Morton-order, as well as block-wise combinations of these. Moreover, the design of the Matrix Template Library (MTL) has been independently extended to provide recursators, to support block-recursive algorithms, supplementing MTL's iterators. Data types modeling both concepts enable the programmer to implement both iterative and recursive algorithms (or even both) on all of the aforementioned matrix representations at once for a wide family of important scientific operations.
Peter Gottschling, David S. Wise, Michael D. Adams 0001
ICS3