These abstracts are for talks at this event.

NEPLS is a venue for ongoing research, so the abstract and supplemental material associated with each talk is necessarily temporal. The work presented here may be in a state of flux. In all cases, please consult the authors' Web pages for up-to-date information. Please don't refer to these pages as a definitive source.

Abstracting Abstract Machines: Static Analysis of Evaluation Order, Return-flow, Laziness and the Stack

David Van Horn (Northeastern)

Abstract interpretations of canonical abstract machines yield novel
and useful static analyses for higher-order languages.  We support
this claim by transforming the CEK machine of Felleisen and Friedman,
a lazy variant of Krivine's machine, and the stack-inspecting CM
machine of Clements and Felleisen into abstract interpretations of
themselves.  The resulting analyses bound temporal ordering of program
events; predict return-flow and stack-inspection behavior; and
approximate the flow and evaluation of by-need parameters.  For all of
these machines, we find that a series of well-known concrete machine
refactorings, plus a technique we call store-allocated continuations,
leads to a machine that abstracts into a static analysis simply by
bounding the machines' store.  We demonstrate that the technique
scales up uniformly to allow static analysis of realistic languages
features, including tail calls, conditionals, side effects,
exceptions, first-class continuations and even garbage collection.

(Joint work with Matthew Might, University of Utah)

Alias Analysis for Optimization of Dynamic Languages

Michael Gorbovitski, Yanhong A. Liu, Scott D. Stoller, K. Tuncay Tekle, and Tom Rothamel (SUNY Stony Brook)

Dynamic languages such as Python allow programs to be written more
easily using high-level constructs such as comprehensions for queries
and using generic code. Efficient execution of programs then requires
powerful optimizations . incrementalization of expensive queries and
specialization of generic code. Effective incrementalization and
specialization of dynamic languages require precise and scalable alias

This paper describes the development and experimental evaluation of a
may-alias analysis for a full dynamic object-oriented language, for
program optimization by incrementalization and specialization. The
analysis is flow-sensitive; we show that this is necessary for
effective optimization of dynamic languages. It uses precise type
analysis and a powerful form of context sensitivity, called trace
sensitivity, to further improve analysis precision. It uses a
compressed representation to significantly reduce the memory used by
flow-sensitive analyses. We evaluate the effectiveness of this
analysis and several variants of it for incrementalization and
specialization of Python programs, and we evaluate the precision,
memory usage, and running time of these analyses on programs of
diverse sizes. The results show that our analysis has acceptable
precision and efficiency and represents the best trade-off between

On The Design of Error Messages Aimed at Novice Programmers

Guillaume Marceau and Kathi Fisler (WPI), and Shriram Krishnamurthi (Brown)

How well do the error messages of DrScheme support learning, and when
errors fail to teach, in which ways do they fail?

To answer this question, we recorded the edits students applied to
their program in response to error messages over a span of 8 weeks. By
looking at the responses, we were able to come up with a hand-coded,
quantitative metric for the effectiveness of an error message. To
supplement the metric, we interviewed 4 different students about their
experience with the error messages.

From these observations, we draw broad recommendations to the creators
of pedagogical IDEs, compilers, and languages, on the design of error
messages aimed at novice programmers.

Debugging and Profiling Transactional Memory Programs

Yossi Lev (Brown)

Transactional memory (TM) has become increasingly popular in recent
years as a promising programming paradigm for writing correct and
scalable concurrent programs.  Despite its popularity, there has been
very little work on how to debug and profile transactional programs.
Our work addresses this situation by exploring the debugging and
profiling needs of transactional programs, explaining how the tools
should change to support these needs, and implementing preliminary
infrastructure to support this change.

This talk presents work done as part of my thesis work. For more information, see

Probabilistic Programming Without Interpretive Overhead

Chung-chieh Shan (Rutgers) and Oleg Kiselyov (FNMOC)

Probabilistic inference is popular in machine learning for writing
programs that classify music and locate planes.  It is also useful in
cognitive science for modeling how people interpret words and
recognize faces.  An expressive way to implement it is to build
probabilistic models and inference procedures as separate reusable
modules.  We do so by coding models and inference in the same
general-purpose language.  This way, inference procedures can reason
about themselves without interpretive overhead, so we can model
bounded-rational theories of mind, as in natural-language pragmatics.

We use existing facilities of the language, such as rich libraries,
optimizing compilers, and types, to develop realistic models whose
inference performance is competitive with the state of the art.  In
particular, we use first-class control operators to combine sharing
and nondeterminism (ICFP 2009) while deterministic parts of models run
at full speed.  A wide range of models can thus be expressed using
memoization, and we introduce a new, general algorithm for importance
sampling with look-ahead.

Mint: Java Multi-stage Programming Using Weak Separability

Walid Taha (Rice University)

The Essence of JavaScript

Arjun Guha, Claudiu Saftoiu, and Shriram Krishnamurthi (Brown)

We reduce JavaScript to a core calculus structured as a small-step
operational semantics. We present several peculiarities of the
language and show that our calculus models them. We explicate the
desugaring process that turns JavaScript programs into ones in the
core. We demonstrate faithfulness to JavaScript using real-world test
suites. Finally, we illustrate utility by defining a security
property, implementing it as a type system on the core, and extending
it to the full language.

For details, see the ECOOP 2010 paper and its supplemental material.

Work in Progress: Declassification Policy Inference

Jeff Vaughan and Steve Chong (Harvard)

Security-type systems can provide strong information security
guarantees but often require enormous programmer effort to be used in
practice. In this work, we describe inference of fine-grained,
human-readable declassification policies as a step towards providing
security guarantees that are proportional to a programmer's effort:
the programmer should receive weak (but sound) security guarantees for
little effort, and stronger guarantees for more effort.

We will present an information-flow type system with where policies
may be inferred from existing program structure.  The inference
algorithm can find precise and intuitive descriptions of potentially
dangerous information flows in a program, and policies specify what
information is released under what conditions.  A semantic security
condition specifies what it means for a program to satisfy a policy.

Our work demonstrates the soundness of an analysis for programs in a
simple imperative language with exceptions.  Furthermore, we have
extended the analysis to an object-sensitive interprocedural analysis
for single-threaded Java 1.4 programs and developed a prototype

We will also discuss scalability, and usability challenges which must
be overcome before such analyses become practical for every-day Java

Logical Types for Scheme

Sam Tobin-Hochstadt and Matthias Felleisen (Northeastern)

Scheme programmers incorporate both control-flow logic and
propositional logic in their reasoning about programs. Typed Scheme,
our type system for PLT Scheme, accommodates this form of reasoning by
assigning variable occurrences a subtype of their declared type based
on the predicates prior to the occurrence, a discipline we have dubbed
occurrence typing. It thus enables programmers to enrich Scheme code
with types on a modular basis, while requiring few changes to the code

Three years of practical experience with Typed Scheme has revealed
serious shortcomings in the original design of the type system.  Our
original system relied on a system of ad-hoc rules to relate
combinations of predicates; it could not reason about subcomponents of
data structures, and it could not follow sophisticated reasoning about
the relationship among predicate tests.

In this paper, we reformulate occurrence typing to eliminate these
shortcomings.  For each expression, we derive propositional logic
formulas that hold when the expression evaluates to true (or
false). We then apply a simple proof system to derive all the
necessary facts about variable occurrences. Finally, we empirically
demonstrate the greater utility of our system.

Last modified Wednesday, April 28th, 2010 7:59:59pm