1. You should understand and internalize the different characteristics in Table 1.1.
  2. You should be able to evaluate a language or feature with respect to the characteristics in Table 1.1.
  3. You should be able to compare two languages or language features with respect to the characteristics in Table 1.1.
  4. You should be able to evaluate the different implementation models with respect to a given situation.


  1. You should be able to determine whether a given aspect of a language is part of the syntax or part of the semantics.
  2. You should be able to describe in your own words the language that a BNF grammar generates.
  3. You should be able to determine if a given sentence is generated by a given BNF grammar.
  4. You should be able to determine whether two grammars generate different languages or the same language.
  5. You should be able to create a BNF grammar that generates a given language.
  6. You should be able to derive sentences (using a parse tree or derivation tree if needed) from a BNF grammar.
  7. You should be able to figure out if a given grammar is ambiguous.
  8. You should be able to figure out what precedence and associativity a given grammar uses.
  9. You should be able to determine what precedence of a given language uses by writing and running programs in the language.


  1. You should be able to discuss the relative strengths and weaknesses of static and dynamic type bindings
  2. You should know how to use variables with each of the four storage bindings: static, stack dynamic, explicit heap dynamic, and implicit heap dynamic


  1. You should be able to determine how a program will behave with static scoping and with dynamic scoping.
  2. You should be able to write a program that hides specified variables using scoping.
  3. You should be able to write a program that can distinguish between static and dynamic scoping.


  1. You should be able to use the data types discussed (integers, arrays, enums, subrange types, unions)
  2. You should be able to the strengths and weaknesses of the different implementation choices for the data types discussed


  1. You should know the difference between strong and weak typing and be able to describe their relative strengths and weaknesses
  2. You should know the relative strengths and weaknesses of name and structural equality
  3. You should be able to determine if two types are equal by name or structural equality or neither
  4. You should be able to write programs that determine whether a language uses name or structural equality


  1. You should be able to write a program that exploits the language's precedence rules, associativity rules, and operand evaluation order to perform a given computation.
  2. You should be able to determine how a given program will behave when given the precedence rules, associativity rules, and operand evaluation order
  3. You should be able to write a program that determines what precedence, associativity, and operand evaluation order a language uses.
  4. You should be able to write a program that exploits short-circuit evaluation capabilities of a language
  5. You should know when and how to use "switch" statements (multiway branch)
  6. You should know how and when to use different flavors of loops
  7. You should know how to use the guarded command and how it differs from "if" and "while" statements


  1. You should know when and how to use all the parameter passing modes (value, result, value-result, reference, name).
  2. You should be able to write programs that determine which parameter passing mode is used by a language.
  3. You should be able to determine how a program will behave given a parameter passing mode.
  4. You should be able to figure out legal argument types for a formal parameter for each parameter passing modes.
  5. You should be able to write programs to determine whether a language uses deep or shallow binding.
  6. You should be able to determine how a program will behave with deep binding and with shallow binding.


  1. You should be able to recognize if a given (small) program suffers from either the dangling pointer or memory leak bug.
  2. You should be able to rewrite a program with a dangling pointer or memory leak bug so that it does not have such a bug.
  3. You should understand how reference counting works and what its weaknesses are.
  4. You should understand how mark-and-sweep works and what its weaknesses are.
  5. You should know the strengths and weaknesses of languages with pointer arithmetic.


  1. You should be able to explain what the following are and how they're used: The stack pointer, the static and dynamic links (and chains), local variable space, variable offsets.
  2. You should be able to draw the run-time stack associated with a particular point in the execution of any given program.
  3. You should be able to describe how any variable reference will be resolved, given a run-time stack and knowledge of the scope and storage binding rules in effect.
  4. You should be able explain why implementing static scope for nested first-class subprograms is difficult in stack-based languages.


  1. You should be able to use the abstraction mechanisms in languages such as Java, C++, etc., to write abstract data types.
  2. You should be able to write generic abstract data types.
  3. You should be able to evaluate a given abstract data type on its qualities.
  4. You should know how to use inheritance to get code reuse and subtyping.
  5. You should be able to use dynamic dispatching.
  6. You should be able to walk through an object-oriented program and explain which method implementations each method invocation will use.
  7. You should know when and how to use Java interfaces.
  8. You should understand the subtyping relationships (or equivalently narrowing and widening conversions) between interfaces and subinterfaces, and interfaces and classes implementing the interfaces.
  9. You should understand the subtyping relationships between generic data types.
  10. You should understand which redefinitions of parameter and return value types are permissible when overriding methods
  11. You should understand the advantages and disadvantages of multiple inheritance.


  1. You should know how to use try-catch to handle exceptional situations
  2. You should know how and when to use the finally block
  3. You should be able to explain how a program using exceptions will behave at run time


  1. You should be able to construct the v-tables for given classes.
  2. You should be able to use the v-tables to determine which implementations will be used in a dynamic dispatch.
  3. You should understand why a straightforward implementation of v-tables does not work in the presence of multiple inheritance or Java interfaces.


  1. You should know what each of the following concepts mean: referential transparency, functional forms, and first class functions.
  2. You should be able to program ML programs using the features described in the reading.