On this page:
1.1 Thread 1:   Language Building Blocks
1.2 Thread 1:   Books & Other Resources
1.3 Thread 2:   Learning Languages & Concepts
1.4 Effort Required

1 Introduction🔗

Your fundamental tool as a computer scientist and software engineer is the programming language. Increasing your understanding of this tool not only makes you a more-effective problem solver in languages you know, but also prepares you to acquire languages you don’t—even those that don’t yet exist.

Programming languages of all shapes and sizes are found under every rock in computing. There are large, mainstream languages that everyone uses regularly. But, there are also small, domain-specific languages that are like feudal lords: well-known to their subjects, but anonymous in the wider world.

This course will teach you the concepts underlying the design of all programming languages and how to apply them to solve novel problems. In contrast to other courses of this nature, we will not treat programming languages like fish and try to make little boxes for them to fit in. Programming languages are not fish. Instead, we will explore the “periodic table” of languages features and concepts, under the discipline of a systematic approach to program design.

1.1 Thread 1: Language Building Blocks🔗

For the majority of our class we will be building an interpreter for syntax features which form the building blocks for programming languages. We will not be concerned as much with syntax, other than for practical purposes of writing and parsing examples to test our interpreter.

In a rough and ready sort of way it seems to me fair to think of the semantics as being what we want to say and the syntax as how we have to say it. In these terms the urgent task in programming languages is to explore the field of semantic possibilities. When we have discovered the main outlines and the principal peaks we can set about devising a suitably neat and satisfactory notation for them, and this is the moment for syntactic questions.

- Christopher Strachey Fundamental Concepts in Programming Languages

1.2 Thread 1: Books & Other Resources🔗

(HtDP) The first few weeks we will reference the second edition of the free online textbook How to Design Programs, by Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthi, to introduce functional programming and the design recipe.

(PLAI) For the majority of the course, we will be following the basic outline of the second and third editions of the free online textbook Programming Languages: Application and Interpretation, by Shriram Krishnamurthi.

This text uses a different language than we will use in class, but the concepts are the same, and we use the same tooling.

(VIDEO LECTURES) For most of the class we will be assigning video lectures to watch and follow along prior to class. These video lectures come from a similar course by UofU professors Matthew Flatt and Ben Greenman. Their course closely follows the same (PLAI) textbook, but uses the language that we will use in class.

We will not use the textbooks in the traditional way. Think of them as your lecture notes. Don’t read them before a class, but feel free to refer to them afterwards. Each text is superb, so you won’t need to distract yourself from the discussion by taking copious notes. (You may want to take note of your ideas and insights, but the content of the lecture will be in the video lectures and texts.)

1.3 Thread 2: Learning Languages & Concepts🔗

Occasionally we will have assignments and lectures that aren’t directly related to building the interpreter.

We will take the opportunity to expose you to a few languages that you might not be as familiar with.

This will also give us an opportunity to slow down and focus on what you can take away from what you have learned.

1.4 Effort Required🔗

This course is designed to be challenging, but rewarding.

This class will use online resources to guide you through the basics, but the real learning will come from what we do in class and the assignments you complete.

The assignments and class are designed to:
  • Stretch you and deepen your knowledge about the concepts you learn

  • Help you apply what you learn in your daily programming

  • Cover concepts not typically covered in other similar courses

  • Introduce you to new languages and programming paradigms

As a guiding principle, the assignments should require effort, thought, time and preparation, but should not be tricky.

If you feel that you:
  • were not prepared for an assignment

  • are not understanding the material

  • have other concerns

even after watching the video lectures, and attending class, please come see me or the TA.