Skip to content

Welcome to CS 538!


  • Due to COVID-19, CS 538 will be conducted virtually for the rest of Spring semester.
  • All times are Madison local time, Central Daylight Time (CDT)
  • The late day policy has been changed---please read carefully.

This is an advanced undergraduate-level course covering the theory and design of programming languages. This course will introduce students to two real-world languages at the cutting edge of programming language design: Haskell and Rust. Through hands-on experience, students will learn about functional, imperative, and concurrent features common across many modern programming languages. In parallel, the course will also introduce ideas from the theory of programming languages by developing mathematical, core versions of the main languages. By studying these simplified languages, we will address questions like: How can we describe a programming language? How can we specify the behavior of programs? How can we ensure that programs don't go wrong?


  • Course: CS 538, Spring 2020
  • Location: CS 1325 BBCollaborate Ultra
  • Time: Mondays and Wednesdays, 2:30-3:45


  • Canvas: We will be using Canvas for all assignments and grades.
  • Piazza: Please post all questions on the course Piazza instead of sending email.
  • Slido (NEW): During live lectures, ask/upvote questions on Use the room code #CS538.

Course Staff

  • Instructor: Justin Hsu

    • Email:
    • Office hours: Tuesday 11-12
    • Location: CS 6379 BBCollaborate Ultra
  • Teaching Assistant: Zach Susag

    • Office hours: Monday 1-2, Thursday 11-12
    • Location: CS 5331 BBCollaborate Ultra
  • Peer Mentor: Jeremy Intan

    • Office hours: Friday 12:45-2:15
    • Location: CS 1304 BBCollaborate Ultra
  • Peer Mentor: Link Lin

    • Office hours: Wednesday 4-5:30
    • Location: CS 1289 BBCollaborate Ultra


  • Who should take this course?

You should, if you want to learn about (a) functional, imperative, and concurrent programming, (b) cutting-edge programming languages and how they try to prevent bugs at compile time, (c) mathematical models of programming languages. You should also be prepared for some struggle when you try to convince the compiler that your program is indeed correct.

  • What are the pre-requisites?

Ideally you will have completed the main sequence (CS 200/300/400) or equivalents, but at a bare minimum you should be familiar with at least one programming language, whether from a previous class or from personal projects. There is minimal overlap between this course and CS 536; you can take the courses in either order, or even in parallel.

  • Will there be programming?

Yes, there will be programming.

  • Will there be math?

We will not be doing any proofs, but there will be mathematical notation and you will learn lots of Greek symbols.