Programming languages are arguably a software developer's most important tools. Different languages embody different ways of viewing problems and computation in general. Understanding what languages can do helps programmers choose and use languages effectively. Understanding how languages work helps programmers devise their own linguistic tools for specialized applications.
This course exposes students to various features across different programming languages, and the tools that they inspire (or inhibit!). We will implement a variety of common language features to illustrate how languages are built. We will study common linguistic tools (such as type systems) and program-analysis techniques to see what these tools can and cannot do to aid programmers. By the end of the course, students will have a greater appreciation for languages, their features, and their potential to aid in software development.
The course assumes that students have non-trivial programming experience (equivalent to that from a programming-based 3000-level course, such as software engineering or operating systems). This is NOT an introductory programming course! The assignments will be programming intensive. Experience in a particular language is not required, though prior experience in a functional language (such as Racket) will be useful (though I don't expect that you remember Racket in detail).
BS/MS credit will be offered; more details after we get started with the course material. Roughly, BS/MS students will do an extra assignment and sometimes an additional question on the assignments for the entire class.
Contact Professor Fisler with any questions.