David J. Pearce 0001

dblp:p/DavidJPearce · also David James Pearce · DBLP profile ↗
← Back
32ranked-venue papers
14as first author
5since 2021 · last 2025
0000-0003-4535-9677ORCID · verified

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

Software engineering, systems software and programming languages · 25 · 12 first-author · 3 since 2021Theory of computation · 4 · 1 first-author · 1 since 2021Databases, data management, data science and information retrieval · 3 · 1 first-author · 1 since 2021Artificial intelligence and machine learning · 2 · 1 first-author · 1 since 2021Systems, architecture and hardware · 2
YearPublicationVenuePosition
2025 Perceptions of Edinburgh: Capturing neighbourhood characteristics by clustering geoparsed local news
abstract
The communities that we live in affect our health in ways that are complex and hard to define. Moreover, our understanding of the place-based processes affecting health and inequalities is limited. This undermines the development of robust policy interventions to improve local health and well-being. News media provides social and community information that may be useful in health studies. Here we propose a methodology for characterising neighbourhoods by using local news articles. More specifically, we show how we can use Natural Language Processing (NLP) to unlock further information about neighbourhoods by analysing, geoparsing and clustering news articles. Our work is novel because we combine street-level geoparsing tailored to the locality with clustering of full news articles, enabling a more detailed examination of neighbourhood characteristics. We evaluate our outputs and show via a confluence of evidence, both from a qualitative and a quantitative perspective, that the themes we extract from news articles are sensible and reflect many characteristics of the real world. This is significant because it allows us to better understand the effects of neighbourhoods on health. Our findings on neighbourhood characterisation using news data will support a new generation of place-based research which examines a wider set of spatial processes and how they affect health, enabling new epidemiological research. • Novel methodology for characterising neighbourhoods based on local news. • Natural Language Processing can create meaningful neighbourhood characterisations from local news articles. • Extensive quantitative and qualitative evaluation show analysis is sound.
Andreas Grivas, Claire Grover, Richard Tobin, Clare Llewellyn, Eleojo Oluwaseun Abubakar, Chunyu Zheng, Chris Dibben, David J. Pearce 0001, Beatrice Alex
Inf. Process. Manag.9
2023 On Leveraging Tests to Infer Nullable Annotations
Jens Dietrich 0001, David J. Pearce 0001, Mahin Chandramohan
ECOOP2
2023 Formal and Executable Semantics of the Ethereum Virtual Machine in Dafny
Franck Cassez, Joanne Fuller, Milad K. Ghale, David J. Pearce 0001, Horacio Mijail Anton Quiles
FM4
2022 Verifying Whiley Programs with Boogie
abstract
Abstract The quest to develop increasingly sophisticated verification systems continues unabated. Tools such as Dafny, Spec#, ESC/Java, SPARK Ada and Whiley attempt to seamlessly integrate specification and verification into a programming language, in a similar way to type checking. A common integration approach is to generate verification conditions that are handed off to an automated theorem prover. This provides a nice separation of concerns and allows different theorem provers to be used interchangeably. However, generating verification conditions is still a difficult undertaking and the use of more “high-level” intermediate verification languages has become commonplace. In particular, Boogie provides a widely used and understood intermediate verification language. A common difficulty is the potential for an impedance mismatch between the source language and the intermediate verification language. In this paper, we explore the use of Boogie as an intermediate verification language for verifying programs in Whiley. This is noteworthy because the Whiley language has (amongst other things) a rich type system with considerable potential for an impedance mismatch. We provide a comprehensive account of translating Whiley to Boogie which demonstrates that it is possible to model most aspects of the Whiley language. Key challenges posed by the Whiley language included: the encoding of Whiley’s expressive type system and support for flow typing and generics; the implicit assumption that expressions in specifications are well defined; the ability to invoke methods from within expressions; the ability to return multiple values from a function or method; the presence of unrestricted lambda functions; and the limited syntax for framing. We demonstrate that the resulting verification tool can verify significantly more programs than the native Whiley verifier which was custom-built for Whiley verification. Furthermore, our work provides evidence that Boogie is (for the most part) sufficiently general to act as an intermediate language for a wide range of source languages.
David J. Pearce 0001, Mark Utting, Lindsay Groves
J. Autom. Reason.1
2021 A Lightweight Formalism for Reference Lifetimes and Borrowing in Rust
abstract
Rust is a relatively new programming language that has gained significant traction since its v1.0 release in 2015. Rust aims to be a systems language that competes with C/C++. A claimed advantage of Rust is a strong focus on memory safety without garbage collection. This is primarily achieved through two concepts, namely, reference lifetimes and borrowing . Both of these are well-known ideas stemming from the literature on region-based memory management and linearity / uniqueness . Rust brings both of these ideas together to form a coherent programming model. Furthermore, Rust has a strong focus on stack-allocated data and, like C/C++ but unlike Java, permits references to local variables. Type checking in Rust can be viewed as a two-phase process: First, a traditional type checker operates in a flow-insensitive fashion; second, a borrow checker enforces an ownership invariant using a flow-sensitive analysis. In this article, we present a lightweight formalism that captures these two phases using a flow-sensitive type system that enforces “ type and borrow safety .” In particular, programs that are type and borrow safe will not attempt to dereference dangling pointers. Our calculus core captures many aspects of Rust, including copy- and move-semantics, mutable borrowing, reborrowing, partial moves, and lifetimes. In particular, it remains sufficiently lightweight to be easily digested and understood and, we argue, still captures the salient aspects of reference lifetimes and borrowing. Furthermore, extensions to the core can easily add more complex features (e.g., control-flow, tuples, method invocation). We provide a soundness proof to verify our key claims of the calculus. We also provide a reference implementation in Java with which we have model checked our calculus using over 500B input programs. We have also fuzz tested the Rust compiler using our calculus against 2B programs and, to date, found one confirmed compiler bug and several other possible issues.
David J. Pearce 0001
ACM Trans. Program. Lang. Syst.1
2019 Dependency versioning in the wild
abstract
Many modern software systems are built on top of existing packages (modules, components, libraries). The increasing number and complexity of dependencies has given rise to automated dependency management where package managers resolve symbolic dependencies against a central repository. When declaring dependencies, developers face various choices, such as whether or not to declare a fixed version or a range of versions. The former results in runtime behaviour that is easier to predict, whilst the latter enables flexibility in resolution that can, for example, prevent different versions of the same package being included and facilitates the automated deployment of bug fixes. We study the choices developers make across 17 different package managers, investigating over 70 million dependencies. This is complemented by a survey of 170 developers. We find that many package managers support - and the respective community adapts - flexible versioning practices. This does not always work: developers struggle to find the sweet spot between the predictability of fixed version dependencies, and the agility of flexible ones, and depending on their experience, adjust practices. We see some uptake of semantic versioning in some package managers, supported by tools. However, there is no evidence that projects switch to semantic versioning on a large scale. The results of this study can guide further research into better practices for automated dependency management, and aid the adaptation of semantic versioning.
Jens Dietrich 0001, David J. Pearce 0001, Jacob Stringer, Amjed Tahir, Kelly Blincoe
MSR2
2018 A Symmetry Metric for Graphs and Line Diagrams
Roman Klapaukh, Stuart Marshall, David J. Pearce 0001
Diagrams3
2017 Contracts in the Wild: A Study of Java Programs
abstract
The use of formal contracts has long been advocated as an approach to develop programs that are provably correct. However, the reality is that adoption of contracts has been slow in practice. Despite this, the adoption of lightweight contracts — typically utilising runtime checking — has progressed. In the case of Java, built-in features of the language (e.g. assertions and exceptions) can be used for this. Furthermore, a number of libraries which facilitate contract checking have arisen. In this paper, we catalogue 25 techniques and tools for lightweight contract checking in Java, and present the results of an empirical study looking at a dataset extracted from the 200 most popular projects found on Maven Central, constituting roughly 351,034 KLOC. We examine (1) the extent to which contracts are used and (2) what kind of contracts are used. We then investigate how contracts are used to safeguard code, and study problems in the context of two types of substitutability that can be guarded by contracts: (3) unsafe evolution of APIs that may break client programs and (4) violations of Liskovs Substitution Principle (LSP) when methods are overridden. We find that: (1) a wide range of techniques and constructs are used to represent contracts, and often the same program uses different techniques at the same time; (2) overall, contracts are used less than expected, with significant differences between programs; (3) projects that use contracts continue to do so, and expand the use of contracts as they grow and evolve; and, (4) there are cases where the use of contracts points to unsafe subtyping (violations of Liskov's Substitution Principle) and unsafe evolution.
Jens Dietrich 0001, David J. Pearce 0001, Kamil Jezek, Premek Brada
ECOOP2
2017 Rewriting for sound and complete union, intersection and negation types
abstract
Implementing the type system of a programming language is a critical task that is often done in an ad-hoc fashion. Whilst this makes it hard to ensure the system is sound, it also makes it difficult to extend as the language evolves. We are interested in describing type systems using declarative rewrite rules from which an implementation can be automatically generated. Whilst not all type systems are easily expressed in this manner, those involving unions, intersections and negations are well-suited for this.
David J. Pearce 0001
GPCE1
2017 Making Whiley Boogie!
Mark Utting, David J. Pearce 0001, Lindsay Groves
IFM2
2016 A Mechanical Soundness Proof for Subtyping Over Recursive Types
Timothy Jones 0002, David J. Pearce 0001
FTfJP@ECOOP2
2016 A space-efficient algorithm for finding strongly connected components
David J. Pearce 0001
Inf. Process. Lett.1
2015 The whiley rewrite language (WyRL)
abstract
The Whiley Rewrite Language (WyRL) is a standalone tool providing a domain-specific declarative rewrite language and code generator. The tool is currently used to generate a critical component of the Whiley verifying compiler, namely the automated theorem prover. The tool automatically generates Java source code from a given rule set. The runtime library provides support for different heuristics to control aspects of the generated system, such as the order in which rewrite rules are applied. Novel aspects of WyRL include support for true union types and the ability to work with cyclic terms.
David J. Pearce 0001
SLE1
2015 Special Issue on the 6th and 7th International Conferences on Software Language Engineering (SLE 2013 and SLE 2014)
Benoît Combemale, David J. Pearce 0001, Richard F. Paige, Eric Van Wyk
Comput. Lang. Syst. Struct.2
2015 Designing a verifying compiler: Lessons learned from developing Whiley
David J. Pearce 0001, Lindsay Groves
Sci. Comput. Program.1
2013 A calculus for constraint-based flow typing
abstract
Flow typing offers an alternative to traditional Hindley-Milner type inference. A key distinction is that variables may have different types at different program points. Flow typing systems are typically formalised in the style of a dataflow analysis. In the presence of loops, this requires a fix-point computation over typing environments. Unfortunately, for some flow typing problems, the standard iterative fix-point computation may not terminate. We formalise such a problem we encountered in developing the Whiley programming language, and present a novel constraint-based solution which is guaranteed to terminate. This provides a foundation for others when developing such flow typing systems.
David J. Pearce 0001
FTfJP@ECOOP1
2013 Whiley: A Platform for Research in Software Verification
David J. Pearce 0001, Lindsay Groves
SLE1
2013 Sound and Complete Flow Typing with Unions, Intersections and Negations
David J. Pearce 0001
VMCAI1
2012 Patterns as objects in grace
abstract
Object orientation and pattern matching are often seen as conflicting approaches to program design. Object-oriented programs place type-dependent behavior inside objects and invoke it via dynamic dispatch, while pattern-matching programs place type-dependent behavior outside data structures and invoke it via multiway conditionals (case statements).
Michael Homer, James Noble 0001, Kim B. Bruce, Andrew P. Black, David J. Pearce 0001
DLS5
2012 Profiling Field Initialisation in Java
Stephen Nelson, David J. Pearce 0001, James Noble 0001
RV2
2011 JPure: A Modular Purity System for Java
David J. Pearce 0001
CC1
2011 Formalisation and implementation of an algorithm for bytecode verification of @NonNull types
Chris Male, David J. Pearce 0001, Alex Potanin, Constantine Dymnikov
Sci. Comput. Program.2
2010 Computing Tutte Polynomials
abstract
The Tutte polynomial of a graph, also known as the partition function of the q -state Potts model is a 2-variable polynomial graph invariant of considerable importance in both combinatorics and statistical physics. It contains several other polynomial invariants, such as the chromatic polynomial and flow polynomial as partial evaluations, and various numerical invariants such as the number of spanning trees as complete evaluations. However despite its ubiquity, there are no widely available effective computational tools able to compute the Tutte polynomial of a general graph of reasonable size. In this article we describe the implementation of a program that exploits isomorphisms in the computation tree to extend the range of graphs for which it is feasible to compute their Tutte polynomials, and we demonstrate the utility of the program by finding counterexamples to a conjecture of Welsh on the location of the real flow roots of a graph.
Gary Haggard, David J. Pearce 0001, Gordon F. Royle
ACM Trans. Math. Softw.2
2008 Java Bytecode Verification for @NonNull Types
Chris Male, David J. Pearce 0001, Alex Potanin, Constantine Dymnikov
CC2
2008 Caching and incrementalisation in the java query language
abstract
Many contemporary object-oriented programming languages support first-class queries or comprehensions. These language extensions make it easier for programmers to write queries, but are generally implemented no more efficiently than the code using collections, iterators, and loops that they replace. Crucially, whenever a query is re-executed, it is recomputed from scratch. We describe a general approach to optimising queries over mutable objects: query results are cached, and those caches are incrementally maintained whenever the collections and objects underlying those queries are updated. We hope that the performance benefits of our optimisations may encourage more general adoption of first-class queries by object-oriented programmers.
Darren Willis, David J. Pearce 0001, James Noble 0001
OOPSLA2
2007 Profiling with AspectJ
abstract
Abstract This paper investigates whether AspectJ can be used for efficient profiling of Java programs. Profiling differs from other applications of AOP (e.g. tracing), since it necessitates efficient and often complex interactions with the target program. As such, it was uncertain whether AspectJ could achieve this goal. Therefore, we investigate four common profiling problems (heap usage, object lifetime, wasted time and time‐spent) and report on how well AspectJ handles them. For each, we provide an efficient implementation, discuss any trade‐offs or limitations and present the results of an experimental evaluation into the costs of using it. Our conclusions are mixed. On the one hand, we find that AspectJ is sufficiently expressive to describe the four profiling problems and reasonably efficient in most cases. On the other hand, we find several limitations with the current AspectJ implementation that severely hamper its suitability for profiling. Copyright © 2006 John Wiley & Sons, Ltd.
David J. Pearce 0001, Matthew Webster, Robert F. Berry, Paul H. J. Kelly
Softw. Pract. Exp.1
2007 Efficient field-sensitive pointer analysis of C
abstract
The subject of this article is flow- and context-insensitive pointer analysis. We present a novel approach for precisely modelling struct variables and indirect function calls. Our method emphasises efficiency and simplicity and is based on a simple language of set constraints. We obtain an O ( v 4 ) bound on the time needed to solve a set of constraints from this language, where v is the number of constraint variables. This gives, for the first time, some insight into the hardness of performing field-sensitive pointer analysis of C. Furthermore, we experimentally evaluate the time versus precision trade-off for our method by comparing against the field-insensitive equivalent. Our benchmark suite consists of 11 common C programs ranging in size from 15,000 to 200,000 lines of code. Our results indicate the field-sensitive analysis is more expensive to compute, but yields significantly better precision. In addition, our technique has been integrated into the latest release (version 4.1) of the GNU Compiler GCC. Finally, we identify several previously unknown issues with an alternative and less precise approach to modelling struct variables, known as field-based analysis.
David J. Pearce 0001, Paul H. J. Kelly, Chris Hankin
ACM Trans. Program. Lang. Syst.1
2006 Efficient Object Querying for Java
Darren Willis, David J. Pearce 0001, James Noble 0001
ECOOP2
2004 Automating Optimized Table-with-Polynomial Function Evaluation for FPGAs
Dong-U Lee, Oskar Mencer, David J. Pearce 0001, Wayne Luk
FPL3
2004 Efficient field-sensitive pointer analysis for C
abstract
The subject of this paper is flow- and context-insensitive pointer analysis. We present a novel approach for precisely modelling struct variables and indirect function calls. Our method emphasises efficiency and simplicity and extends the language of set-constraints. We experimentally evaluate the precision cost trade-off using a benchmark suite of 7 common C programs between 5,000 to 150,000 lines of code. Our results indicate the field-sensitive analysis is more expensive to compute, but yields significantly better precision.
David J. Pearce 0001, Paul H. J. Kelly, Chris Hankin
PASTE1
2004 Online Cycle Detection and Difference Propagation: Applications to Pointer Analysis
David J. Pearce 0001, Paul H. J. Kelly, Chris Hankin
Softw. Qual. J.1
2003 Design space exploration with A Stream Compiler
abstract
We consider speeding up general-purpose applications with hardware accelerators. Traditionally hardware accelerators are tediously hand-crafted to achieve top performance ASC (A Stream Complier) simplifies exploration of hardware accelerators by transforming the hardware design task into a software design process using only 'gcc' and 'make' to obtain a hardware netlist. ASC enables programmers to customize hardware accelarators at three levels of abstraction: the architecture level, the functional block level, and the bit level. All three customizations are based on one uniform representation: a single C++ program with custom types and operators for each level of abstraction. This representation allows ASC users to express and reason about the design space, extract parallelism at each level and quickly evaluate different design choices. In addition, since the user has full control over each gate-level resource in the entire design. ASC accelerator performance can always be equal to or better than hand-crafted designs, usually with much less effort. We present several ASC bench marks, including wavelet compression and Kasumi encryption.
Oskar Mencer, David J. Pearce 0001, Lee W. Howes, Wayne Luk
FPT2