Demo Data from EDBT 2026 / reviewers in the wild / expert
Craig Chambers
dblp:c/CraigChambers
· DBLP profile ↗
59ranked-venue papers
14as first author
0since 2021 · last 2015
—ORCID · none
Domains — the database's venue-derived domains; a paper can count in several
Software engineering, systems software and programming languages · 55 · 14 first-authorTheory of computation · 2Systems, architecture and hardware · 1Databases, data management, data science and information retrieval · 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
38 papers |
Programming languages and type systems · 42% Program analysis · 25% Compilers and program optimization · 21% | |
| Computer architecture, parallel and distributed computing, and storage systems
3 papers |
Parallel and multicore computing · 81% High-performance computing · 12% Distributed systems · 5% | |
| Databases, data mining, and information retrieval
1 paper |
Data stream processing · 100% |
Topics — the 30 heaviest of 74, each with the papers that count most for it
| Topic | Weight | Papers | Last | Evidence papers |
|---|---|---|---|---|
Programming languages and type systems › type checking
modular typechecking |
0.2 | 4 | 2006 | MultiJava: Design rationale, compiler implementation, and applications · ACM Trans. Program. Lang. Syst. 2006 Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004 Relaxed MultiJava: balancing extensibility and modular typechecking · OOPSLA 2003 |
Programming languages and type systems › method dispatch
multiple dispatch |
0.2 | 5 | 2006 | MultiJava: Design rationale, compiler implementation, and applications · ACM Trans. Program. Lang. Syst. 2006 Relaxed MultiJava: balancing extensibility and modular typechecking · OOPSLA 2003 MultiJava: modular open classes and symmetric multiple dispatch for Java · OOPSLA 2000 |
Program analysis › static analysis
pointer analysis |
0.2 | 5 | 2005 | Program Slicing with Dynamic Points-To Sets · IEEE Trans. Software Eng. 2005 Improving program slicing with dynamic points-to data · SIGSOFT FSE 2002 Alias annotations for program understanding · OOPSLA 2002 |
Program analysis
data flow analysis |
0.2 | 3 | 2007 | Automatic inference of optimizer flow functions from semantic meanings · PLDI 2007 Automated soundness proofs for dataflow analyses and transformations via local rules · POPL 2005 Composing dataflow analyses and transformations · POPL 2002 |
Program analysis
static analysis |
0.2 | 4 | 2005 | Program Slicing with Dynamic Points-To Sets · IEEE Trans. Software Eng. 2005 Improving program slicing with dynamic points-to data · SIGSOFT FSE 2002 Alias annotations for program understanding · OOPSLA 2002 |
Programming languages and type systems
type systems |
0.1 | 3 | 2006 | MultiJava: Design rationale, compiler implementation, and applications · ACM Trans. Program. Lang. Syst. 2006 Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004 Alias annotations for program understanding · OOPSLA 2002 |
Parallel and multicore computing
data-parallel programming |
0.1 | 1 | 2010 | FlumeJava: easy, efficient data-parallel pipelines · PLDI 2010 |
Parallel and multicore computing
parallel programming models |
0.1 | 1 | 2010 | FlumeJava: easy, efficient data-parallel pipelines · PLDI 2010 |
Runtime systems and virtual machines
dynamic compilation |
0.1 | 4 | 2000 | The benefits and costs of DyC's run-time optimizations · ACM Trans. Program. Lang. Syst. 2000 Calpa: a tool for automating selective dynamic compilation · MICRO 2000 An Evaluation of Staged Run-Time Optimizations in DyC · PLDI 1999 |
Compilers and program optimization
compiler optimization |
0.1 | 2 | 2005 | Automated soundness proofs for dataflow analyses and transformations via local rules · POPL 2005 Composing dataflow analyses and transformations · POPL 2002 |
Program analysis › static analysis
program slicing |
0.1 | 2 | 2005 | Program Slicing with Dynamic Points-To Sets · IEEE Trans. Software Eng. 2005 Improving program slicing with dynamic points-to data · SIGSOFT FSE 2002 |
Programming languages and type systems › programming paradigms › imperative languages
c |
0.1 | 1 | 2008 | A theory of platform-dependent low-level software · POPL 2008 |
Programming languages and type systems
language semantics |
0.1 | 1 | 2008 | A theory of platform-dependent low-level software · POPL 2008 |
Program analysis › static analysis
call graph construction |
0.1 | 4 | 2005 | A framework for call graph construction algorithms · ACM Trans. Program. Lang. Syst. 2001 Call Graph Construction in Object-Oriented Languages · OOPSLA 1997 Program Slicing with Dynamic Points-To Sets · IEEE Trans. Software Eng. 2005 |
Program synthesis and code generation
search-based program synthesis |
0.1 | 1 | 2007 | Searching for type-error messages · PLDI 2007 |
Compilers and program optimization › verified compilation
translation validation |
0.1 | 1 | 2007 | Automatic inference of optimizer flow functions from semantic meanings · PLDI 2007 |
Programming languages and type systems
type inference |
0.1 | 1 | 2007 | Searching for type-error messages · PLDI 2007 |
Program analysis › static analysis
interprocedural analysis |
0.1 | 3 | 2001 | A framework for call graph construction algorithms · ACM Trans. Program. Lang. Syst. 2001 Fast Interprocedural Class Analysis · POPL 1998 Call Graph Construction in Object-Oriented Languages · OOPSLA 1997 |
Programming languages and type systems › object-oriented programming
object-oriented language design |
0.1 | 2 | 2006 | MultiJava: Design rationale, compiler implementation, and applications · ACM Trans. Program. Lang. Syst. 2006 Typechecking and Modules for Multi-Methods · OOPSLA 1994 |
Compilers and program optimization
partial evaluation |
0.1 | 2 | 2002 | Towards automatic construction of staged compilers · POPL 2002 The benefits and costs of DyC's run-time optimizations · ACM Trans. Program. Lang. Syst. 2000 |
Compilers and program optimization
dynamic optimization |
0.1 | 3 | 2000 | The benefits and costs of DyC's run-time optimizations · ACM Trans. Program. Lang. Syst. 2000 An Evaluation of Staged Run-Time Optimizations in DyC · PLDI 1999 Making Pure Object-Oriented Languages Practical · OOPSLA 1991 |
Programming languages and type systems
data types |
0.0 | 1 | 2004 | Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004 |
Programming languages and type systems › type systems
extensible data types |
0.0 | 1 | 2004 | Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004 |
Programming languages and type systems
language design |
0.0 | 2 | 2002 | ArchJava: connecting software architecture to implementation · ICSE 2002 A Debate on Language and Tool Support for Design Patterns · POPL 2000 |
Compilers and program optimization › compiler correctness
compiler optimization correctness |
0.0 | 1 | 2003 | Automatically proving the correctness of compiler optimizations · PLDI 2003 |
Programming languages and type systems
extensibility |
0.0 | 1 | 2003 | Relaxed MultiJava: balancing extensibility and modular typechecking · OOPSLA 2003 |
Compilers and program optimization › dynamic optimization
profile-guided optimization |
0.0 | 2 | 2000 | Calpa: a tool for automating selective dynamic compilation · MICRO 2000 Profile-Guided Receiver Class Prediction · OOPSLA 1995 |
Compilers and program optimization › compiler optimization › type-based optimization
dynamic dispatch optimization |
0.0 | 4 | 1995 | Selective Specialization for Object-Oriented Languages · PLDI 1995 Profile-Guided Receiver Class Prediction · OOPSLA 1995 Iterative Type Analysis and Extended Message Splitting: Optimizing Dynamically-Typed Object-Oriented Programs · PLDI 1990 |
Programming languages and type systems › object-oriented programming
object-oriented language features |
0.0 | 2 | 2004 | Efficient Multiple and Predicated Dispatching · OOPSLA 1999 Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004 |
Requirements engineering and software design › software architecture
architecture-implementation conformance |
0.0 | 1 | 2002 | ArchJava: connecting software architecture to implementation · ICSE 2002 |
Methods — techniques the papers use, named apart from their topics
windowing semantics · 0.2dataflow model · 0.2mapreduce · 0.1dataflow graph optimization · 0.1formal semantics · 0.1type checking · 0.1oracle-based search · 0.1declarative flow functions · 0.1dataflow fact schemas · 0.1dead-assignment elimination · 0.1static type checking · 0.1multiple dispatch · 0.1data flow analysis · 0.1dynamic function pointer analysis · 0.1self-describing semi-structured messages · 0.0core language formalization · 0.0
| Year | Publication | Venue | Position |
|---|---|---|---|
| 2015 | The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data ProcessingabstractUnbounded, unordered, global-scale datasets are increasingly common in day-to-day business (e.g. Web logs, mobile usage statistics, and sensor networks). At the same time, consumers of these datasets have evolved sophisticated requirements, such as event-time ordering and windowing by features of the data themselves, in addition to an insatiable hunger for faster answers. Meanwhile, practicality dictates that one can never fully optimize along all dimensions of correctness, latency, and cost for these types of input. As a result, data processing practitioners are left with the quandary of how to reconcile the tensions between these seemingly competing propositions, often resulting in disparate implementations and systems. We propose that a fundamental shift of approach is necessary to deal with these evolved requirements in modern data processing. We as a field must stop trying to groom unbounded datasets into finite pools of information that eventually become complete, and instead live and breathe under the assumption that we will never know if or when we have seen all of our data, only that new data will arrive, old data may be retracted, and the only way to make this problem tractable is via principled abstractions that allow the practitioner the choice of appropriate tradeoffs along the axes of interest: correctness, latency, and cost. In this paper, we present one such approach, the Dataflow Model, along with a detailed examination of the semantics it enables, an overview of the core principles that guided its design, and a validation of the model itself via the real-world experiences that led to its development. Tyler Akidau, Robert Bradshaw, Craig Chambers, Slava Chernyak, Rafael Fernández-Moctezuma, Reuven Lax, Sam McVeety, Daniel Mills, Frances Perry, Eric Schmidt 0001, Sam Whittle |
Proc. VLDB Endow. | 3 |
| 2011 | Expressiveness, Simplicity, and Users
Craig Chambers |
ECOOP | 1 |
| 2010 | FlumeJava: easy, efficient data-parallel pipelinesabstractMapReduce and similar systems significantly ease the task of writing data-parallel code. However, many real-world computations require a pipeline of MapReduces, and programming and managing such pipelines can be difficult. We present FlumeJava, a Java library that makes it easy to develop, test, and run efficient data-parallel pipelines. At the core of the FlumeJava library are a couple of classes that represent immutable parallel collections, each supporting a modest number of operations for processing them in parallel. Parallel collections and their operations present a simple, high-level, uniform abstraction over different data representations and execution strategies. To enable parallel operations to run efficiently, FlumeJava defers their evaluation, instead internally constructing an execution plan dataflow graph. When the final results of the parallel operations are eventually needed, FlumeJava first optimizes the execution plan, and then executes the optimized operations on appropriate underlying primitives (e.g., MapReduces). The combination of high-level abstractions for parallel data and computation, deferred evaluation and optimization, and efficient parallel primitives yields an easy-to-use system that approaches the efficiency of hand-optimized pipelines. FlumeJava is in active use by hundreds of pipeline developers within Google. Craig Chambers, Ashish Raniwala, Frances Perry, Stephen Adams 0001, Robert R. Henry 0001, Robert Bradshaw, Nathan Weizenbaum |
PLDI | 1 |
| 2008 | A theory of platform-dependent low-level softwareabstractThe C language definition leaves the sizes and layouts of types partially unspecified. When a C program makes assumptions about type layout, its semantics is defined only on platforms (C compilers and the underlying hardware) on which those assumptions hold. Previous work on formalizing C-like languages has ignored this issue, either by assuming that programs do not make such assumptions or by assuming that all valid programs target only one platform. In the latter case, the platform's choices are hard-wired in the language semantics. Marius Nita, Dan Grossman, Craig Chambers |
POPL | 3 |
| 2007 | Searching for type-error messagesabstractAdvanced type systems often need some form of type inference to reduce the burden of explicit typing, but type inference often leads to poor error messages for ill-typed programs. This work pursues a new approach to constructing compilers and presenting type-error messages in which the type-checker itself does not produce the messages. Instead, it is an oracle for a search procedure that finds similar programs that do type-check. Our two-fold goal is to improve error messages while simplifying compiler construction. Our primary implementation and evaluation is for Caml, a language with full type inference. We also present a prototype for C++ template functions, where type instantiation is implicit. A key extension is making our approach robust even when the program has multiple independent type errors. Benjamin S. Lerner, Matthew Flower, Dan Grossman, Craig Chambers |
PLDI | 4 |
| 2007 | Automatic inference of optimizer flow functions from semantic meaningsabstractPrevious work presented a language called Rhodium for writing program analyses and transformations, in the form of declarative flow functions that propagate instances of user-defined dataflow fact schemas. Each dataflow fact schema specifies a semantic meaning, which allows the Rhodium system to automatically verify the correctness of the user's flow functions. In this work, we have reversed the roles of the flow functions and semantic meanings: rather than checking the correctness of the user-written flow functions using the facts' semantic meanings, we automatically infer correct flow functions solely from the meanings of the dataflow fact schemas. We have implemented our algorithm for inferring flow functions from fact schemas in the context of the Whirlwind compiler, and have used this implementation to infer flow functions for a variety of fact schemas. The automatically generated flow functions cover most of the situations covered by an earlier suite of handwritten rules. Erika Rice Scherpelz, Sorin Lerner, Craig Chambers |
PLDI | 3 |
| 2006 | Parameterized Modules for Classes and Extensible Functions
Keunwoo Lee, Craig Chambers |
ECOOP | 2 |
| 2006 | MultiJava: Design rationale, compiler implementation, and applicationsabstractMultiJava is a conservative extension of the Java programming language that adds symmetric multiple dispatch and open classes. Among other benefits, multiple dispatch provides a solution to the binary method problem. Open classes provide a solution to the extensibility problem of object-oriented programming languages, allowing the modular addition of both new types and new operations to an existing type hierarchy. This article illustrates and motivates the design of MultiJava and describes its modular static typechecking and modular compilation strategies. Although MultiJava extends Java, the key ideas of the language design are applicable to other object-oriented languages, such as C# and C++, and even, with some modifications, to functional languages such as ML.This article also discusses the variety of application domains in which MultiJava has been successfully used by others, including pervasive computing, graphical user interfaces, and compilers. MultiJava allows users to express desired programming idioms in a way that is declarative and supports static typechecking, in contrast to the tedious and type-unsafe workarounds required in Java. MultiJava also provides opportunities for new kinds of extensibility that are not easily available in Java. Curtis Clifton, Todd D. Millstein, Gary T. Leavens, Craig Chambers |
ACM Trans. Program. Lang. Syst. | 4 |
| 2005 | Automated soundness proofs for dataflow analyses and transformations via local rulesabstractWe present Rhodium, a new language for writing compiler optimizations that can be automatically proved sound. Unlike our previous work on Cobalt, Rhodium expresses optimizations using explicit dataflow facts manipulated by local propagation and transformation rules. This new style allows Rhodium optimizations to be mutually recursively defined, to be automatically composed, to be interpreted in both flow-sensitive and -insensitive ways, and to be applied interprocedurally given a separate context-sensitivity strategy, all while retaining soundness. Rhodium also supports infinite analysis domains while guaranteeing termination of analysis. We have implemented a soundness checker for Rhodium and have specified and automatically proven the soundness of all of Cobalt's optimizations plus a variety of optimizations not expressible in Cobalt, including Andersen's points-to analysis, arithmetic-invariant detection, loop-induction-variable strength reduction, and redundant array load elimination. Sorin Lerner, Todd D. Millstein, Erika Rice, Craig Chambers |
POPL | 4 |
| 2005 | Program Slicing with Dynamic Points-To SetsabstractProgram slicing is a potentially useful analysis for aiding program understanding. However, in reality even slices of small programs are often too large to be useful. Imprecise pointer analyses have been suggested as one cause of this problem. In this paper, we use dynamic points-to data, which represents optimistic pointer information, to obtain a bound on the best case slice size improvement that can be achieved with improved pointer precision. Our experiments show that slice size can be reduced significantly for programs that make frequent use of calls through function pointers because for them the dynamic pointer data results in a considerably smaller call graph, which leads to fewer data dependences. Programs without or with only few calls through function pointers, however, show considerably less improvement. We discovered that C programs appear to have a significant fraction of direct and nonspurious pointer data dependences so that reducing spurious dependences via pointers is only of limited benefit. Consequently, to make slicing useful in general for such programs, improvements beyond better pointer analyses are necessary. On the other hand, since we show that collecting dynamic function pointer information can be performed with little overhead (average slowdown of 10 percent for our benchmarks), dynamic pointer information may be a practical approach to making slicing of programs with frequent function pointer use more successful in practice. Markus Mock, Darren C. Atkinson, Craig Chambers, Susan J. Eggers |
IEEE Trans. Software Eng. | 3 |
| 2004 | Ownership Domains: Separating Aliasing Policy from Mechanism
Jonathan Aldrich, Craig Chambers |
ECOOP | 2 |
| 2004 | Modular typechecking for hierarchically extensible datatypes and functionsabstractOne promising approach for adding object-oriented (OO) facilities to functional languages like ML is to generalize the existing datatype and function constructs to be hierarchical and extensible, so that datatype variants simulate classes and function cases simulate methods. This approach allows existing datatypes to be easily extended with both new operations and new variants, resolving a longstanding conflict between the functional and OO styles. However, previous designs based on this approach have been forced to give upmodulartypechecking, requiring whole-program checks to ensure type safety. We describe Extensible ML (EML), an ML-like language that supports hierarchical, extensible datatypes and functions while preserving purely modular typechecking. To achieve this result,EML's type system imposes a few requirements on datatype and function extensibility, but EML is still able to express both traditional functional and OO idioms. We have formalized a core version of EML and proven the associated type system sound, and we have developed a prototype interpreter for the language. Todd D. Millstein, Colin Bleckner, Craig Chambers |
ACM Trans. Program. Lang. Syst. | 3 |
| 2003 | Language Support for Connector Abstractions
Jonathan Aldrich, Vibha Sazawal, Craig Chambers, David Notkin |
ECOOP | 3 |
| 2003 | HydroJ: object-oriented pattern matching for evolvable distributed systemsabstractIn an evolving software system, components must be able to change independently while remaining compatible with their peers. One obstacle to independent evolution is the brittle parameter problem: the ability of two components to communicate can depend on a number of inessential details of the types, structure, and/or contents of the values communicated. If these details change, then the components can no longer communicate, even if the essential parts of the message remain unaffected.We present HydroJ, an extension of Java that addresses this problem. In HydroJ, components communicate using self-describing, semi-structured messages, and programmers use pattern matching to define the handling of messages. This design stems from two central ideas: first, that self-describing messages reduce dependence on inessential message format details; and second, that object-oriented pattern matching naturally focuses on the essential information in a message and is insensitive to inessential information.We have developed these ideas in the context of Rain, a distributed, heterogeneous messaging system for ubiquitous computing. To evaluate the design, we have constructed a prototype HydroJ compiler, implemented some Rain services in HydroJ, studied the evolution of an existing Rain service over time, and formalized HydroJ's key features in a core language. Keunwoo Lee, Anthony LaMarca, Craig Chambers |
OOPSLA | 3 |
| 2003 | Relaxed MultiJava: balancing extensibility and modular typecheckingabstractWe present the rationale, design, and implementation of Relaxed MultiJava (RMJ), a backward-compatible extension of Java that allows programmers to add new methods to existing classes and to write multimethods. Previous languages supporting these forms of extensibility either restrict their usage to a limited set of programming idioms that can be modularly typechecked (and modularly compiled) or simply forego modular typechecking altogether. In contrast, RMJ supports the new language features in a virtually unrestricted form while still providing mostly-modular static typechecking and fully-modular compilation. In some cases, the RMJ compiler will warn that the potential for a type error exists, but it will still complete compilation. In those cases, a custom class loader transparently performs load-time checking to verify that the potential error is never realized. RMJ's compiler and custom loader cooperate to keep load-time checking costs low. We report on qualitative and quantitative experience with our implementation of RMJ. Todd D. Millstein, Mark Reay, Craig Chambers |
OOPSLA | 3 |
| 2003 | Automatically proving the correctness of compiler optimizationsabstractWe describe a technique for automatically proving compiler optimizations sound, meaning that their transformations are always semantics-preserving. We first present a domain-specific language, called Cobalt, for implementing optimizations as guarded rewrite rules. Cobalt optimizations operate over a C-like intermediate representation including unstructured control flow, pointers to local variables and dynamically allocated memory, and recursive procedures. Then we describe a technique for automatically proving the soundness of Cobalt optimizations. Our technique requires an automatic theorem prover to discharge a small set of simple, optimization-specific proof obligations for each optimization. We have written a variety of forward and backward intraprocedural dataflow optimizations in Cobalt, including constant propagation and folding, branch folding, full and partial redundancy elimination, full and partial dead assignment elimination, and simple forms of points-to analysis. We implemented our soundness-checking strategy using the Simplify automatic theorem prover, and we have used this implementation to automatically prove our optimizations correct. Our checker found many subtle bugs during the course of developing our optimizations. We also implemented an execution engine for Cobalt optimizations as part of the Whirlwind compiler infrastructure. Sorin Lerner, Todd D. Millstein, Craig Chambers |
PLDI | 3 |
| 2003 | Comprehensive synchronization elimination for Java
Jonathan Aldrich, Emin Gün Sirer, Craig Chambers, Susan J. Eggers |
Sci. Comput. Program. | 3 |
| 2002 | Architectural Reasoning in ArchJava
Jonathan Aldrich, Craig Chambers, David Notkin |
ECOOP | 2 |
| 2002 | Modular typechecking for hierarchically extensible datatypes and functionsabstractOne promising approach for adding object-oriented (OO) facilities to functional languages like ML is to generalize the existing datatype and function constructs to be hierarchical and extensible, so that datatype variants simulate classes and function cases simulate methods. This approach allows existing datatypes to be easily extended with both new operations and new variants, resolving a long-standing conflict between the functional and OO styles. However, previous designs based on this approach have been forced to give up modular typechecking, requiring whole-program checks to ensure type safety. We describe Extensible ML (eml), an ML-like language that supports hierarchical, extensible datatypes and functions while preserving purely modular typechecking. To achieve this result, eml's type system imposes a few requirements on datatype and function extensibility, but eml is still able to express both traditional functional and OO idioms. We have formalized a core version of eml and proven the associated type system sound, and we have developed a prototype interpreter for the language. Todd D. Millstein, Colin Bleckner, Craig Chambers |
ICFP | 3 |
| 2002 | ArchJava: connecting software architecture to implementationabstractSoftware architecture describes the structure of a system, enabling more effective design, program understanding, and formal analysis. However, existing approaches decouple implementation code from architecture, allowing inconsistencies, causing confusion, violating architectural properties, and inhibiting software evolution. ArchJava is an extension to Java that seamlessly unifies software architecture with implementation, ensuring that the implementation conforms to architectural constraints. A case study applying ArchJava to a circuit-design application suggests that ArchJava can express architectural structure effectively within an implementation, and that it can aid in program understanding and software evolution. Jonathan Aldrich, Craig Chambers, David Notkin |
ICSE | 2 |
| 2002 | Alias annotations for program understandingabstractOne of the primary challenges in building and evolving large object-oriented systems is understanding aliasing between objects. Unexpected aliasing can lead to broken invariants, mistaken assumptions, security holes, and surprising side effects, all of which may lead to software defects and complicate software evolution.This paper presents AliasJava, a capability-based alias annotation system for Java that makes alias patterns explicit in the source code, enabling developers to reason more effectively about the interactions in a complex system. We describe our implementation, prove the soundness of the annotation system, and give an algorithm for automatically inferring alias annotations. Our experience suggests that the annotation system is practical, that annotation inference is efficient and yields appropriate annotations, and that the annotations can express important invariants of data structures and of software architectures. Jonathan Aldrich, Valentin Kostadinov, Craig Chambers |
OOPSLA | 3 |
| 2002 | Staged compilationabstractTraditional compilers compile and optimize files separately, making worst-case assumptions about the program context in which a file is to be linked. More aggressive compilation architectures perform cross-file interprocedural or whole-program analyses, potentially producing much faster programs but substantially increasing the cost of compilation. Even more radical are systems that perform all compilation and optimization at run-time: such systems can optimize programs based on run-time program and system properties as well as static whole-program properties. However, run-time compilers (also called dynamic compilers or just-in-time compilers) suffer under severe constraints on allowable compilation time, since any time spent compiling steals from time spent running the program. None of these compilation models dominates the others: each has unique strengths and weaknesses not present in the other models.We are developing a new, staged compilation model which strives to combine high run-time code quality with low compilation overhead. Compilation is organized as a series of stages, with stages corresponding to, for example, separate compilation, library linking, program linking, and run-time execution. Any given optimization can be performed at any of these stages; to reduce compilation time while maintaining high effectiveness, an optimization should be performed at the earliest stage that provides the necessary program context information to carry out the optimization effectively. Moreover, a single optimization can itself be spread across multiple stages, with earlier stages performing preplanning work that enables the final stage to complete the optimization quickly. In this way, we hope to produce highly optimized programs, nearly as good as what could be done with a purely run-time compiler that had an unconstrained compilation time budget, but at a much more practical compile time cost.We are building the Whirlwind optimizing compiler as the concrete embodiment of this staged compilation model, initially targeting object-oriented languages. A key component of Whirlwind is a set of techniques for automatically constructing staged compilers from traditional unstaged compilers, including aggressive applications of specialization and other partial evaluation technology. Craig Chambers |
PEPM | 1 |
| 2002 | Composing dataflow analyses and transformationsabstractDataflow analyses can have mutually beneficial interactions. Previous efforts to exploit these interactions have either (1) iteratively performed each individual analysis until no further improvements are discovered or (2) developed "super-analyses" that manually combine conceptually separate analyses. We have devised a new approach that allows analyses to be defined independently while still enabling them to be combined automatically and profitably. Our approach avoids the loss of precision associated with iterating individual analyses and the implementation difficulties of manually writing a super-analysis. The key to our approach is a novel method of implicit communication between the individual components of a super-analysis based on graph transformations. In this paper, we precisely define our approach; we demonstrate that it is sound and it terminates; finally we give experimental results showing that in practice (1) our framework produces results at least as precise as iterating the individual analyses while compiling at least 5 times faster, and (2) our framework achieves the same precision as a manually written super-analysis while incurring a compile-time overhead of less than 20%. Sorin Lerner, David Grove, Craig Chambers |
POPL | 3 |
| 2002 | Towards automatic construction of staged compilersabstractSome compilation systems, such as offline partial evaluators and selective dynamic compilation systems, support staged optimizations. A staged optimization is one where a logically single optimization is broken up into stages, with the early stage(s) performing preplanning set-up work, given any available partial knowledge about the program to be compiled, and the final stage completing the optimization. The final stage can be much faster than the original optimization by having much of its work performed by the early stages. A key limitation of current staged optimizers is that they are written by hand, sometimes in an ad hoc manner. We have developed a framework called the Staged Compilation Framework (SCF) for systematically and automatically converting single-stage optimizations into staged versions. The framework is based on a combination of aggressive partial evaluation and dead-assignment elimination. We have implemented SCF in Standard ML. A preliminary evaluation shows that SCF can speed up classical optimization of some commonly used C functions by up to 12× (and typically between 4.5× and 5.5×). Matthai Philipose, Craig Chambers, Susan J. Eggers |
POPL | 2 |
| 2002 | Improving program slicing with dynamic points-to dataabstractProgram slicing is a potentially useful analysis for aiding program understanding. However, slices of even small programs are often too large to be generally useful. Imprecise pointer analyses have been suggested as one cause of this problem. In this paper, we use dynamic points-to data, which represents optimal or optimistic pointer information, to obtain a bound on the best case slice size improvement that can be achieved with improved pointer precision. Our experiments show that slice size can be reduced significantly for programs that make frequent use of calls through function pointers because for them the dynamic pointer data results in a considerably smaller call graph, which leads to fewer data dependences. Programs without or with only few calls through function pointers, however, show only insignificant improvement. We identified Amdahl's law as the reason for this behavior: C programs appear to have a large fraction of direct data dependences so that reducing spurious dependences via pointers is only of limited benefit. Consequently, to make slicing useful in general for such programs, improvements beyond better pointer analyses will be necessary. On the other hand, since we show that collecting dynamic function pointer information can be performed with little overhead (average slowdown of 10% for our benchmarks), dynamic pointer information may be a practical approach to making slicing of programs with frequent function pointer use more successful in reality. Markus Mock, Darren C. Atkinson, Craig Chambers, Susan J. Eggers |
SIGSOFT FSE | 3 |
| 2002 | Modular Statically Typed Multimethods
Todd D. Millstein, Craig Chambers |
Inf. Comput. | 2 |
| 2001 | Dynamic points-to sets: a comparison with static analyses and potential applications in program understanding and optimizationabstractIn this paper, we compare the behavior of pointers in C programs, as approximated by static pointer analysis algorithms, with the actual behavior of pointers when these programs are run. In order to perform this comparison, we have implemented several well known pointer analysis algorithms, and we have built an instrumentation infrastructure for tracking pointer values during program execution. Markus Mock, Manuvir Das, Craig Chambers, Susan J. Eggers |
PASTE | 3 |
| 2001 | A framework for call graph construction algorithmsabstractA large number of call graph construction algorithms for object-oriented and functional languages have been proposed, each embodying different tradeoffs between analysis cost and call graph precision. In this article we present a unifying framework for understanding call graph construction algorithms and an empirical comparison of a representative set of algorithms. We first present a general parameterized algorithm that encompasses many well-known and novel call graph construction algorithms. We have implemented this general algorithm in the Vortex compiler infrastructure, a mature, multilanguage, optimizing compiler. The Vortex implementation provides a "level playing field" for meaningful cross-algorithm performance comparisons. The costs and benefits of a number of call graph construction algorithms are empirically assessed by applying their Vortex implementation to a suite of sizeable (5,000 to 50,000 lines of code) Cecil and Java programs. For many of these applications, interprocedural analysis enabled substantial speed-ups over an already highly optimized baseline. Furthermore, a significant fraction of these speed-ups can be obtained through the use of a scalable, near-linear time call graph construction algorithm. David Grove, Craig Chambers |
ACM Trans. Program. Lang. Syst. | 2 |
| 2000 | Calpa: a tool for automating selective dynamic compilationabstractSelective dynamic compilation systems, typically driven by annotations that identify run-time constants, can achieve significant program speedups. However, manually inserting annotations is a tedious and time-consuming process that requires careful inspection of a program's static characteristics and run-time behavior and much trial and error in order to select the most beneficial annotations. Calpa is a system that generates annotations automatically for the DyC dynamic compiler. Calpa combines execution frequency and value profile information with a model of dynamic compilation cost and dynamically generated code benefit to choose run-time constants and other dynamic compilation strategies. For the programs tested so far, Calpa generates annotations of the same or better quality as those found by a human, but in a fraction of the time. The result was equal or-better program speedups from dynamic compilation, but without the need for programmer intervention. Markus Mock, Craig Chambers, Susan J. Eggers |
MICRO | 2 |
| 2000 | MultiJava: modular open classes and symmetric multiple dispatch for JavaabstractWe present MultiJava, a backward-compatible extension to Java supporting open classes and symmetric multiple dispatch. Open classes allow one to add to the set of methods that an existing class supports without creating distinct subclasses or editing existing code. Unlike the "Visitor" design pattern, open classes do not require advance planning, and open classes preserve the ability to add new subclasses modularly and safely. Multiple dispatch offers several well-known advantages over the single dispatching of conventional object-oriented languages, including a simple solution to some kinds of "binary method" problems. MultiJava's multiple dispatch retains Java's existing class-based encapsulation properties. We adapt previous theoretical work to allow compilation units to be statically typechecked modularly and safely, ruling out any link-time or run-time type errors. We also present a n compilation scheme that operates modularly and incurs performance overhead only where open classes or multiple dispatching are actually used. Curtis Clifton, Gary T. Leavens, Craig Chambers, Todd D. Millstein |
OOPSLA | 3 |
| 2000 | A Debate on Language and Tool Support for Design PatternsabstractDesign patterns have earned a place in the developer's arsenal of tools and techniques for software development. They have proved so useful, in fact, that some have called for their promotion to programming language features. In turn this has rekindled the age-old debate over the mechanism that belong in programming languages versus those that are better served by tools. The debate comes full circle when one contemplates code generation and methodological tool support for patterns. The authors compare and contrast programming languages, tools, and patterns to assess their relative merits and to clarify their roles in the development process. Craig Chambers, Bill Harrison, John M. Vlissides |
POPL | 1 |
| 2000 | DyC: an expressive annotation-directed dynamic compiler for C
Brian Grant, Markus Mock, Matthai Philipose, Craig Chambers, Susan J. Eggers |
Theor. Comput. Sci. | 4 |
| 2000 | The benefits and costs of DyC's run-time optimizationsabstractDyC selectively dynamically compiles programs during their execution, utilizing the run-time-computed values of variables and data structures to apply optimizations that are based on partial evaluation. The dynamic optimizations are preplanned at static compile time in order to reduce their run-time cost; we call this staging . DyC's staged optimizations include (1) an advanced binding-time analysis that supports polyvariant specialization (enabling both single-way and multiway complete loop unrolling), polyvariant division, static loads, and static calls, (2) low-cost, dynamic versions of traditional global optimizations, such as zero and copy propagation and dead-assignment elimination, and (3) dynamic peephole optimizations, such as strength reduction. Because of this large suite of optimizations and its low dynamic compilation overhead, DyC achieves good performance improvements on programs that are larger and more complex than the kernels previously targeted by other dynamic compilation systems. This paper evaluates the benefits and costs of applying DyC's optimizations. We assess their impact on the performance of a variety of small to medium-sized programs, both for the regions of code that are actually transformed and for the entire application as a whole. Our study includes an analysis of the contribution to performance of individual optimizations, the performance effect of changing the applications' inputs, and a detailed accounting of dynamic compilation costs. Brian Grant, Markus Mock, Matthai Philipose, Craig Chambers, Susan J. Eggers |
ACM Trans. Program. Lang. Syst. | 4 |
| 1999 | Modular Statically Typed Multimethods
Todd D. Millstein, Craig Chambers |
ECOOP | 2 |
| 1999 | Efficient Multiple and Predicated DispatchingabstractThe speed of message dispatching is an important issue in the overall performance of object-oriented programs. We have developed an algorithm for constructing efficient dispatch functions that combines novel algorithms for efficient single dispatching, multiple dispatching, and predicate dispatching. Our algorithm first reduces methods written in the general predicate dispatching model (which generalizes single dispatching, multiple dispatching, predicate classes and classifiers, and pattern-matching) into ones written using a simpler multimethod dispatching model. Our algorithm then computes a strategy for implementing multiple dispatching in terms of sequences of single dispatches, representing the strategy as a lookup DAG. Finally, our algorithm computes an implementation strategy separately for each of the single dispatches, producing for each dispatch a dispatch tree, which is a binary decision tree blending class identity tests, class range tests, and table lookups. Our algorithm exploits any available static information (from type declarations or class analysis) to prune unreachable paths from the lookup DAG, and uses any available dynamic profile information to minimize the expected time to search the dispatch trees. We measure the effectiveness of our dispatching algorithms on a collection of large Cecil programs, compiled by the Vortex optimizing compiler, showing improvements of up to 30% over already heavily optimized baseline versions. Craig Chambers, Weimin Chen 0004 |
OOPSLA | 1 |
| 1999 | An Evaluation of Staged Run-Time Optimizations in DyCabstractPrevious selective dynamic compilation systems have demonstrated that dynamic compilation can achieve performance improvements at low cost on small kernels, but they have had difficulty scaling to larger programs. To overcome this limitation, we developed DyC, a selective dynamic compilation system that includes more sophisticated and flexible analyses and transformations. DyC is able to achieve good performance improvements on programs that are much larger and more complex than the kernels. We analyze the individual optimizations of DyC and assess their impact on performance collectively and individually. Brian Grant, Matthai Philipose, Markus Mock, Craig Chambers, Susan J. Eggers |
PLDI | 4 |
| 1999 | Static Analyses for Eliminating Unnecessary Synchronization from Java Programs
Jonathan Aldrich, Craig Chambers, Emin Gün Sirer, Susan J. Eggers |
SAS | 2 |
| 1998 | Predicate Dispatching: A Unified Theory of Dispatch
Michael D. Ernst, Craig S. Kaplan, Craig Chambers |
ECOOP | 3 |
| 1998 | Fast Interprocedural Class AnalysisabstractPrevious algorithms for interprocedural control flow analysis of higher-order and/or object-oriented languages have been described that perform propagation or constraint satisfaction and take O(N3) time (such as Shivers's O-CFA and Heintze's set-based analysis), or unification and take O(Nα (N,N) time (such as Steensgaard's pointer analysis), or optimistic reachability analysis and take O(N) time (such as Bacon and Sweeney's Rapid Type Analysis). We describe a general parameterized analysis framework that integrates propagation-based and unification-based analysis primitives and optimistic reachability analysis, whose instances mimic these existing algorithms as well as several new algorithms taking O(N), O(Nα(N,N)), O(N2), and O(N2α(N,N)) time; our O(N) and O(Nα(N,N)) algorithms produce more precise results than the previous algorithms with these complexities. We implemented our algorithm framework in the Vortex optimizing compiler, and we measured the cost and benefit of these interprocedural analysis algorithms in practice on a collection of substantial Cecil and Java programs. Greg DeFouw, David Grove, Craig Chambers |
POPL | 3 |
| 1997 | Call Graph Construction in Object-Oriented LanguagesabstractInterprocedural analyses enable optimizing compilers to more precisely model the effects of non-inlined procedure calls, potentially resulting in substantial increases in application performance. Applying interprocedural analysis to programs written in object-oriented or functional languages is complicated by the difficulty of constructing an accurate program call graph. This paper presents a parameterized algorithmic framework for call graph construction in the presence of message sends and/or first class functions. We use this framework to describe and to implement a number of well-known and new algorithms. We then empirically assess these algorithms by applying them to a suite of medium-sized programs written in Cecil and Java, reporting on the relative cost of the analyses, the relative precision of the constructed call graphs, and the impact of this precision on the effectiveness of a number of interprocedural optimizations. David Grove, Greg DeFouw, Jeffrey Dean, Craig Chambers |
OOPSLA | 4 |
| 1997 | Annotation-Directed Run-Time Specialization in CabstractWe present the design of a dynamic compilation system for C. Directed by a few declarative user annotations specifying where and on what dynamic compilation is to take place, a binding time analysis computes the set of run-time constants at each program point in each annotated procedure's control flow graph; the analysis supports program-point-specific polyvariant division and specialization. The analysis results guide the construction of a specialized run-time specializer for each dynamically compiled region; the specializer supports various caching strategies for managing dynamically generated code and supports mixes of speculative and demand-driven specialization of dynamic branch successors. Most of the key cost/benefit trade-offs in the binding time analysis and the run-time specialize are open to user control through declarative policy annotations. Our design is being implemented in the context of art existing optimizing compiler. Brian Grant, Markus Mock, Matthai Philipose, Craig Chambers, Susan J. Eggers |
PEPM | 4 |
| 1996 | Vortex: An Optimizing Compiler for Object-Oriented LanguagesabstractPreviously, techniques such as class hierarchy analysis and profile-guided receiver class prediction have been demonstrated to greatly improve the performance of applications written in pure object-oriented languages, but the degree to which these results are transferable to applications written in hybrid languages has been unclear. In part to answer this question, we have developed the Vortex compiler infrastructure, a language-independent optimizing compiler for object-oriented languages, with front-ends for Cecil, C++, Java, and Modula-3. In this paper, we describe the Vortex compiler's intermediate language, internal structure, and optimization suite, and then we report the results of experiments assessing the effectiveness of different combinations of optimizations on sizable applications across these four languages. We characterize the benchmark programs in terms of a collection of static and dynamic metrics, intended to quantify aspects of the "object-orientedness" of a program. Jeffrey Dean, Greg DeFouw, David Grove, Vassily Litvinov, Craig Chambers |
OOPSLA | 5 |
| 1996 | Fast, Effective Dynamic CompilationabstractDynamic compilation enables optimization based on the values of invariant data computed at run-time. Using the values of these run-time constants, a dynamic compiler can eliminate their memory loads, perform constant propagation and folding, remove branches they determine, and fully unroll loops they bound. However, the performance benefits of the more efficient, dynamically-compiled code are offset by the run-time cost of the dynamic compile. Our approach to dynamic compilation strives for both fast dynamic compilation and high-quality dynamically-compiled code: the programmer annotates regions of the programs that should be compiled dynamically; a static, optimizing compiler automatically produces pre-optimized machine-code templates, using a pair of dataflow analyses that identify which variables will be constant at run-time; and a simple, dynamic compiler copies the templates, patching in the computed values of the run-time constants, to produce optimized, executable code. Our work targets general- purpose, imperative programming languages, initially C. Initial experiments applying dynamic compilation to C programs have produced speedups ranging from 1.2 to 1.8. Joel Auslander, Matthai Philipose, Craig Chambers, Susan J. Eggers, Brian N. Bershad |
PLDI | 3 |
| 1995 | Optimization of Object-Oriented Programs Using Static Class Hierarchy Analysis
Jeffrey Dean, David Grove, Craig Chambers |
ECOOP | 3 |
| 1995 | A Framework for Selective Recompilation in the Presence of Complex Intermodule DependenciesabstractCompilersand other programming environment tools derive information from the source code of programs; derived information includes compiled code, interprocedurrd summary information, and call graph views.If the source program changes, the derived information needs to be updated.We present a simple framework for maintaining interrnodule dependencies, embodying different tradeoffs in terms of space usage, speed of processing, and selectivity of invalidation, that eases the implementation of incremental update of derived information.Our framework augments a directed acyclic graph representation of dependencies with factoring nodes (to save space) and$ltering nodes (to increase selectivity), and it includes an algorithm for efficient invalidation processing.We show how several schemes for selective recompilation, such as smart recompilation, filter sets for interprocedural summary information, and dependencies for whole-program optimization of object-oriented languages, map naturally onto our framework.For this latter application, by exploiting the facilities of our framework, we are able to reduce the number of lines of source code recompiled by a factor of seven over a header file-based scheme, and by a factor of two over the previous state-of-the-art selective dependency mechanism without consuming additional space. Craig Chambers, Jeffrey Dean, David Grove |
ICSE | 1 |
| 1995 | Profile-Guided Receiver Class PredictionabstractThe use of dynamically-dispatched procedure calls is a key mechanism for writing extensible and flexible code in object-oriented languages. Unfortunately, dynamic dispatching imposes a runtime performance penalty. Some recent implementations of pure object-oriented languages have utilized profile-guided receiver class prediction to reduce this performance penalty, and some researchers have argued for applying receiver class prediction in hybrid languages like C++. We performed a detailed examination of the dynamic profiles of eight large object-oriented applications written in C++ and Cecil, determining that the receiver class distributions are strongly peaked and stable across both inputs and program versions through time. We describe techniques for gathering and manipulating profile information at varying degrees of precision, particularly in the presence of optimizations such as inlining. Our implementation of profile-guided receiver class prediction improves the performance of large Cecil applications by more than a factor of two over solely static optimizations. David Grove, Jeffrey Dean, Charles Garrett, Craig Chambers |
OOPSLA | 4 |
| 1995 | Selective Specialization for Object-Oriented LanguagesabstractDynamic dispatching is a major source of run-time overhead in object-oriented languages, due both to the direct cost of method lookup and to the indirect effect of preventing other optimizations. To reduce this overhead, optimizing compilers for object-oriented languages analyze the classes of objects stored in program variables, with the goal of bounding the possible classes of message receivers enough so that the compiler can uniquely determine the target of a message send at compile time and replace the message send with a direct procedure call. Specialization is one important technique for improving the precision of this static class information: by compiling multiple versions of a method, each applicable to a subset of the possible argument classes of the method, more precise static information about the classes of the method's arguments is obtained. Previous specialization strategies have not been selective about where this technique is applied, and therefore tended to significantly increase compile time and code space usage, particularly for large applications. In this paper, we present a more general framework for specialization in object-oriented languages and describe a goal directed specialization algorithm that makes selective decisions to apply specialization to those cases where it provides the highest benefit. Our results show that our algorithm improves the performance of a group of sizeable programs by 65% to 275% while increasing compiled code space requirements by only 4% to 10%. Moreover, when compared to the previous state-of-the-art specialization scheme, our algorithm improves performance by 11% to 67% while simultaneously reducing code space requirements by 65% to 73%. Jeffrey Dean, Craig Chambers, David Grove |
PLDI | 2 |
| 1995 | Extensibility, Safety and Performance in the SPIN Operating SystemabstractThis paper describes the motivation, architecture and performance of SPIN, an extensible operating system. SPIN provides an extension infrastructure, together with a core set of extensible services, that allow applications to safely change the operating system's interface and implementation. Extensions allow an application to specialize the underlying operating system in order to achieve a particular level of performance and functionality. SPIN uses language and link-time mechanisms to inexpensively export fine-grained interfaces to operating system services. Extensions are written in a type safe language, and are dynamically linked into the operating system kernel. This approach offers extensions rapid access to system services, while protecting the operating system code executing within the kernel address space. SPIN and its extensions are written in Modula-3 and run on DEC Alpha workstations. Brian N. Bershad, Stefan Savage, Przemyslaw Pardyak, Emin Gün Sirer, Marc E. Fiuczynski, Craig Chambers, Susan J. Eggers |
SOSP | 7 |
| 1995 | Typechecking and Modules for MultimethodsabstractTwo major obstacles that hinder the wider acceptance of multimethods are (1) concerns over the lack of encapsulation and modularity and (2) the absence of static typechecking in existing multimethod-based languages.This article addresses both of these problems.We present a polynomial-time, static typechecking algorithm that checks the conformance, completeness, and consistency of a group of method implementations with respect to declared message signatures.This algorithm improves on previous algorithms by handling separate type and inheritance hierarchies, abstract classes, and graph-based method lookup semantics.We also present a module system that enables independently developed code to be fully encapsulated and statically typechecked on a per-module basis.To guarantee that potential conflicts between independently developed modules have been resolved, a simple well-formedness condition on the modules comprising a program is checked at link-time.The typechecking algorithm and module system are applicable to a range of multimethod-based languages, but the article uses the Cecil language as a concrete example of how they can be applied. Craig Chambers, Gary T. Leavens |
ACM Trans. Program. Lang. Syst. | 1 |
| 1994 | Typechecking and Modules for Multi-MethodsabstractTwo major obstacles hindering the wider acceptance of multi-methods are concerns over the lack of encapsulation and modularity and the absence of static typechecking in existing multi-method-based languages. This paper addresses both of these problems. We present a polynomial-time static typechecking algorithm that checks the conformance, completeness, and consistency of a group of method implementations with respect to declared message signatures. This algorithm improves on previous algorithms by handling separate type and inheritance hierarchies, abstract classes, and graph-based method lookup semantics. We also present a module system that enables independently-developed code to be fully encapsulated and statically typechecked on a per-module basis. To guarantee that potential conflicts between independently-developed modules have been resolved, a simple well-formedness condition on the modules comprising a program is checked at link-time. The typechecking algorithm and module system are applicable to a range of multi-method-based languages, but the paper uses the Cecil language as a concrete example of how they can be applied. Craig Chambers, Gary T. Leavens |
OOPSLA | 1 |
| 1994 | Identifying Profitable Specialization in Object-Oriented Languages
Jeffrey Dean, Craig Chambers, David Grove |
PEPM | 2 |
| 1993 | Predicate Classes
Craig Chambers |
ECOOP | 1 |
| 1992 | Object-Oriented Multi-Methods in Cecil
Craig Chambers |
ECOOP | 1 |
| 1992 | Debugging Optimized Code with Dynamic DeoptimizationabstractSELF's debugging system provides complete source-level debugging (expected behavior) with globally optimized code. It shields the debugger from optimizations performed by the compiler by dynamically deoptimizing code on demand. Deoptimization only affects the procedure activations that are actively being debugged; all other code runs at full speed. Deoptimization requires the compiler to supply debugging information at discrete interrupt points; the compiler can still perform extensive optimizations between interrupt points without affecting debuggability. At the same time, the inability to interrupt between interrupt points is invisible to the user. Our debugging system also handles programming changes during debugging. Again, the system provides expected behavior: it is possible to change a running program and immediately observe the effects of the change. Dynamic deoptimization transforms old compiled code (which may contain inlined copies of the old version of the changed procedure) into new versions reflecting the current source-level state. To the best of our knowledge, SELF is the first practical system providing full expected behavior with globally optimized code. Urs Hölzle, Craig Chambers, David M. Ungar |
PLDI | 2 |
| 1991 | Optimizing Dynamically-Typed Object-Oriented Languages With Polymorphic Inline Caches
Urs Hölzle, Craig Chambers, David M. Ungar |
ECOOP | 2 |
| 1991 | Making Pure Object-Oriented Languages PracticalabstractIn the past, object-oriented language designers and programmers have been forced to choose between pure message passing and performance. Last year, our SELF system achieved close to half the speed of optimized C but suffered from impractically long compile times. Two new optimization techniques, deferred compilation of uncommon cases and non-backtracking splitting using path objects, have improved compilation speed by more than an order of magnitude. SELF now compiles about as fast as an optimizing C compiler and runs at over half the speed of optimized C. This new level of performance may make pure object-oriented languages practical. 1 Introduction In the past, object-oriented language designers and programmers have been forced to choose between purity and performance. In a pure object-oriented language, all computation, even low-level operations like variable accessing, arithmetic, and array indexing, is performed by sending messages to objects. Although a message send may cost o... Craig Chambers, David M. Ungar |
OOPSLA | 1 |
| 1990 | Iterative Type Analysis and Extended Message Splitting: Optimizing Dynamically-Typed Object-Oriented ProgramsabstractObject-oriented languages have suffered from poor performance caused by frequent and slow dynamically-bound procedure calls. The best way to speed up a procedure call is to compile it out, but dynamic binding of object-oriented procedure calls without static receiver type information precludes inlining. Iterative type analysis and extended message splitting are new compilation techniques that extract much of the necessary type information and make it possible to hoist run-time type tests out of loops. Craig Chambers, David M. Ungar |
PLDI | 1 |
| 1989 | An Efficient Implementation of SELF - a Dynamically-Typed Object-Oriented Language Based on PrototypesabstractWe have developed and implemented techniques that double the performance of dynamically-typed object-oriented languages. Our SELF implementation runs twice as fast as the fastest Smalltalk implementation, despite SELF's lack of classes and explicit variables. Craig Chambers, David M. Ungar, Elgin Lee |
OOPSLA | 1 |
| 1989 | Customization: Optimizing Compiler Technology for SELF, A Dynamically-Typed Object-Oriented Programming LanguageabstractDynamically-typed object-oriented languages please programmers, but their lack of static type information penalizes performance. Our new implementation tech-niques extract static type information from declaration-free programs. Our system compiles several copies of a given procedure, each customized for one receiver type, so that the type of the receiver is bound at compile time. The compiler predicts types that are statically unknown but likely, and inserts run-time type tests to verify its predictions. It splits calls, compiling a copy on each control path, optimized to the specific types on that path. Coupling these new techniques with compile-time message lookup, aggressive procedure inlining, and traditional optimizations has doubled the performance of dynamically-typed object-oriented languages. 1. Craig Chambers, David M. Ungar |
PLDI | 1 |