Instructor’s Solutions Manual to Concepts of Programming Languages Eleven th Edition R.W. Sebesta 2 Preface Changes for the Eleventh Edition he goals, overall structure, and approach of this eleventh edition of Concepts of Programming La nguages remain the same as those of the ten earlier editions. The principal goals are to introduce the fundamental constructs of contemporary programming languages and to provide the reader with the tools necessary for the critical evaluation of existing and future programming languages. A secondary goal is to prepare the reader for the study of compiler design, by providing an in -depth discussion of programming language structures, presenting a formal method of describing syntax, and introducing a pproaches to lex ical and syntactic analysis. The eleventh edition evolved from the tenth through several different kinds of changes. To maintain the currency of the material, much of the discussion of older programming languages, particularly Ada and Fortran, has been rem oved. For example, the descriptions of Ada’s records, union types, and pointers were removed from Chapter 6. Likewise, the description of Ada’s for statement was removed from Chapter 8 and the discussion of Ada’s abstract data types was removed from Chapte r 11. On the other hand, a section on reflection that includes two complete program examples was added to Chapter 12, a section on exception handling in Python and Ruby was added to Chapter 14, and a table of the design choices of a few common languages fo r support for object -oriented programming was added to Chapter 12. In some cases, material has been moved. For example, Section 9.10 was moved backward to become the new Section 9.8. In one case, example program MAIN_2 in Chapter 10 was rewritten in JavaSc ript, previously having been written in Ada. Chapter 12 was substantially revised, with several new paragraphs, two new sections, and numerous other changes to improve clarity. T 3 The Vision This book describes the fundamental concepts of programming languag es by discussing the d esign issues of the various language constructs, examining the design choices for these constructs in some of the most common languages, and critically comparing design alternatives. Any serious study of programming languages requires an examination of some related topics, among which are formal methods of describing the syntax and semantics of programming languages, which are covered in Chapter 3. Also, implementation techniques for various language constructs must be considered: Lexical and syntax analysis are discussed in Chapter 4, and implementation of subprogram linkage is co vered in Chapter 10. Implementation of some other language constructs is discussed in various other parts of the book. The following paragraphs outline the co ntents of the eleventh edition. Chapter Outlines Chapter 1 begins with a rationale for studying programming languages. It then discusses the crit eria used for evaluating programming languages and language constructs. The primary influences on language design, common design trade -
offs, and the basic app roaches to implementation are also examined. Chapter 2 outlines the evolution of the languages that are discussed in this book. Although no attempt is made to describe any language completely, the origins, purposes, and contributions of each are discussed. This historical overview is valuable, because it provides the background necessary to understanding the practical and theoretical basis for contemporary language design. It also motivates further study of language design and evaluation. Because none of th e remainder of the book depends on Chapter 2, it can be read on its own, independent of the other chapters. Chapter 3 describes the primary formal method for describing the syntax of programming la nguage —BNF. This is followed by a description of attribute grammars, which describe both the syntax and static semantics of languages. The difficult task of semantic description is then explored, including brief introductions to the three most common methods: operational, denotational, and axiomatic semantics. Chapter 4 introduces lexical and syntax analysis. This chapter is targeted to 4 those Computer Science departments that no longer require a compiler design course in their curricula. Similar to Chapter 2, this chapter stands alone and can be studied independent ly of the rest of the book, e xcept for Chapter 3, on which it depends. Chapters 5 through 14 describe in detail the design issues for the primary constructs of programming languages. In each case, the design choices for several example languages are presen ted and evaluated. Sp ecifically, Chapter 5 covers the many characteristics of variables, Cha pter 6 covers data types, and Chapter 7 explains expressions and assignment statements. Chapter 8 describes control statements, and Chapters 9 and 10 discuss subpro grams and their implementation. Chapter 11 examines data abstraction facilities. Chapter 12 provides an in -depth discussion of language features that support object -oriented programming (inhe ritance and dynamic method binding), Chapter 13 discusses concurr ent program units, and Chapter 14 is about exception ha ndling, along with a brief discussion of event handling. Chapters 15 and 16 describe two of the most important alternative programming paradigms: functional programming and logic programming. However, some of the data structures and control constructs of fun ctional programming languages are discussed in Chapters 6 and 8. Chapter 15 presents an introduction to Scheme, including descriptions of some of its primitive functions, special forms, and functiona l forms, as well as some examples of simple functions written in Scheme. Brief introductions to ML, Haskell, and F# are given to illustrate some different directions in functional language design. Chapter 16 introduces logic programming and the logic progr amming la nguage, Prolog. To the Instructor In the junior -level programming language course at the University of Colorado at Colorado Springs, the book is used as follows: We typically cover Chapters 1 and 3 in detail, and though students find it interesting and beneficial reading, Chapter 2 recei ves little lecture time due to its lack of hard technical content. Because no material in subsequent chapters depends on Chapter 2, as noted earlier, it can be skipped entirely, and b ecause we require a course in compiler design, Chapter 4 is not covered. Chapters 5 through 9 should be relatively easy for students with extensive programming exp erience in C ++, Java, or C#. Chapters 10 through 14 are more