Below is an outline of the concepts covered during the course. The final exam is cumulative. I’ve put asterisks next to some particularly important items sure to appear!
- Concepts
- Basic PL concepts
- Compiled vs. Interpreted
- Stages of compilation
- Imperative vs. Functional vs. Declarative
- Syntax
- BNF*
- Orthogonality
- Writing parsers (recursive descent)
- Memory allocation
- Stack / heap / static
- Object / binding lifetime
- Avoiding common memory / security issues
- Object orientation
- Generics and Templates
- Information hiding
- Nested functions
- Module systems
- Multiple inheritance
- Diamond problem*
- Approaches taken by different languages
- Type systems*
- Type conversion
- Determining types (type inference)
- Optional type
- Propositions as types
- Dynamic vs static
- Scope
- Method binding
- Typing
- Logic programming concepts
- State-space problem solving
- Constraint based problem solving
- Functional programming concepts
- Lambdas, lambda calculus
- Higher order functions
- Reduction as a method for evaluation
- Immutability
- Pure functions (side-effect free)
- Code is data is code*
- Pattern matching
- Scripting Languages
- Characteristics / uses
- Concurrency / Parallelism
- Basic PL concepts
- Languages
- All of them we’ve used!
Expect questions to cover concepts, things we’ve done in class, and things which have been explored in projects. Questions comparing how language features are exposed in different programming languages are always fair game. For all of the languages we’ve used, expect “what does this code do?” style questions, as well as some short code writing problems (single lines of code, or very tiny functions using very common language constructs you have definitely used in class and in your project).