Fundamentals of Programming Languages

Course Websites

Fall 2023 - Prof. Bor-Yuh Evan Chang

Fall 2021 - Prof. Gowtham Kaki

Spring 2020 - Prof. Bor-Yuh Evan Chang

Spring 2018 - Prof. Bor-Yuh Evan Chang and Prof. Matthew A. Hammer

Fall 2016 - Prof. Matthew A. Hammer

Fall 2015 - Prof. Matthew A. Hammer

Course Overview

This course introduces the fundamental principles behind modern programming language design, semantics, and implementation. Ultimately, you should come away with the ability to apply foundational programming language ideas and techniques to your own projects.

The course has two broad topics:

  • Introduction to Semantics and Type Systems: How do we describe programming languages? And which programs “make sense”?
  • Research Applications: Students will have the opportunity to consider other related topics of interest in the form of a course project, most often in the form of a survey of recent research on a topic of interest.


The prerequisites for this course are programming and mathematical experience with several different programming languages (e.g., C, ML, Java) with diverse computational models (i.e., imperative and functional), which may be satisfied by taking CSCI 3155 or equivalent. The ideal programming experience is experience implementing language tools, which may be satisfied by taking an undergraduate compilers course (e.g., CSCI 4555). The ideal mathematical experience is familiarity with mathematical logic and the ability to construct rigorous proofs (in particular by structural induction). Your desire to be exposed to this material is very important.

Advanced undergraduates may consider taking this course after talking with the instructor.

If you have not already taken these courses or if you have any concerns, please talk with the instructor. Proficiency in programming and mathematical logic is absolutely expected. This means that you should be able to pick up a new programming language with relative ease and are reasonably comfortable with inductive thinking.