- You should understand and internalize the different characteristics in Table 1.1.
- You should be able to evaluate a language or feature with respect to the characteristics in Table 1.1.
- You should be able to compare two languages or language features with respect to the characteristics in Table 1.1.
- You should be able to evaluate the different implementation models with respect to a given situation.
- You should be able to determine whether a given aspect of a language is part of the syntax or part of the semantics.
- You should be able to describe in your own words the language that a BNF grammar generates.
- You should be able to determine if a given sentence is generated by a given BNF grammar.
- You should be able to determine whether two grammars generate different languages or the same language.
- You should be able to create a BNF grammar that generates a given language.
- You should be able to derive sentences (using a parse tree or derivation tree if needed) from a BNF grammar.
- You should be able to figure out if a given grammar is ambiguous.
- You should be able to figure out what precedence and associativity a given grammar uses.
- You should be able to determine what precedence of a given language uses by writing and running programs in the language.
- You should be able to discuss the relative strengths and weaknesses of static and dynamic type bindings
- You should know how to use variables with each of the four storage bindings: static, stack dynamic, explicit heap dynamic, and implicit heap dynamic
- You should be able to determine how a program will behave with static scoping and with dynamic scoping.
- You should be able to write a program that hides specified variables using scoping.
- You should be able to write a program that can distinguish between static and dynamic scoping.
- You should be able to use the data types discussed (integers, arrays, enums, subrange types, unions)
- You should be able to the strengths and weaknesses of the different implementation choices for the data types discussed
- You should know the difference between strong and weak typing and be able to describe their relative strengths and weaknesses
- You should know the relative strengths and weaknesses of name and structural equality
- You should be able to determine if two types are equal by name or structural equality or neither
- You should be able to write programs that determine whether a language uses name or structural equality
- 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.
- You should be able to determine how a given program will behave when given the precedence rules, associativity rules, and operand evaluation order
- You should be able to write a program that determines what precedence, associativity, and operand evaluation order a language uses.
- You should be able to write a program that exploits short-circuit evaluation capabilities of a language
- You should know when and how to use "switch" statements (multiway branch)
- You should know how and when to use different flavors of loops
- You should know how to use the guarded command and how it differs from "if" and "while" statements
- You should know when and how to use all the parameter passing modes (value, result, value-result, reference, name).
- You should be able to write programs that determine which parameter passing mode is used by a language.
- You should be able to determine how a program will behave given a parameter passing mode.
- You should be able to figure out legal argument types for a formal parameter for each parameter passing modes.
- You should be able to write programs to determine whether a language uses deep or shallow binding.
- You should be able to determine how a program will behave with deep binding and with shallow binding.
- You should be able to recognize if a given (small) program suffers from either the dangling pointer or memory leak bug.
- 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.
- You should understand how reference counting works and what its weaknesses are.
- You should understand how mark-and-sweep works and what its weaknesses are.
- You should know the strengths and weaknesses of languages with pointer arithmetic.
- 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.
-
- You should be able to draw the run-time stack associated with a particular point in the execution of any given program.
- 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.
- You should be able explain why implementing static scope for nested first-class subprograms is difficult in stack-based languages.
- You should be able to use the abstraction mechanisms in languages such as Java, C++, etc., to write abstract data types.
- You should be able to write generic abstract data types.
- You should be able to evaluate a given abstract data type on its qualities.
- You should know how to use inheritance to get code reuse and subtyping.
- You should be able to use dynamic dispatching.
- You should be able to walk through an object-oriented program and explain which method implementations each method invocation will use.
- You should know when and how to use Java interfaces.
- You should understand the subtyping relationships (or equivalently narrowing and widening conversions) between interfaces and subinterfaces, and interfaces and
classes implementing the interfaces.
- You should understand the subtyping relationships between generic data types.
- You should understand which redefinitions of parameter and return value types are permissible when overriding methods
- You should understand the advantages and disadvantages of multiple inheritance.
- You should know how to use try-catch to handle exceptional situations
- You should know how and when to use the finally block
- You should be able to explain how a program using exceptions will behave at run time
- You should be able to construct the v-tables for given classes.
- You should be able to use the v-tables to determine which implementations will be used in a dynamic dispatch.
- You should understand why a straightforward implementation of v-tables does not work in the presence of multiple inheritance or Java interfaces.
- You should know what each of the following concepts mean: referential transparency, functional forms, and first class functions.
- You should be able to program ML programs using the features described in the reading.