--- tags: chapman, programming langauges, cpsc 354 --- # Learning Outcomes of CPSC 354 (draft) ... the Programming Languages course at Chapman University ... ## Practical Skills - using Git - writing a report in Latex - programming in Haskell - using the parser generator BNFC - programming linked data structures with pointers - making sense of a research paper - documenting software - learning a new programming language - programming in a language one doesn't know [^language] - relying on online resources or - by understanding underlying theoretical concepts - ... [^language]: For most students this includes Latex and Haskell (first item below) and for all students that includes our home-made languages LambdaNat and LambdaFun (second item below). ## Theoretical Background - context-free grammars - lambda calculus - models of computation - rewriting to normal form - proving termination of algorithms - decidability - proving theorems on models of computation - invariants - abstraction as quotient wrt equivalence relations - operational and denotational semantics - Curry-Howard isomorphism - ... ## Problem Solving Techniques - finding the right level of abstraction - recursion (solving a problem by pretending to be able to solve it) - minimal working example - guess and verify - syntax-semantics double-think [^doublethink] - invariants - ... [^doublethink]: What I mean here is to be able to blindly follow meaningless rules and simultaneously anticipate the meaningful end for which the rules have been designed in the first place. Double-think is an essential skill in design algorithm and in debugging programs. ## Programming Languages Concepts (not everything was covered in the same amount of detail but all the items below showed up at some point) - functional programming - lexing, tokenizing - parsing - abstract syntax - algebraic data types - recursion over abstract syntax - call stack - pattern matching - interpretation - virtual machine - imperative vs functional programming - syntax vs semantics - lazy vs strict, call by name vs call by value - macro substitution vs capture avoiding substitution - typed vs untyped - compile time vs run time - specification vs implementation - stack vs heap - mutable vs immutable variables - memory allocation - garbage collection - monads - polymorphism - propositions as types, proofs as programs, Curry-Howard Isomorphism - verification, Hoare logic - theorem proving - domain specific languages (DSLs) - ...