The abstractions and expressive powers of programming languages deeply impact programmers' productivity and the way programmers think. The features of a programming language also directly affect the design and power of programming tools (such as compiler, debugger, linter) associated with the language. As future computer scientists and software engineers who work intimately with many programming languages over their career, it is important for students to have a grounded understanding of the principles of programming languages, their implementation, and their associated tools so that they can make informed decisions, develop better software, or contribute to development of new programming languages.

PRIMARIES

The journey through this focus area should start with CS2104 Programming Language Concepts. CS2104 introduces students to different programming paradigms and principles of programming language design. CS4212 Compiler Design focuses on the compiler, which besides generating high-level programs into lower-level executable binaries, can also analyze programs for bugs and optimize the generated binaries for performance. CS4215 Programming Language Implementation explores how common programming language systems are implemented under the hood, including topics such as garbage collection, dynamic binding, interpreter, and virtual machine. Finally, CS3211 Parallel and Concurrent Programming gives a perspective on the programming languages, techniques, and tools, for developing parallel and concurrent software.

ELECTIVES

Modules that are related to this area include CS3234 Logic for Proofs and Programs which among other things cover logic programming paradigm, CS5232 Formal Specification & Design Techniques, which covers how to formally specify software requirements, and CS5215 Constraint Processing, which introduces students to constraint programming, another paradigm for programming.

Two other modules in this focus area allow students to learn two important programming tools: the compiler and the linter, in great depth. These modules are CS5214 Design of Optimising Compilers and CS5218 Principles and Practice of Program Analysis.