Norman Ramsey

[A silly selfie] Send email to
Send physical documents to my postal address.
If you come yourself you'll want directions.
Telephone +1 617 627 4923.
Skype (chat preferred): norman-ramsey
AIM: norman62ramsey
Yahoo chat: norman_ramsey
Fax +1 617 627 2227 (but if you can, scan and email instead)
My vita and public key (now with photo!) are online.

I type 75 words per minute. We are typists first, so test yourself.
On this page:

Who I am and what I do

I do research in programming languages and teach a mix of classes at Tufts University. In the last five or six years, I have had my fingers in a lot of pies!

Programming-language infrastructure

Of all the problems in making programming-language infrastructure reusable, the most challenging is this: if we are given a new machine and are told what its instructions do, how do we generate code for it? Working with my student and postdoc João Dias, I have developed methods of automatically generating an instruction selector—the heart of a code generator—from declarative machine descriptions (POPL 2010). We've also published the abstraction that the instruction selector is built on (POPL 2011).

Ideas about infrastructure are most convincing when they are deployed. In 2014, my group’s ideas about code generation were deployed in a new code generator for the Glasgow Haskell Compiler (GHC). Deployment required several years’ effort from João Dias, Simon Marlow of Microsoft Research, Simon Peyton Jones of Microsoft Research, and me. The new code generator’s most interesting component is a reusable, higher-order optimization library, Hoopl (Haskell 2010), which uses generalized algebraic data types to guarantee at compiler-compile time that no matter what Haskell program it is given, GHC never builds an ill-formed control-flow graph.

Languages and learning

People who want to learn to use programming languages effectively can try starting with an industrial language, but the sheer size of a typical industrial language and library make it hard to discover and apply the ideas that make the language worth learning. People can also consult books, but existing books primarily talk about programming languages, or they talk about how programming languages are implemented, or they steer people to industrial languages. To make it possible for people not just to learn about great ideas in programming languages, but to build software that applies these ideas effectively, I have designed and implemented a collection of tiny programming languages for language learners. Using my languages, learners can build programs that apply some of the greatest ideas in programming languages: functions, types, and objects. The languages form the skeleton of a new book, Programming Languages: Build, Prove, and Compare, which will be published by Cambridge University Press.

While implementing the languages I created for the book, I found an interesting problem: there is a big engineering gap between simple, definitional interpreters, which we write to illustrate precisely what a language is supposed to mean, and industrial-strength interpreters and compilers, which we write to run programs efficiently. To narrow this gap, I’ve investigated ways of engineering definitional interpreters to be more efficient, without making them much harder to write (PPDP 2013).

Because programming languages are the medium in which software is written, they are also the medium in which beginners learn to build software. The programming language and technique taught in introductory courses are widely believed to affect learning. I have recently piloted a first course based on How to Design Programs by Felleisen et al., which uses functional programming languages and techniques. My analysis, refinements, and recommendations have just been published at the International Conference on Functional Programming (ICFP 2014).

Language applications, design, and semantics

Languages and techniques are refined, evaluated, and improved by using them on real problems. I’ve applied functional-programming techniques to computational biology; working with graduate students in computational biology, I showed ways in which functional programming works to help solve their problems (ICFP 2012). We also identified obstacles that prevented functional programming from working as well as it could have.

Another application area, machine learning, builds on Bayesian reasoning about probabilities. But in current practice, a programmer’s Bayesian ideas are usually hand-translated into a general-purpose programming language like Matlab or C++. Such programmers might be much more productive if given a probabilistic programming language, in which Bayesian reasoning can be expressed directly. With support from DARPA, I'm working with colleagues from BAE Systems and Northeastern University on the design and semantics for probabilistic programming languages.

Curricular development

Over the past seven years, I have revamped a significant portion of Tufts's required undergraduate curriculum in computer science. Our students are required to take four courses that have programming assignments. As a result of my work, these courses now ask much more of our students than they did formerly, and they also offer more. In particular, we now offer many more challenging, rewarding problems of a sort that students would not think to tackle on their own.

In addition to the pilot introductory course mentioned above, I have completely redesigned the third and fourth courses in our programming sequence.

I also have some opinions about what else we should be teaching.

My teaching and curricular work were recognized with the 2015 Lerman-Neubauer Prize for Outstanding Teaching and Advising. This prize is awarded annually to a member of the Tufts faculty who has had a profound intellectual impact on his or her students, both inside and outside the classroom.

Selected papers

