This topic is concerned with the concepts and mechanisms that underlie modern programming languages as well as providing insights into the capabilities and limitations of languages, computers and algorithms. The topic combines both theoretical foundations and practical demonstrations of issues relating to programming and algorithm design. It teaches fundamental skills necessary to selection of an appropriate programming paradigm for a problem, whilst highlighting the distinct and overlapping capabilities of three families of programming languages. The topic examines concepts such as types, variables, binding, abstraction, parameterization, encapsulation, generics, polymorphism, inheritance, recursion, iteration, formal languages, automata, logic, proof, decidability, computability and complexity. It uses as vehicles for illustration and exploration multiple languages supporting a variety of programming paradigms, including the procedural, functional, object-oriented and logic programming paradigms. The topic has an emphasis on design and evaluation of efficient, efficacious programs, including analysis and benchmarking of programs, with close integration of the theoretical and practical components, and workshops to assist in application of theory.