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

Craig Chambers

dblp:c/CraigChambers · DBLP profile ↗
← Back
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

TopicWeightPapersLastEvidence papers
Programming languages and type systems › type checking
modular typechecking
0.242006
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.252006
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.252005
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.232007
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.242005
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.132006
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.112010
FlumeJava: easy, efficient data-parallel pipelines · PLDI 2010
Parallel and multicore computing
parallel programming models
0.112010
FlumeJava: easy, efficient data-parallel pipelines · PLDI 2010
Runtime systems and virtual machines
dynamic compilation
0.142000
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.122005
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.122005
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.112008
A theory of platform-dependent low-level software · POPL 2008
Programming languages and type systems
language semantics
0.112008
A theory of platform-dependent low-level software · POPL 2008
Program analysis › static analysis
call graph construction
0.142005
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.112007
Searching for type-error messages · PLDI 2007
Compilers and program optimization › verified compilation
translation validation
0.112007
Automatic inference of optimizer flow functions from semantic meanings · PLDI 2007
Programming languages and type systems
type inference
0.112007
Searching for type-error messages · PLDI 2007
Program analysis › static analysis
interprocedural analysis
0.132001
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.122006
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.122002
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.132000
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.012004
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.012004
Modular typechecking for hierarchically extensible datatypes and functions · ACM Trans. Program. Lang. Syst. 2004
Programming languages and type systems
language design
0.022002
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.012003
Automatically proving the correctness of compiler optimizations · PLDI 2003
Programming languages and type systems
extensibility
0.012003
Relaxed MultiJava: balancing extensibility and modular typechecking · OOPSLA 2003
Compilers and program optimization › dynamic optimization
profile-guided optimization
0.022000
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.041995
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.022004
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.012002
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
YearPublicationVenuePosition
2015 The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data Processing
abstract
Unbounded, 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
ECOOP1
2010 FlumeJava: easy, efficient data-parallel pipelines
abstract
MapReduce 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
PLDI1
2008 A theory of platform-dependent low-level software
abstract
The 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
POPL3
2007 Searching for type-error messages
abstract
Advanced 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
PLDI4
2007 Automatic inference of optimizer flow functions from semantic meanings
abstract
Previous 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
PLDI3
2006 Parameterized Modules for Classes and Extensible Functions
Keunwoo Lee, Craig Chambers
ECOOP2
2006 MultiJava: Design rationale, compiler implementation, and applications
abstract
MultiJava 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 rules
abstract
We 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
POPL4
2005 Program Slicing with Dynamic Points-To Sets
abstract
Program 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
ECOOP2
2004 Modular typechecking for hierarchically extensible datatypes and functions
abstract
One 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
ECOOP3
2003 HydroJ: object-oriented pattern matching for evolvable distributed systems
abstract
In 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
OOPSLA3
2003 Relaxed MultiJava: balancing extensibility and modular typechecking
abstract
We 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
OOPSLA3
2003 Automatically proving the correctness of compiler optimizations
abstract
We 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
PLDI3
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
ECOOP2
2002 Modular typechecking for hierarchically extensible datatypes and functions
abstract
One 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
ICFP3
2002 ArchJava: connecting software architecture to implementation
abstract
Software 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
ICSE2
2002 Alias annotations for program understanding
abstract
One 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
OOPSLA3
2002 Staged compilation
abstract
Traditional 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
PEPM1
2002 Composing dataflow analyses and transformations
abstract
Dataflow 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
POPL3
2002 Towards automatic construction of staged compilers
abstract
Some 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
POPL2
2002 Improving program slicing with dynamic points-to data
abstract
Program 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 FSE3
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 optimization
abstract
In 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
PASTE3
2001 A framework for call graph construction algorithms
abstract
A 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 compilation
abstract
Selective 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
MICRO2
2000 MultiJava: modular open classes and symmetric multiple dispatch for Java
abstract
We 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
OOPSLA3
2000 A Debate on Language and Tool Support for Design Patterns
abstract
Design 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
POPL1
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 optimizations
abstract
DyC 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
ECOOP2
1999 Efficient Multiple and Predicated Dispatching
abstract
The 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
OOPSLA1
1999 An Evaluation of Staged Run-Time Optimizations in DyC
abstract
Previous 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
PLDI4
1999 Static Analyses for Eliminating Unnecessary Synchronization from Java Programs
Jonathan Aldrich, Craig Chambers, Emin Gün Sirer, Susan J. Eggers
SAS2
1998 Predicate Dispatching: A Unified Theory of Dispatch
Michael D. Ernst, Craig S. Kaplan, Craig Chambers
ECOOP3
1998 Fast Interprocedural Class Analysis
abstract
Previous 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
POPL3
1997 Call Graph Construction in Object-Oriented Languages
abstract
Interprocedural 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
OOPSLA4
1997 Annotation-Directed Run-Time Specialization in C
abstract
We 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
PEPM4
1996 Vortex: An Optimizing Compiler for Object-Oriented Languages
abstract
Previously, 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
OOPSLA5
1996 Fast, Effective Dynamic Compilation
abstract
Dynamic 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
PLDI3
1995 Optimization of Object-Oriented Programs Using Static Class Hierarchy Analysis
Jeffrey Dean, David Grove, Craig Chambers
ECOOP3
1995 A Framework for Selective Recompilation in the Presence of Complex Intermodule Dependencies
abstract
Compilersand 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
ICSE1
1995 Profile-Guided Receiver Class Prediction
abstract
The 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
OOPSLA4
1995 Selective Specialization for Object-Oriented Languages
abstract
Dynamic 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
PLDI2
1995 Extensibility, Safety and Performance in the SPIN Operating System
abstract
This 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
SOSP7
1995 Typechecking and Modules for Multimethods
abstract
Two 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-Methods
abstract
Two 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
OOPSLA1
1994 Identifying Profitable Specialization in Object-Oriented Languages
Jeffrey Dean, Craig Chambers, David Grove
PEPM2
1993 Predicate Classes
Craig Chambers
ECOOP1
1992 Object-Oriented Multi-Methods in Cecil
Craig Chambers
ECOOP1
1992 Debugging Optimized Code with Dynamic Deoptimization
abstract
SELF'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
PLDI2
1991 Optimizing Dynamically-Typed Object-Oriented Languages With Polymorphic Inline Caches
Urs Hölzle, Craig Chambers, David M. Ungar
ECOOP2
1991 Making Pure Object-Oriented Languages Practical
abstract
In 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
OOPSLA1
1990 Iterative Type Analysis and Extended Message Splitting: Optimizing Dynamically-Typed Object-Oriented Programs
abstract
Object-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
PLDI1
1989 An Efficient Implementation of SELF - a Dynamically-Typed Object-Oriented Language Based on Prototypes
abstract
We 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
OOPSLA1
1989 Customization: Optimizing Compiler Technology for SELF, A Dynamically-Typed Object-Oriented Programming Language
abstract
Dynamically-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
PLDI1