At the end of this course the successful student will be able to:
A successful student will be able to complete all the above tasks, except writing programs, without references. Students will not be expected to write a compiler.
Language design is fundamental to programming (and hence computer science), because a crucial step in solving a problem with a computer is designing an adequate notation for stating the problem (the specification) and expressing the solution (e.g., as a collection of data types and procedures). Since programs evolve over time, it is essential that these notations be carefully designed from the start. Thus it is important to be able to criticize designs, so that any faults of the notation become known as soon as possible. Aesthetic faults of a design may be irksome, but it is necessary to pay the most attention to potential sources of bugs, inefficiency, or expensive maintenance; so it is necessary to distinguish the aesthetic features from the rest.
Understanding several different paradigms of programming is essential to finding creative and efficient solutions to programming problems. Understanding the implementation of run-time data structures is necessary so that one judge efficiency issues correctly and so that one can ``program into'' a given language, instead of being limited by it.