Part IV is devoted to programming large systems with emphasis on language support for object-oriented programming. Finally, Part V surveys the basic concepts of functional and logic programming. In any case, the student should have a basic reading knowledge of C. A familiarity with the structure and machine code of some computer will also be helpful. There is too much material for a single course. An advanced course should certainly include Part V supplemented by more material on some non-imperative language chosen by the instructor.
Starred sections are more appropriate for advanced students.
It is possible to obtain free compilers for most languages as discussed in Appendix A. Students should also be taught how to examine the assembly language instructions that are emitted by the compilers that they use. Instead, we ask the students to dig into language descriptions, compare languages and verify compiler implementations of language constructs. The instructor is encouraged to tailor the exercises and append others, according to personal taste and the availability of tools. I admit that I prefer higher to lower levels of abstraction. We software engineers have an exceedingly dismal record when it comes to producing reliable software systems, and I believe that part of the solution lies in higher levels of abstraction in programming languages.