• Lexical Analysis
  • Parsing
  • Semantic Analysis
  • Optimization
  • Code Generation


  • Abstraction = detached from concrete details
    • “Abstraction is selective ignorance” - Andrew Koenig
  • Modes of abstraction
    • Via languages/compilers: High-level code, few machine dependencies Via functions and subroutines: Abstract interface to behavior
    • Via modules: Export interfaces; hide implementation
    • Via classes/abstract data types: Bundle data with its operations


  • Error handling (“When I encounter code which is incomplete or erroneous, I would like to present the user with a helpful message for each error in the program instead of immediately dying with an unhelpful message at the first error.”)
  • Syntax challenges (“When you encounter a -, is it unary negation or a minus sign?”)
  • Semantics challenges (“Can I correctly resolve function overloads per the PL specification for each invocation?”)
  • Typing challenges (“Does the compiler determine type correctness via type inference, type checking, or ‘both’?”)