This page show my most significant and most recent papers. Links are to abstracts so you can check out the topic without downloading a monster. For a complete view, including older work, see my publications list.

Five most significant papers

Five other significant papers

Other recent papers

These are some recent papers not listed above. They are in chronological order, so the most recent work is at the bottom.
For a complete view, including older work, see my publications list.

The ACM requires this disclaimer:

The documents contained in these pages are included to ensure timely dissemination of scholarly and technical work on a non-commercial basis. Copyright and all rights therein are maintained by the authors or by other copyright holders, notwithstanding that they have offered their works here electronically. It is understood that all persons copying this information will adhere to the terms and constraints invoked by each author's copyright. These works may not be reposted without the explicit permission of the copyright holder.


In Fall 2017 I am teaching COMP 250RTS (Run-Time Systems). In Spring 2018 I will be teaching COMP 105 (Programming Languages).

In the past, I have taught COMP 150PP (Probabilistic Programming Languages), COMP 150TW (The Engineering Method of Technical Writing). COMP 50, a pilot version of the first course that I have co-developed with Ben Hescott; COMP 40 (Machine Structures and Assembly-Language Programming); COMP 105 (Programming Languages); COMP 150GIT (Functional Programming and Source-Code Control); COMP 150DAO (Dataflow Analysis and Optimization); and COMP 150FP (Advanced Functional Programming). I have also taught many courses at other universities that need not be named.

Resources for Students

Office hours for Fall 2017 are by appointment.

I am always interested in discussing projects with students, and I often have several undergraduate or master's students working with me part-time.

I have gathered material of interest to research students, including resources for writers, how to give a talk.
Undergraduate research students might also be interested, especially in my thoughts about how to get admitted to a PhD program. And I tell you what you need to give me (and when) if you want a letter of recommendation.

If you want to teach at a community college, here are some tips from a community-college dean.

About Me

My professional home is in the Department of Computer Science at Tufts University. My GPG public key's fingerprint is 72F7 B434 AB7C D7D0 D5A9 B537 BD01 D704 7276 3614. My ORCID ID is 0000-0002-5435-1135. Some people think I'm a power user; others think I never sleep. They may be right; my ~/bin directory contains over a thousand scripts, almost all of which I wrote myself. But a lot of people know me only as the creator of noweb.

I have twice served ACM as a member of the SIGPLAN Executive Committee. I served as program chair for ICFP '07.

I signed the email charter; if you won't, I won't. After years of relying on the kindness of strangers, I finally started carrying a cell phone. I no longer maintain a hot list; this is more of a random list. An interest in personal productivity and pointers from Benjamin Pierce and Phil Wadler got me to Inbox Zero on Wed 21 Feb 2007 at 6:00 PM. After serious lossage caused by various alarums and excursions, I recovered Zero at 6:30 PM on Mon 31 Dec 2007. It was a pleasure to start the New Year with an empty inbox! After starting at Tufts, I got a little behind; at the end of my first year, my email debt was over 600 messages. At the end of my third year, at 9:12 PM on Monday 23 May 2011, I recovered Zero once again, but I cheated—I put 600 messages from 2009 and 2010 into an email demilitarized zone. The next time I got to Zero was at 5:03 PM on Wednesday 29 August 2012, again at 2:54 PM on 30 May 2014, again at 6:34 PM on 12 November 2014, and again at 12:00 PM on 7 June 2017. For a time I almost thought I detected a pattern there.

I'm a Double Tiger, a Bellcore alumnus, and a long-standing member of the Luxuriant Flowing Hair Club for Scientists, and I have an Erdös Number of 3. I've been seen wearing orange and black academic regalia. Despite these distinguished credentials, I'm not ashamed to subscribe to a magazine with a centerfold. A secret vice is that I used to answer programming questions for fun; at one time, I was the 40th most reputable contributor (out of over 100,000). Along the way I earned silver Specialist badges in C, Haskell, programming languages, functional programming, and a couple of other topics.

I’ve seen one total eclipse of the sun. Although I read extensively about viewing eclipses, I still was not prepared to take it all in. You can read my advice to my future self.

Although it surprises people, for over forty years I have been a football fan. When it's not football season, I've been known to make sawdust or play Guild Wars. I also have a rare autographed copy of Ad Verbum. I try to avoid P. J. Brown's deadly sins. I'm married to a licensed psychologist, game designer, and modder. I've appeared onstage (and in various clubs) as a jazz pianist, as a dancer, but most often as a chorister. My wish-fulfillment dreams are of sleeping.