Hans-Juergen Boehm

dblp:43/2339 · DBLP profile ↗
← Back
33ranked-venue papers
23as first author
0since 2021 · last 2020
—ORCID · none

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

Software engineering, systems software and programming languages · 28 · 18 first-authorSystems, architecture and hardware · 6 · 4 first-authorTheory of computation · 1 · 1 first-author

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
23 papers
Concurrent programming · 36% Programming languages and type systems · 24% Program analysis · 19%
Computer architecture, parallel and distributed computing, and storage systems
7 papers
Memory systems · 44% Storage systems · 34% Parallel and multicore computing · 16%

Topics — the 30 heaviest of 61, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Programming languages and type systems › type systems
numeric types
0.422020
Towards an API for the real numbers · PLDI 2020
Constructive real interpretation of numerical programs · PLDI 1987
Memory systems
non-volatile memory
0.422016
Makalu: fast recoverable allocation of non-volatile memory · OOPSLA 2016
Atlas: leveraging locks for non-volatile memory consistency · OOPSLA 2014
Program analysis
data flow analysis
0.322012
On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code · ACM Trans. Program. Lang. Syst. 2012
A technique for the effective and automatic reuse of classical compiler optimizations on multithreaded code · POPL 2011
Storage systems
crash recovery
0.212016
Makalu: fast recoverable allocation of non-volatile memory · OOPSLA 2016
Memory systems › non-volatile memory
non-volatile memory management
0.212016
Makalu: fast recoverable allocation of non-volatile memory · OOPSLA 2016
Storage systems
storage reliability
0.212016
Makalu: fast recoverable allocation of non-volatile memory · OOPSLA 2016
Concurrent programming
synchronization
0.242014
Reordering constraints for pthread-style locks · PPoPP 2007
Atlas: leveraging locks for non-volatile memory consistency · OOPSLA 2014
An almost non-blocking stack · PODC 2004
Concurrent programming
memory models
0.232008
Foundations of the C++ concurrency memory model · PLDI 2008
Reordering constraints for pthread-style locks · PPoPP 2007
Threads cannot be implemented as a library · PLDI 2005
Storage systems
crash consistency
0.212014
Atlas: leveraging locks for non-volatile memory consistency · OOPSLA 2014
Memory systems › non-volatile memory
persistent memory
0.212014
Atlas: leveraging locks for non-volatile memory consistency · OOPSLA 2014
Parallel and multicore computing
shared-memory parallel programs
0.222012
On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code · ACM Trans. Program. Lang. Syst. 2012
A technique for the effective and automatic reuse of classical compiler optimizations on multithreaded code · POPL 2011
Programming languages and type systems
language design
0.232008
Foundations of the C++ concurrency memory model · PLDI 2008
Threads cannot be implemented as a library · PLDI 2005
Destructors, finalizers, and synchronization · POPL 2003
Runtime systems and virtual machines
garbage collection
0.272004
The space cost of lazy reference counting · POPL 2004
Destructors, finalizers, and synchronization · POPL 2003
Bounding space usage of conservative garbage collectors · POPL 2002
Concurrent programming › concurrency bug detection
data race detection
0.112012
IFRit: interference-free regions for dynamic data-race detection · OOPSLA 2012
Program analysis
dynamic analysis
0.112012
IFRit: interference-free regions for dynamic data-race detection · OOPSLA 2012
Concurrent programming › concurrency bug detection › data race detection
dynamic race detection
0.112012
IFRit: interference-free regions for dynamic data-race detection · OOPSLA 2012
Program analysis › data flow analysis
parallel dataflow analysis
0.112012
On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code · ACM Trans. Program. Lang. Syst. 2012
Parallel and multicore computing
parallel programming models
0.112012
On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code · ACM Trans. Program. Lang. Syst. 2012
Compilers and program optimization
floating-point arithmetic
0.122020
Towards an API for the real numbers · PLDI 2020
Constructive real interpretation of numerical programs · PLDI 1987
Concurrent programming › concurrency bugs
data races
0.112010
Conflict exceptions: simplifying concurrent language semantics with precise hardware exceptions for data-races · ISCA 2010
Concurrent programming
concurrency semantics
0.112008
Foundations of the C++ concurrency memory model · PLDI 2008
Runtime systems and virtual machines › garbage collection
conservative garbage collection
0.132002
Bounding space usage of conservative garbage collectors · POPL 2002
Simple Garbage-Collector-Safety · PLDI 1996
Space Efficient Conservative Garbage Collection · PLDI 1993
Concurrent programming › concurrency primitives
compare-and-swap
0.012004
An almost non-blocking stack · PODC 2004
Concurrent programming
concurrent data structures
0.012004
An almost non-blocking stack · PODC 2004
Concurrent programming › non-blocking algorithms
non-blocking data structures
0.012004
An almost non-blocking stack · PODC 2004
Runtime systems and virtual machines › garbage collection
reference counting
0.012004
The space cost of lazy reference counting · POPL 2004
Compilers and program optimization
compiler optimization
0.012012
On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code · ACM Trans. Program. Lang. Syst. 2012
Runtime systems and virtual machines › garbage collection
finalization
0.012003
Destructors, finalizers, and synchronization · POPL 2003
Programming languages and type systems › language semantics
concurrent language semantics
0.012010
Conflict exceptions: simplifying concurrent language semantics with precise hardware exceptions for data-races · ISCA 2010
Compilers and program optimization
compiler correctness
0.022005
Threads cannot be implemented as a library · PLDI 2005
Simple Garbage-Collector-Safety · PLDI 1996

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

