This course covers fundamental aspects of the design of programming languages. Aspects contributing to design include the human factors of programming languages, the study of programming paradigms, and the fundamentals of programming language theory. Case studies in the design of existing programming languages will be considered, including the design of novel paradigms such as visual programming, programming by example, and concurrent programming languages.
Programming languages describe the protocols we use to communicate with computing machines. From the earliest days of the introduction of symbolic assembly languages, language designers have tried to make this communication easier by introducing languages that make programming easier, more intuitive, more robust, and accessible to ever growing groups of people. The study of programming languages is useful not only to prospective language designers, but also to programmers who wish to better understand why the language they are using is the way it is.
This course will cover programming language design from a variety of standpoints. We will show how languages have different design goals based on their intended application domains. Programming models form the basis of language design by providing high-level abstract machines over which the language operates. Programming paradigms are designed to give cohesive frameworks for language design. Programming language theory gives the basis for formally describing the semantics of programming languages, and reasoning about their properties. Finally, the human factors of programming languages gives us an understanding of what makes languages easy or difficult to use.
The course will include case studies in the design of programming languages, including both traditional and novel programming paradigms. Evaluation will consist of assignments, and a research project with accompanying seminar.