Course Project
Students registered for CS 386L (the graduate-level version of the course) are required to complete a course project. The project is intentionally open-ended and is an opportunity to explore something interesting in the realm of programming languages, broadly construed.
Ideas
I think programming languages is a very broad topic, touching many fields of computer science, and so we'll take a similarly broad approach to defining what's in scope for the course project. Here are a few suggested directions to consider (these are by no means exhaustive):
- Contribute some code to an open-source compiler — look for open issues or missing features and implement them yourself
- Build a program synthesis tool — a tool that can automatically generate correct programs — for a domain you're interested in
- Adapt PL ideas in domains you might not think of as "programming" -- cell biology, education, etc. This might mean defining your own language for a new domain, or taking some of the formal ideas from this class and producing a new domain-specific twist on them.
- Model and prove the correctness of some interesting feature of a language you like, or a feature you wish a language had.
- Apply programming languages ideas to your own research, regardless of area.
- Build a tool for identifying a class of security issues in programs.
- Implement a garbage collector for C.
- Write a survey of a programming languages topic that we aren't covering in this class, but could. Basically: if you had to give a lecture in this class, what would you talk about? Teach yourself enough about that topic to write a lecture. If you choose this route, expect to read several textbooks and/or research papers, so don't underestimate how much work it will be. Some suggested topics:
- Concurrency -- pi calculus, shared memory, consistency models, etc.
- Databases are closely coupled to programming languages ideas -- relational algebras, query languages, query compilation, etc.
- Memory management -- garbage collection, reference counting, region-based (Rust), etc.
- Refinement types -- fancy type systems that include rich predicates, liquid types, etc.
- Separation logic -- reasoning about programs with heaps
Basically, the goal is to either code, model, or write something that piques your interest and applies the ideas from this class.
Milestones
There are two milestones for the project, both submitted via Canvas:
- Submit a short project proposal (1–2 pages, plus references) by September 29 at 6pm CT. The proposal should identify your group members (if applicable), outline what you intend to do, sketch how you intend to do it, estimate how much work it will take, and describe why it's relevant to programming languages research (if it's not obvious). We'll use the proposal as an opportunity to give you feedback on your project direction, making sure it's in scope for the course and an appropriate size for the semester.
- Submit a final project report (4–6 pages, plus references) by December 1 at 6pm CT. The final report should describe the problem you tried to solve, how you solved it, any results or data you gathered, and any future directions for the work. Think of the project report as writing a short research paper that you could submit to a workshop. We'll grade the final project report based on the ambition of the proposed project, the results achieved, and the quality of the report.
Group projects
You may complete the course project alone or in a group of up to 3 students. Larger groups should expect to propose and complete commensurately larger projects. As part of the project proposal, we'll give feedback on whether the scope of your project is appropriate for the group size and length of the semester. All group members will receive the same grade for the project, except in exceptional circumstances.
Redeemable option for CS 345H
Students registered for CS 345H (the undergraduate version of this course) can choose to complete the course project on a redeemable basis. This means we'll compute your final grade with both the 345H and 386L grading scales and you will receive whichever grade is higher. In other words, there's no risk involved in choosing to do the course project—although it will still be a lot of work!—so we encourage you to give it a try if you're interested in doing something cool with programming languages.
It's fine for students to form groups across both variants of the course. Please don't interpret this flexibility as license to "flake out" on a group project: in exceptional circumstances where group members haven't contributed fairly to a project, we reserve the right to deny you the redeemable option (offering only the grading scale that includes the project) and/or to assign different project grades to members of the same group. You cannot opt into the course project after the due date for project proposals has passed.