Getting Started in PL Design Research Stephanie Weirich University of Pennsylvania About Stephanie Weirich Texan by birth Pennsylvanian by marriage Met Steve Zdancewic at grad school (Cornell) Both PL faculty members at Penn since 2002 Mother of 1.5 girls grew up in Dallas, attended Rice University Eleanor Jane Weirich Zdancewic, Jan 2005 ?????, Aug 2007 Research interests type systems functional programming My research How can we make statically-typed programming languages more expressive? Type-directed Reflect type information structure into data Express generic algorithms that work for many different data structures AspectML, RepLib in Haskell, Type-directed Java Dependent Type Programming: Programs that depend on types Types: Types that depend on programs Use types to statically verify program invariants “Programmable” type systems (conditional relationships) New language/type system design: PIE inference Making it easier to use advanced type systems Extensions to the Haskell programming language Where to begin? Start by building background and experience Read, Read, Read Learn by doing: write programs, do proofs Study textbooks: e.g. Pierce, TAPL Learn how to evaluate design work Identify important problems Work on something that seems cool, even if you don’t know what the contribution will be Staring at a blank piece of paper will not produce a POPL submission. Where to look for publications Conferences & Workshops Journals POPL & ICFP PLDI, OOPSLA, ESOP, LICS, PPDP JFP and TOPLAS Seminars, web pages Once you’ve identified the active participants for your problem Play with languages Play around with many different languages Mature FPLs: Research FPLs: Haskell (GHC) ML (O'Caml, Standard ML) Scheme (PLT Scheme) Scala, Omega, ATS, GHC extensions Why? Learn by doing Might find new uses for old types Might discover connections between features Learn about constructive logic Logical foundation for formal models of languages Books/Lecture notes: Proof assistants for constructive logic Barendregt: Lambda Calculi with Types Pfenning: Computation and Deduction Sorenson, Urzyczyn: Lectures on the Curry/Howard Isomorphism Twelf Coq Coq Tutorial at POPL 08 (tentative) Expressiveness Build a small interpreter/write small programs Build a larger implementation/write larger programs Port existing programs to new language Example: Cyclone Extend existing language with active user community Example: GHC Consistency Does the design make sense? Can it be implemented? Can we prove properties about a formal model of it? Type soundness Decidable type checking Algorithmic complexity Aesthetics Does the design follow general design principles? Simplicity Orthogonality Mathematical insight Does the design include a foundational building block for future languages? Add to our mathematical vocabulary? Relevance/Significance Is there a need for this design? Example: Concurrency, motivated by new hardware Does this design teach us about programming and program structure? Example: Monads What to work on? What are people talking about now? What will they be talking about in the next few years? What are the important questions? Another perspective: Pierce, LICS 2003 invited talk. Types and Programming Languages: The Next Generation Expressive type systems How do we show that there are no bugs in linux device drivers/garbage collectors/embedded systems/etc? Types for modeling memory management, state invariants, and running time, eliminating race conditions, deadlock Dependent type systems How can we stop designing all these special purpose type systems? Can we make the type system programmable? How can the user cope with such complicated types? Indexed types, GADTs, full-spectrum dependency, PADS, etc. Program equivalence How do we show that two programs are the same? How can we show that program abstractions are preserved? Even in a multi-lingual system? Can the design of the language help? Bisimulation techniques, type abstraction, logical relations, encryption, security-type systems Concurrency What is the right programming model for concurrent architectures? Software Transactions? Deterministic concurrency? Message-passing? How do we reason about concurrent programs? Does purity help? How to evaluate language designs? Need to know to do good work Need to know to present that work effectively Difficult (and sometimes controversial) question Different axes: Novelty Expressiveness Consistency Aesthetics Relevance