lock-based consistency protocol · 0.4siloing · 0.3recovery-time garbage collection · 0.2allocator design · 0.2happens-before analysis · 0.1data-flow transformation · 0.1data flow transformation · 0.1compile-time instrumentation · 0.1pthreads · 0.1GC-robustness analysis · 0.1source annotation · 0.0preprocessor · 0.0pointer identification · 0.0undecidability proof · 0.0axiomatic definition · 0.0
YearPublicationVenuePosition
2020 Towards an API for the real numbers
abstract
The real numbers are pervasive, both in daily life, and in mathematics. Students spend much time studying their properties. Yet computers and programming languages generally provide only an approximation geared towards performance, at the expense of many of the nice properties we were taught in high school.
Hans-Juergen Boehm
PLDI1
2016 Persistence programming models for non-volatile memory
abstract
It is expected that DRAM memory will be augmented, and perhaps eventually replaced, by one of several up-and-coming memory technologies. These are all non-volatile, in that they retain their contents without power. This allows primary memory to be used as a fast disk replacement. It also enables more aggressive programming models that directly leverage persistence of primary memory. However, it is challenging to maintain consistency of memory in such an environment. There is no consensus on the right programming model for doing so, and subtle differences can have large, and sometimes surprising, effects on the implementation and its performance. The existing literature describes multiple programming systems that provide point solutions to the selective persistence for user data structures. Real progress in this area requires a choice of programming model, which we cannot reasonably make without a real understanding of the design space. Point solutions are insufficient. We systematically explore what we consider to be the most promising part of the space, precisely defining semantics and identifying implementation costs. This allows us to be much more explicit and precise about semantic and implementation trade-offs that were usually glossed over in prior work. It also exposes some promising new design alternatives.
Hans-Juergen Boehm, Dhruva R. Chakrabarti
ISMM1
2016 Makalu: fast recoverable allocation of non-volatile memory
abstract
Byte addressable non-volatile memory (NVRAM) is likely to supplement, and perhaps eventually replace, DRAM. Applications can then persist data structures directly in memory instead of serializing them and storing them onto a durable block device. However, failures during execution can leave data structures in NVRAM unreachable or corrupt. In this paper, we present Makalu, a system that addresses non-volatile memory management. Makalu offers an integrated allocator and recovery-time garbage collector that maintains internal consistency, avoids NVRAM memory leaks, and is efficient, all in the face of failures.
Kumud Bhandari, Dhruva R. Chakrabarti, Hans-Juergen Boehm
OOPSLA3
2015 Myths and Misconceptions about Threads
abstract
The semantics of variables shared across threads, usually called "memory models", have evolved significantly over the last decade, but open problems and some controversy remains. I'll briefly review where we are, and argue that a number of assumptions that still appear common in large parts of the research and programming communities are wrong, or at least questionable, especially for programming languages like C and C++. In particular, I will argue that:
Hans-Juergen Boehm
SPAA1
2014 Atlas: leveraging locks for non-volatile memory consistency
abstract
Non-volatile main memory, such as memristors or phase change memory, can revolutionize the way programs persist data. In-memory objects can themselves be persistent without the need for a separate persistent data storage format. However, the challenge is to ensure that such data remains consistent if a failure occurs during execution.
Dhruva R. Chakrabarti, Hans-Juergen Boehm, Kumud Bhandari
OOPSLA2
2012 IFRit: interference-free regions for dynamic data-race detection
abstract
We propose a new algorithm for dynamic data-race detection. Our algorithm reports no false positives and runs on arbitrary C and C++ code. Unlike previous algorithms, we do not have to instrument every memory access or track a full happens-before relation. Our data-race detector, which we call IFRit, is based on a run-time abstraction called an interference-free region (IFR). An IFR is an interval of one thread's execution during which any write to a specific variable by a different thread is a data race. We insert instrumentation at compile time to monitor active IFRs at run-time. If the runtime observes overlapping IFRs for conflicting accesses to the same variable in two different threads, it reports a race. The static analysis aggregates information for multiple accesses to the same variable, avoiding the expense of having to instrument every memory access in the program.
Laura Effinger-Dean, Brandon Lucia, Luis Ceze, Dan Grossman, Hans-Juergen Boehm
OOPSLA5
2012 On a Technique for Transparently Empowering Classical Compiler Optimizations on Multithreaded Code
abstract
A large body of data-flow analyses exists for analyzing and optimizing sequential code. Unfortunately, much of it cannot be directly applied on parallel code, for reasons of correctness. This article presents a technique to automatically, aggressively, yet safely apply sequentially-sound data-flow transformations, without change , on shared-memory programs. The technique is founded on the notion of program references being “siloed” on certain control-flow paths. Intuitively, siloed references are free of interference from other threads within the confines of such paths. Data-flow transformations can, in general, be unblocked on siloed references. The solution has been implemented in a widely used compiler. Results on benchmarks from SPLASH-2 show that performance improvements of up to 41% are possible, with an average improvement of 6% across all the tested programs over all thread counts.
Pramod G. Joisha, Robert S. Schreiber, Prithviraj Banerjee, Hans-Juergen Boehm, Dhruva R. Chakrabarti
ACM Trans. Program. Lang. Syst.4
2011 The runtime abort graph and its application to software transactional memory optimization
abstract
Programming with atomic sections is a promising alternative to locks since it raises the abstraction and removes deadlocks at the programmer level. However, implementations of atomic sections using software transactional memory (STM) support have significant bookkeeping overheads. Additionally, because of the speculative nature of transactions, aborts can be frequent greatly lowering application performance. Thus regardless of the STM implementation, tools need to be available to programmers that provide insights into the runtime characteristics of an application as well as provide means to improve performance. This paper attempts to identify the source of an abort at the granularity of a transactional memory reference. The resulting abort patterns are captured in the form of a runtime abort graph (RAG). We show how to build this graph efficiently using compiler instrumentation. We then describe a technique that works on the RAG and automatically recommends STM policy changes to improve performance. Detailed experimental results are presented showing the tradeoffs in building the RAG and its use in reducing aborts and improving performance.
Dhruva R. Chakrabarti, Prithviraj Banerjee, Hans-Juergen Boehm, Pramod G. Joisha, Robert S. Schreiber
CGO3
2011 A technique for the effective and automatic reuse of classical compiler optimizations on multithreaded code
abstract
A large body of data-flow analyses exists for analyzing and optimizing sequential code. Unfortunately, much of it cannot be directly applied on parallel code, for reasons of correctness. This paper presents a technique to automatically, aggressively, yet safely apply sequentially-sound data-flow transformations, without change, on shared-memory programs. The technique is founded on the notion of program references being "siloed" on certain control-flow paths. Intuitively, siloed references are free of interference from other threads within the confines of such paths. Data-flow transformations can, in general, be unblocked on siloed references.
Pramod G. Joisha, Robert S. Schreiber, Prithviraj Banerjee, Hans-Juergen Boehm, Dhruva R. Chakrabarti
POPL4
2010 Conflict exceptions: simplifying concurrent language semantics with precise hardware exceptions for data-races
abstract
We argue in this paper that concurrency errors should be treated as exceptions, i.e., have fail-stop behavior and precise semantics. We propose an exception model based on conflict of synchronization free regions, which precisely detects a broad class of data-races. We show that our exceptions provide enough guarantees to simplify high-level programming language semantics and debugging, but are significantly cheaper to enforce than traditional data-race detection. To make the performance cost of enforcement negligible, we propose architecture support for accurately detecting and precisely delivering these exceptions. We evaluate the suitability of our model as well as the behavior of our architectural mechanisms using the PARSEC benchmark suite and commercial applications. Our results show that the exception model largely reflects how programmers are already writing code and that the main memory, traffic and performance overheads of the enforcement mechanisms we propose are very low.
Brandon Lucia, Luis Ceze, Karin Strauss, Shaz Qadeer, Hans-Juergen Boehm
ISCA5
2009 Garbage collection in the next C++ standard
abstract
C++ has traditionally relied on manual memory management. Sometimes this has been augmented by limited reference counting, implemented in libraries, and requiring use of separate pointer types. In spite of the fact that conservative garbage collectors have been used with C for decades, and with C++ for almost as long, they have not been well-supported by language standards. This in turn has limited their use.
Hans-Juergen Boehm, Mike Spertus
ISMM1
2008 Foundations of the C++ concurrency memory model
abstract
Currently multi-threaded C or C++ programs combine a single-threaded programming language with a separate threads library. This is not entirely sound [7].
Hans-Juergen Boehm, Sarita V. Adve
PLDI1
2007 Reordering constraints for pthread-style locks
abstract
C or C++ programs relying on the pthreads interface for concurrency are required to use a specified set of functions to avoid data races, and to ensure memory visibility across threads. Although the detailed rules are not completely, it is not hard to refine them to a simple set of clear and uncontroversial rules for at least a subset of the C language that excludes structures (and hence bit-fields).
Hans-Juergen Boehm
PPoPP1
2005 Threads cannot be implemented as a library
abstract
In many environments, multi-threaded code is written in a language that was originally designed without thread support (e.g. C), to which a library of threading primitives was subsequently added. There appears to be a general understanding that this is not the right approach. We provide specific arguments that a pure library approach, in which the compiler is designed independently of threading issues, cannot guarantee correctness of the resulting code.We first review why the approach almost works, and then examine some of the surprising behavior it may entail. We further illustrate that there are very simple cases in which a pure library-based approach seems incapable of expressing an efficient parallel algorithm.Our discussion takes place in the context of C with Pthreads, since it is commonly used, reasonably well specified, and does not attempt to ensure type-safety, which would entail even stronger constraints. The issues we raise are not specific to that context.
Hans-Juergen Boehm
PLDI1
2004 An almost non-blocking stack
abstract
Non-blocking data structure implementations can be useful for performance and fault-tolerance reasons. And they are far easier to use correctly in a signal- or interrupt-handler context.We describe a weaker class of "almost non-blocking" data structures, which block only if more than some number N of threads attempt to simultaneously access the same data structure. We argue that this gives much of the benefit of fully non-blocking data structures, particularly for signal or interrupt handlers.We present an almost non-blocking linked stack implementation which is efficiently implementable even on hardware providing a single word compare-and-swap operation, while potentially providing the same interface as a well-known fully non-blocking solution, which relies on a double-width compare-and-swap instruction. By making a platform-dependent choice between these, we can implement a signal-handler-safe stack or free-list abstraction that is both portable and exhibits uniformly high performance with any flavor of compare-and-swap instruction.
Hans-Juergen Boehm
PODC1
2004 The space cost of lazy reference counting
abstract
Reference counting memory management is often advocated as a technique for reducing or avoiding the pauses associated with tracing garbage collection. We present some measurements to remind the reader that classic reference count implementations may in fact exhibit longer pauses than tracing collectors.We then analyze reference counting with lazy deletion, the standard technique for avoiding long pauses by deferring deletions and associated reference count decrements, usually to allocation time. Our principal result is that if each reference count operation is constrained to take constant time, then the overall space requirements can be increased by a factor of Ω(R) in the worst case, where R is the ratio between the size of the largest and smallest allocated object. This bound is achievable, but probably large enough to render this design point useless for most real-time applications.We show that this space cost can largely be avoided if allocating an $n$ byte object is allowed to additionally perform O(n) reference counting work.
Hans-Juergen Boehm
POPL1
2003 Destructors, finalizers, and synchronization
abstract
We compare two different facilities for running cleanup actions for objects that are about to reach the end of their life.Destructors, such as we find in C++, are invoked synchronously when an object goes out of scope. They make it easier to implement cleanup actions for objects of well-known lifetime, especially in the presence of exceptions.Languages like Java[8], Modula-3[12], and C\#[6] provide a different kind of "finalization" facility: Cleanup methods may be run when the garbage collector discovers a heap object to be otherwise inaccessible. Unlike C++ destructors, such methods run in a separate thread at some much less well-defined time.Languages like Java[8], Modula-3[12], and C\#[6] provide a different kind of "finalization" facility: Cleanup methods may be run when the garbage collector discovers a heap object to be otherwise inaccessible. Unlike C++ destructors, such methods run in a separate thread at some much less well-defined time.We argue that these are fundamentally different, and potentially complementary, language facilities. We also try to resolve some common misunderstandings about finalization in the process. In particular:
Hans-Juergen Boehm
POPL1
2002 Bounding space usage of conservative garbage collectors
abstract
Conservative garbage collectors can automatically reclaim unused memory in the absence of precise pointer location information. If a location can possibly contain a pointer, it is treated by the collector as though it contained a pointer. Although it is commonly assumed that this can lead to unbounded space use due to misidentified pointers, such extreme space use is rarely observed in practice, and then generally only if the number of misidentified pointers is itself unbounded.We show that if the program manipulates only data structures satisfying a simple GC-robustness criterion, then a bounded number of misidentified pointers can at most result in increasing space usage by a constant factor. We argue that nearly all common data structures are already GC-robust, and it is typically easy to identify and replace those that are not. Thus it becomes feasible to prove space bounds on programs collected by mildly conservative garbage collectors, such as the one in [2]. The worst-case space overhead introduced by such mild conservatism is comparable to the worst-case fragmentation overhead for inherent in any non-moving storage allocator.The same GC-robustness criterion also ensures the absence of temporary space leaks of the kind discussed in [13] for generational garbage collectors.
Hans-Juergen Boehm
POPL1
2000 Understanding memory allocation of scheme programs
abstract
Memory is the performance bottleneck of modern architectures. Keeping memory consumption as low as possible enables fast and unobtrusive applications. But it is not easy to estimate the memory use of programs implemented in functional languages, due to both the complex translations of some high level constructs, and the use of automatic memory managers.To help understand memory allocation behavior of Scheme programs, we have designed two complementary tools. The first one reports on frequency of allocation, heap configurations and on memory reclamation. The second tracks down memory leaks1. We have applied these tools to our Scheme compiler, the largest Scheme program we have been developing. This has allowed us to drastically reduce the amount of memory consumed during its bootstrap process, without requiring much development time.Development tools will be neglected unless they are both conveniently accessible and easy to use. In order to avoid this pitfall, we have carefully designed the user interface of these two tools. Their integration into a real programming environment for Scheme is detailed in the paper.
Manuel Serrano, Hans-Juergen Boehm
ICFP2
2000 Reducing Garbage Collector Cache Misses
abstract
Cache misses are currently a major factor in the cost of garbage collection, and we expect them to dominate in the future. Traditional garbage collection algorithms exhibit relatively little temporal locality; each live object in the heap is likely to be touched exactly once during each garbage collection. We measure two techniques for dealing with this issue: prefetch-on-grey, and lazy sweeping. The first of these is new in this context. Lazy sweeping has been in common use for a decade. It was introduced as a mechanism for reducing paging and pause times; we argue that it is also crucial for eliminating cache misses during the sweep phase.
Hans-Juergen Boehm
ISMM1
1996 Simple Garbage-Collector-Safety
abstract
A conservative garbage collector can typically be used with conventionally compiled programs written in C or C++. But two safety issues must be considered. First, the source code must not hide pointers from the garbage collector. This primarily requires stricter adherence to existing restrictions in the language definition. Second, we must ensure that the compiler will not perform transformations that invalidate this requirement.We argue that the same technique can be used to address both issues. We present an algorithm for annotating source or intermediate code to either check the validity of pointer arithmetic in the source, or to guarantee that under minimal, clearly defined assumptions about the compiler, the optimizer cannot "disguise" pointers. We discuss an implementation based on a preprocessor for the GNU C compiler (gcc), and give some measurements of program slow down.
Hans-Juergen Boehm
PLDI1
1995 Ropes: An Alternative to Strings
abstract
Abstract Programming languages generally provide a ‘string’ or ‘text’ type to allow manipulation of sequences of characters. This type is usually of crucial importance, since it is normally mentioned in most interfaces between system components. We claim that the traditional implementations of strings, and often the supported functionality, are not well suited to such general‐purpose use. They should be confined to applications with specific, and unusual, performance requirements. We present ‘ropes’ or ‘heavyweight’ strings as an alternative that, in our experience leads to systems that are more robust, both in functionality and in performance. Ropes have been in use in the Cedar environment almost since its inception, but this appears to be neither well‐known, nor discussed in the literature. The algorithms have been gradually refined. We have also recently built a second similar, but somewhat lighter weight, C‐language implementation, which is included in our publically released garbage collector distribution. We describe the algorithms used in both, and give some performance measurements for the C version.
Hans-Juergen Boehm, Russell R. Atkinson, Michael F. Plass
Softw. Pract. Exp.1
1993 Space Efficient Conservative Garbage Collection
abstract
We call a garbage collector conservative if it has only partial information about the location of pointers, and is thus forced to treat arbitrary bit patterns as though they might be pointers, in at least some cases. We show that some very inexpensive, but previously unused techniques can have dramatic impact on the effectiveness of conservative garbage collectors in reclaiming memory. Our most significant observation is that static data that appears to point to the heap should not result in misidentified references to the heap. The garbage collector has enough information to allocate around such references. We also observe that programming style has a significant impact on the amount of spuriously retained storage, typically even if the collector is not terribly conservative. Some fairly common C and C programming styles significantly decrease the effectiveness of any garbage collector. These observations suffice to explain some of the different assessments of conservative collection that have appeared in the literature.
Hans-Juergen Boehm
PLDI1
1991 Mostly Parallel Garbage Collection
abstract
We present a method for adapting garbage collectors designed to run sequentially with the client, so that they may run concurrently with it.We rely on virtual memory hardware to provide information about pages that have been updated or "dirtied" during a given period of time.This method has been used to construct a mostly parallel trace-and-sweep collector that exhibits very short pause times.Performance measurements are given.
Hans-Juergen Boehm, Alan J. Demers, Scott Shenker
PLDI1
1990 Optimizing Programs over the Constructive Reals
abstract
The constructive reals provide programmers with a useful mechanism for prototyping numerical programs, and for experimenting with numerical algorithms. Unfortunately, the performance of current implementations is inadequate for some potential applications. In particular, these implementations tend to be space inefficient, in that they essentially require a complete computation history to be maintained.
Vernon A. Lee Jr., Hans-Juergen Boehm
PLDI2
1990 Combining Generational and Conservative Garbage Collection: Framework and Implementations
abstract
Two key ideas in garbage collection are generational collection and conservative pointer-finding. Generational collection and conservative pointer-finding are hard to use together, because generational collection is usually expressed in terms of copying objects, while conservative pointer-finding precludes copying. We present a new framework for defining garbage collectors. When applied to generational collection, it generalizes the notion of younger/older to a partial order. It can describe traditional generational and conservative techniques, and lends itself to combining different techniques in novel ways. We study in particular two new garbage collectors inspired by this framework. Both these collectors use conservative pointer-finding. The first one is based on a rewrite of an existing trace-and-sweep collector to use one level of generation. The second one has a single parameter, which controls how objects are partitioned into generations: the value of this parameter can be changed dynamically with no overhead. We have implemented both collectors and present measurements of their performance in practice.
Alan J. Demers, Mark D. Weiser, Barry Hayes, Hans-Juergen Boehm, Daniel G. Bobrow, Scott Shenker
POPL4
1989 Type Inference in the Presence of Type Abstraction
abstract
A number of recent programming language designs incorporate a type checking system based on the Girard-Reynolds polymorphic λ-calculus. This allows the construction of general purpose, reusable software without sacrificing compile-time type checking. A major factor constraining the implementation of these languages is the difficulty of automatically inferring the lengthy type information that is otherwise required if full use is made of these languages. There is no known algorithm to solve any natural and fully general formulation of this “type inference” problem. One very reasonable formulation of the problem is known to be undecidable.
Hans-Juergen Boehm
PLDI1
1988 Garbage Collection in an Uncooperative Environment
abstract
Abstract We describe a technique for storage allocation and garbage collection in the absence of significant co‐operation from the code using the allocator. This limits garbage collection overhead to the time actually required for garbage collection. In particular, application programs that rarely or never make use of the collector no longer encounter a substantial performance penalty. This approach greatly simplifies the implementation of languages supporting garbage collection. It further allows conventional compilers to be used with a garbage collector, either as the primary means of storage reclamation, or as a debugging tool. Our approach has two potential disadvantages. First, some garbage may fail to be reclaimed. Secondly, we use a ‘stop and collect’ approach, thus making the strategy unsuitable for applications with severe real‐time constraints. We argue that the first problem is, to some extent, inherent in any garbage collection system. Furthermore, based on our experience, it is usually not significant in practice. In spite of the second problem, we have had favourable experiences with interactive applications, including some that use a heap of several megabytes.
Hans-Juergen Boehm, Mark D. Weiser
Softw. Pract. Exp.1
1987 Parallel Attribute Grammar Evaluation
Hans-Juergen Boehm, Willy Zwaenepoel
ICDCS1
1987 Constructive real interpretation of numerical programs
abstract
We explore the feasibility of providing exact real arithmetic for use in conventional numerical programs. We have built a prototype interpreter which replaces floating point operations with operations on constructive real numbers in the execution of conventional Fortran programs. Such a facility makes it unnecessary to concern oneself with issues of numerical stability in the solution of small problems. It also provides a useful tool for the development of larger numerical programs.We discuss the computability and algorithmic issues involved in the design of the interpreter, as well as some preliminary experiences and performance measurements.
Hans-Juergen Boehm
PLDI1
1985 Partial Polymorphic Type Inference Is Undecidable
abstract
Polymorphic type systems combine the reliability and efficiency of static type-checking with the flexibility of dynamic type checking. Unfortunately, such languages tend to be unwieldy unless they accommodate omission of much of the information necessary to perform type checking. The automatic inference of omitted type information has emerged as one of the fundamental new implementation problems of these languages. We show here that a natural formalization of the problem is undecidable. The proof is directly applicable to some practical situations, and provides a partial explanation of the difficulties encountered in other cases.
Hans-Juergen Boehm
FOCS1
1985 Side Effects and Aliasing Can Have Simple Axiomatic Descriptions
abstract
We present a different style of axiomatic definition for programming languages. It is oriented toward imperative languages, such as Algol 68, that do not distinguish between statements and expressions. Rather than basing the logic on a notion of pre- or postcondition, we use the value of a programming language expression as the underlying primitive. A number of language constructs are examined in this framework. We argue that this style of definition gives us a significantly different view of the notion of “easy axiomatixability.” Side effects in expressions as well as aliasing between variables are shown to be “easily axiomatizable” in our system.
Hans-Juergen Boehm
ACM Trans. Program. Lang. Syst.1
1982 A Logic for Expressions with Side-Effects
abstract
This paper presents a simple programming logic LES, which is particularly well suited for reasoning about so-called expression languages, i.e. languages that incorporate imperative features into expressions rather than distinguishing between expressions and statements. An axiomatization of a simple programming language is presented using this formalism. It is shown that this axiomatization is relatively complete, roughly in the sense of [Coo 76].
Hans-Juergen Boehm
POPL1