Since the last comparative review of texts in programming languages, several changes have been wrought. The functional, logic, and parallel programming paradigms have come into fairly widespread use; the C language and the UNIX operating system have influenced system design; and the ACM/IEEE Joint Curriculum Task Force has issued its report [1]. This review concentrates on selected texts issued since the last report and uses as metrics the Knowledge Units and themes of that report.
Of the books reviewed, only one has been published since the issuance of the report. However, it is not the content of the study of programming languages that has changed so much as the way that the content may be viewed and structured into courses within the curriculum. There is no longer one course recommended by the ACM. Instead, a program can use the knowledge units to formulate the program that best suits its students and objectives. The course that was called CS8 in Curriculum 78 may no longer exist in some schools. It is doubtful that the study of comparative programming languages as a course will completely disappear, but portions of the material once covered in CS8 may be covered in other ways.
Appleby
This book gives equal weight to imperative and declarative language paradigms, while emphasizing theoretical foundations for different language types.… It includes 10 tutorials on underlying mathematical theory, 15 historical vignettes on prominent language innovators and 23 laboratory assignments employing nine different languages. (p. xv)
This text is the first to explicitly follow the recommendations of the Task Force. In addition to the text, five “low-cost” mini-manuals written by separate authors are, or soon will be, available: one each for Ada; C and C++; Pascal and Object Pascal; Scheme; and Prolog. The complete laboratory assignments are in the instructor’s guide, not in the student text.
The author lists the ability to program well in at least one high-level language as the only necessary prerequisite, but suggests assembly language as helpful. More than a nodding acquaintance with notation systems as studied in discrete math would be helpful. The author believes that “students learn languages by studying exemplary programs and making modifications as well as writing their own programs” (p. xix).
This text is a superb example of the importance of ancillary materials. The mini-manuals are a welcome sight for those who have felt the coverage of new languages is too slight in most programming language texts, and that to require their students to purchase separate texts is too expensive and detailed. The laboratory exercises are detailed in their specifications, and the mini-manuals concentrate on the language features needed to complete the labs. The instructor’s guide also includes answers to all the exercises integrated within the text chapters.
The text includes superb notes on the end-of-chapter references. The paradigm organization encourages the integration of the programming projects. Students should appreciate the depth of background presented as well as the excellent index.
Table 1: Coverage of Knowledge Units from Computing Curricula 1991 |
| Appleby | Fried- man | Sebesta | Wilson and Clark | Dershem and Jipping | Mayer | Sethi | Watt | Gelernter and Jagannathan* |
PL1: history |
Early languages | exten | cover | cover | cover | minim | minim | minim | minim | exten |
Non-procedural paradigms: | | | | | | | | | |
functional | cover | cover | cover | cover | cover | none | cover | cover | cover |
logic | cover | cover | cover | cover | cover | cover | cover | cover | cover |
object | cover | cover | cover | cover | cover | none | exten | cover | cover |
parallel | cover | cover | minim | cover | cover | cover | cover | cover | cover |
PL2: virtual machines |
virtual machines | minim | cover | define | none | none | none | none | none | define |
actual vs. virtual | minim | cover | define | none | none | none | none | none | none |
hierarchy up to OS | minim | cover | define | none | none | none | none | none | none |
binding times | cover | minim | cover | exten | cover | none | minim | exten | cover |
PL3: data representation |
elementary | cover | cover | cover | cover | cover | cover | cover | cover | cover |
structured | cover | cover | cover | cover | cover | cover | math | math | cover |
PL4: sequence control |
expressions, order of evaluation | cover | minim | cover | cover | cover | minim | cover | exten | cover |
statements | minim | cover | cover | cover | minim | cover | cover | cover | minim |
subprograms | cover | cover | cover | cover | cover | cover | cover | cover | cover |
coroutines | cover | cover | cover | cover | cover | none | define | minim | none |
exception handling | cover | define | cover | cover | cover | cover | cover | cover | none |
PL5: data control/sharing/typechecking |
sharing | cover | cover | cover | cover | cover | minim | cover | none | none |
static vs. dynamic | cover | cover | cover | cover | cover | minim | cover | cover | minim |
parameter passing | cover | cover | cover | cover | cover | cover | cover | cover | cover |
varieties of checking | cover | cover | cover | cover | cover | cover | cover | cover | cover |
PL6: runtime storage management |
static allocation | cover | none | cover | cover | define | cover | none | cover | none |
stacks | minim | none | cover | cover | define | cover | none | cover | none |
heap | minim | none | cover | none | define | cover | none | cover | none |
This book is not without its drawbacks, however. The second printing has rectified many of the typos found in the first, but many await correction in a second edition.
The goals of the book are laudable, but perhaps overly ambitious for a second- or third-year course. The book lends itself well to selection and omission of material, however. The clarity of presentation varies from wonderfully lucid to downright confusing. For example, the excursion on formal languages uses a semi-formal descriptive approach. The tutorial is weakened by starting at a level too high for the uninitiated reader and too imprecise for the sophisticated one. The language examples may be somewhat complicated for the novice programmer. A program written in B (the predecessor of C) uses \0 and \n, which are not described as the keyboard representations of single characters.
Friedman
This book is designed to help us [problem solvers working within the programming function…] to become better programmers, program developers, systems analysts (p. xi).
This is one of the few texts designed specifically for an information systems curriculum as opposed to pure computer science. As such, it has many differences from the other texts in the field. The first two hundred pages of the book are organized around the themes of structure and abstraction of language characteristics. It has an excellent historical approach to the study of programming languages. Friedman includes an unstated emphasis on the contribution of women to the development of programming languages. Her bibliography alone makes this an invaluable reference guide.
This text is not theory based, but it does contain clear definitions for features common to programming languages. The chapter ends are strong; they include a summary, a list of terms introduced in the chapter, and a nicely annotated bibliography.
Table 1: Coverage of Knowledge Units from Computing Curricula 1991 (con’t.) |
| Appleby | Fried- man | Sebesta | Wilson and Clark | Dershem and Jipping | Mayer | Sethi | Watt | Gelernter and Jagannathan* |
PL7: finite state automata |
deterministic/ non | minim | none | none | none | none | none | none | none | none |