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.
Growing a Syntax
Eric Allen, Ryan Culpepper, Janus Dam Nielsen, Jon Rafkind, and
Sukyoung Ryu (Sun Microsystems)
In this paper we present a macro system for the Fortress programming language. Fortress is a new programming language designed for scientific and high-performance computing. Features include: implicit parallelism, transactions, and concrete syntax that emulates mathematical notation. Fortress is intended to grow over time to accommodate the changing needs of its users. Our goal is to design and implement a macro system that allows for such growth. The main challenges are (1) to support extensions to a core syntax rich enough to emulate mathematical notation, (2) to support combinations of extensions from separately compiled macros, and (3) to allow new syntax that is indistinguishable from core language constructs. To emulate mathematical notation, Fortress syntax is specified as a parsing expression grammar (PEG), supporting unlimited lookahead. Macro definitions must be checked for well-formedness before they are expanded and macro uses must be well encapsulated (hygienic, composable, respecting referential transparency). Use sites must be parsed along with the rest of the program and expanded directly into abstract syntax trees. Syntax errors at use sites of a macro must refer to the unexpanded program at use sites, never to definition sites. Moreover, to allow for many common and important uses of macros, mutually recursive definitions should be supported. Our design meets these challenges. The result is a flexible system that allows us not only to support new language extensions, but also to move many constructs of the core language into libraries. New grammar productions are tightly integrated with the Fortress parser, and use sites expand into core abstract syntax trees. Our implementation is integrated into the open-source Fortress reference interpreter.To our knowledge, ours is the first implementation of a modular hygienic macro system based on parsing expression grammars.
Statically-Checked Metaprogramming for Web Applications
Adam Chlipala (Harvard)
Web application programming is perhaps PL researchers' favorite example of a development domain high in grunt work and low in tricky algorithmic problems. The Ur/Web programming language recognizes this and proposes an approach to reifying commonalities across web applications, as modules and values in an ML-influenced language that imports more avant garde ideas from type theory. Ur/Web is a domain-specific language whose "well-typed programs can't go wrong" theorem covers the lifetime of a web application, rather than just single page generations. In particular, the type system rules out malformed HTML, dangling links, illegal generation of SQL queries, illegal marshaling and unmarshaling to and from SQL databases, and mismatches between the fields defined in an HTML form and the fields read by its handler code. All that is just the foundation on which the platform for avoiding grunt work is built. Ur/Web's type system is inspired by dependent type theory, though dependency is avoided via stratification. The key benefit that remains is type-level computation. Aspects of XML and SQL are described with the uniform mechanism of row types, and Ur/Web's type language includes recursive function definitions over rows. This makes it possible to write richly-typed functors and functions that have different run-time behavior based on row type arguments. For instance, we have implemented a functor that generates a standard "admin interface" for an arbitrary SQL table, as a function of a row type enumerating the table's fields. An additional value-level record, whose type is built by recursion on the incoming row type, provides custom code on a per-field basis. The signature of this functor gives complete information on what clients must provide and what they receive in return, and the Ur/Web type system guarantees that the functor can never build web applications with any of the problems that we enumerated at the end of the last paragraph.
Project Web Site (with demo).
Choreography & Session Types
Marco Carbone (Queen Mary College, Univ. of London)
Choreography has recently emerged as a pragmatic and concise way of describing communication-based systems such as financial and security protocols and web services. This discipline focuses on global message flows and offers a vantage viewpoint of the system being designed. In this talk I will introduce a model for choreography and show how global message flows can be mapped into executable code in a session-based setting. In particular, I will discuss how three principles of well-structured description and type structures play a fundamental role in the theory. I will also briefly introduce different extensions of choreography such as interactional exceptions and multiparty session types.
Causal Commutative Arrows
Hai (Paul) Liu and Paul Hudak (Yale)
Arrows are a popular form of abstract computation. Being more general than monads, they are more broadly applicable, and in particular are a good abstraction for signal processing and dataflow computations. Most notably, arrows form the basis for a domain specific language called *Yampa*, which has been used in a variety of concrete applications, including animation, robotics, sound synthesis, control systems, graphical user interfaces, and robotics. Our primary interest is in better understanding the class of abstract computations captured by Yampa. Unfortunately, arrows are not concrete enough to do this with precision. To remedy this situation we introduce the concept of *commutative arrows* that capture a kind of non-interference property of concurrent computations. We also add an *init* operator, and identify a crucial law that captures the causal nature of arrow effects. We call the resulting computational model *causal commutative arrows*. To study this class of computations in more detail, we define an extension to the simply typed lambda calculus called *CCA*, and give both its denotational and operational semantics. Our key contribution is the identification of a normal form for CCA called \emph{causal commutative normal form} (CCNF). Furthermore, by defining a terminating normalization procedure we have developed an optimization strategy that yields substantial improvements in performance over conventional implementations of arrows. We have implemented this technique in Haskell, and conducted benchmarks that validate the effectiveness of our approach.
Alchemy: Transmuting Base Alloy Specifications into Implementations
Shriram Krishnamurthi (Brown), Dan Dougherty, Kathi Fisler,
Daniel Yoo (WPI)
Alloy specifications are used to define lightweight models of systems. We present Alchemy, which compiles Alloy specifications into implementations that execute against persistent databases. Alchemy translates a subset of Alloy predicates into imperative update operations, and it converts facts into database integrity constraints that it maintains automatically in the face of these imperative actions. In addition to presenting the semantics and an algorithm for this compilation, we present the tool and outline its application to a non-trivial specification. We also discuss lessons learned about the relationship between Alloy specifications and imperative implementations.
More information is in our paper.
Verifying Garbage Collectors with Boogie and Z3
Chris Hawblitzel (Microsoft) and Erez Petrank (Technion)
Most safe programming languages rely on garbage collection to remove unreachable objects from memory. A bug in the garbage collector could undermine the language.s safety, so it.s useful to verify that the garbage collector works correctly. We describe how we used the Boogie verification generator and Z3 automated theorem prover to prove the partial correctness of two practical garbage collectors (one mark-sweep collector and one copying collector). In particular, we discuss how Z3.s support for arithmetic, arrays, and bit vectors allowed us to reason about the low-level details of memory layout. This low level of detail allowed us to verify not just the GC algorithm, but also the GC interface to real x86 code compiled from off-the-shelf C# programs.
Automatic Differentiation of Functional Programs or Lambda the
Ultimate Calculus
Jeffrey Mark Siskind (Purdue)
It is extremely useful to be able to take derivatives of functions expressed as computer programs to support function optimization and approximation, parameter estimation, machine learning, and ultimately computational science and engineering design. The established discipline of Automatic Differentiation (AD) has largely focussed on imperative languages, where it is most efficiently implemented as a source-to-source transformation performed by a preprocessor. This talk will present a novel formulation of AD for functional programs expressed in the lambda calculus. A key novel aspect of our formulation is that AD is performed by higher-order functions that reflectively transform closure bodies. Our methods exhibit an important closure property that prior AD formulations lack: the ability to transform the entire space of input programs, including those produced by the AD transformations themselves. This is crucial for solving the kinds of nested optimizations that arise in domains such as game theory and automatic control. Furthermore, since the input and output of our transformations is the lambda calculus, efficient implementation is facilitated by novel extensions of standard compilation techniques. We exhibit a novel "almost" union-free polyvariant flow-analysis algorithm, formulated as abstract interpretation, that partially evaluates calls to the AD operators, migrating reflective source-to-source transformation to compile time. This yields code with run-time performance that exceeds the best existing AD implementations for imperative languages by a factor of two and outperforms all AD implementations for functional languages by two to three orders of magnitude.
Joint work with Barak A. Pearlmutter.
Complexity of Flow Analysis
David Van Horn (Northeastern) and Harry Mairson (Brandeis)
Flow analysis aims to predict properties of programs before they are run, but how hard is this to do? We answer the question in the case of the kCFA hierarchy, a ubiquitous family of flow analyses for higher-order languages, by deriving tight lower bounds on the computational complexity of the hierarchy. For 0CFA, and many of its known approximations, a natural decision problem answered by analysis is complete for polynomial time. This theorem relies on the insight that linearity of programs subverts approximation in analysis, rendering analysis equivalent to evaluation. For any k > 0, we prove the decision problem is complete for exponential time. This theorem validates empirical observations that such control flow analysis is intractable. It also provides more general insight into the complexity of abstract interpretation.
Last modified Friday, November 14th, 2008 4:35:58pm |