
- •New to the Tenth Edition
- •Preface
- •Acknowledgments
- •About the Author
- •Contents
- •1.1 Reasons for Studying Concepts of Programming Languages
- •1.2 Programming Domains
- •1.3 Language Evaluation Criteria
- •1.4 Influences on Language Design
- •1.5 Language Categories
- •1.6 Language Design Trade-Offs
- •1.7 Implementation Methods
- •1.8 Programming Environments
- •Summary
- •Problem Set
- •2.1 Zuse’s Plankalkül
- •2.2 Pseudocodes
- •2.3 The IBM 704 and Fortran
- •2.4 Functional Programming: LISP
- •2.5 The First Step Toward Sophistication: ALGOL 60
- •2.6 Computerizing Business Records: COBOL
- •2.7 The Beginnings of Timesharing: BASIC
- •2.8 Everything for Everybody: PL/I
- •2.9 Two Early Dynamic Languages: APL and SNOBOL
- •2.10 The Beginnings of Data Abstraction: SIMULA 67
- •2.11 Orthogonal Design: ALGOL 68
- •2.12 Some Early Descendants of the ALGOLs
- •2.13 Programming Based on Logic: Prolog
- •2.14 History’s Largest Design Effort: Ada
- •2.15 Object-Oriented Programming: Smalltalk
- •2.16 Combining Imperative and Object-Oriented Features: C++
- •2.17 An Imperative-Based Object-Oriented Language: Java
- •2.18 Scripting Languages
- •2.19 The Flagship .NET Language: C#
- •2.20 Markup/Programming Hybrid Languages
- •Review Questions
- •Problem Set
- •Programming Exercises
- •3.1 Introduction
- •3.2 The General Problem of Describing Syntax
- •3.3 Formal Methods of Describing Syntax
- •3.4 Attribute Grammars
- •3.5 Describing the Meanings of Programs: Dynamic Semantics
- •Bibliographic Notes
- •Problem Set
- •4.1 Introduction
- •4.2 Lexical Analysis
- •4.3 The Parsing Problem
- •4.4 Recursive-Descent Parsing
- •4.5 Bottom-Up Parsing
- •Summary
- •Review Questions
- •Programming Exercises
- •5.1 Introduction
- •5.2 Names
- •5.3 Variables
- •5.4 The Concept of Binding
- •5.5 Scope
- •5.6 Scope and Lifetime
- •5.7 Referencing Environments
- •5.8 Named Constants
- •Review Questions
- •6.1 Introduction
- •6.2 Primitive Data Types
- •6.3 Character String Types
- •6.4 User-Defined Ordinal Types
- •6.5 Array Types
- •6.6 Associative Arrays
- •6.7 Record Types
- •6.8 Tuple Types
- •6.9 List Types
- •6.10 Union Types
- •6.11 Pointer and Reference Types
- •6.12 Type Checking
- •6.13 Strong Typing
- •6.14 Type Equivalence
- •6.15 Theory and Data Types
- •Bibliographic Notes
- •Programming Exercises
- •7.1 Introduction
- •7.2 Arithmetic Expressions
- •7.3 Overloaded Operators
- •7.4 Type Conversions
- •7.5 Relational and Boolean Expressions
- •7.6 Short-Circuit Evaluation
- •7.7 Assignment Statements
- •7.8 Mixed-Mode Assignment
- •Summary
- •Problem Set
- •Programming Exercises
- •8.1 Introduction
- •8.2 Selection Statements
- •8.3 Iterative Statements
- •8.4 Unconditional Branching
- •8.5 Guarded Commands
- •8.6 Conclusions
- •Programming Exercises
- •9.1 Introduction
- •9.2 Fundamentals of Subprograms
- •9.3 Design Issues for Subprograms
- •9.4 Local Referencing Environments
- •9.5 Parameter-Passing Methods
- •9.6 Parameters That Are Subprograms
- •9.7 Calling Subprograms Indirectly
- •9.8 Overloaded Subprograms
- •9.9 Generic Subprograms
- •9.10 Design Issues for Functions
- •9.11 User-Defined Overloaded Operators
- •9.12 Closures
- •9.13 Coroutines
- •Summary
- •Programming Exercises
- •10.1 The General Semantics of Calls and Returns
- •10.2 Implementing “Simple” Subprograms
- •10.3 Implementing Subprograms with Stack-Dynamic Local Variables
- •10.4 Nested Subprograms
- •10.5 Blocks
- •10.6 Implementing Dynamic Scoping
- •Problem Set
- •Programming Exercises
- •11.1 The Concept of Abstraction
- •11.2 Introduction to Data Abstraction
- •11.3 Design Issues for Abstract Data Types
- •11.4 Language Examples
- •11.5 Parameterized Abstract Data Types
- •11.6 Encapsulation Constructs
- •11.7 Naming Encapsulations
- •Summary
- •Review Questions
- •Programming Exercises
- •12.1 Introduction
- •12.2 Object-Oriented Programming
- •12.3 Design Issues for Object-Oriented Languages
- •12.4 Support for Object-Oriented Programming in Smalltalk
- •12.5 Support for Object-Oriented Programming in C++
- •12.6 Support for Object-Oriented Programming in Objective-C
- •12.7 Support for Object-Oriented Programming in Java
- •12.8 Support for Object-Oriented Programming in C#
- •12.9 Support for Object-Oriented Programming in Ada 95
- •12.10 Support for Object-Oriented Programming in Ruby
- •12.11 Implementation of Object-Oriented Constructs
- •Summary
- •Programming Exercises
- •13.1 Introduction
- •13.2 Introduction to Subprogram-Level Concurrency
- •13.3 Semaphores
- •13.4 Monitors
- •13.5 Message Passing
- •13.6 Ada Support for Concurrency
- •13.7 Java Threads
- •13.8 C# Threads
- •13.9 Concurrency in Functional Languages
- •13.10 Statement-Level Concurrency
- •Summary
- •Review Questions
- •Problem Set
- •14.1 Introduction to Exception Handling
- •14.2 Exception Handling in Ada
- •14.3 Exception Handling in C++
- •14.4 Exception Handling in Java
- •14.5 Introduction to Event Handling
- •14.6 Event Handling with Java
- •14.7 Event Handling in C#
- •Review Questions
- •Problem Set
- •15.1 Introduction
- •15.2 Mathematical Functions
- •15.3 Fundamentals of Functional Programming Languages
- •15.4 The First Functional Programming Language: LISP
- •15.5 An Introduction to Scheme
- •15.6 Common LISP
- •15.8 Haskell
- •15.10 Support for Functional Programming in Primarily Imperative Languages
- •15.11 A Comparison of Functional and Imperative Languages
- •Review Questions
- •Problem Set
- •16.1 Introduction
- •16.2 A Brief Introduction to Predicate Calculus
- •16.3 Predicate Calculus and Proving Theorems
- •16.4 An Overview of Logic Programming
- •16.5 The Origins of Prolog
- •16.6 The Basic Elements of Prolog
- •16.7 Deficiencies of Prolog
- •16.8 Applications of Logic Programming
- •Review Questions
- •Programming Exercises
- •Bibliography
- •Index

Index
A
Absolute addressing manual, 207 pointers and, 297
problems with, 40, 42 Abstract cells, 209
Abstract classes
in Ada, 561–562 in C++, 547
introduction to, 529 in Java, 555
Abstract data types
design issues for, 478–479 floating-point as, 476 introduction to, 474
in Ada, 482–485, 503–504 in C++, 485–490,
505–506 in C#, 497–499
in C# 2005, 509
in Java, 496–497, 506–509 in Java 5.0, 506–509
in Objective-C, 490–496 parameterized, 503–509 problem set on, 520–521 in Ruby, 499–503
for stacks, 478
summary of, 517–518 user-defined, 476–478
Abstract methods, 529
Abstraction
beginnings of, 72–73 in BNF, 118
in imperative programming languages, 204
support for, 14, 21
Accept clause body, 595 Accept clauses, 595–600
Access
deep vs. shallow, 462–466 to heaps, 289
in nested subprograms, 454–460
nonblocking synchronized, 612 in subprogram linkage, 442 types, 293
ACM (Association for Computing Machinery)
GAMM and, 53, 117
Grace Murray Hopper Award of, 480, 536
Turing Award of, 672
Activation record instances, 444–445
773

774 Index
Activation records, 444–445
Active subprograms characteristics of, 389
in referencing environments, 231
stack-dynamic local variables and, 448
Actor tasks, 596 Actual parameters, 392
Ad hoc binding, 418–419 Ad hoc polymorphism, 422 Ada
95 version of. see Ada 95
2005 version of, 84–85 abstract data types in,
482–485, 503–504 competition synchronization in,
599–601
compiler implementation in, 25
concurrency in, 21, 594–603 continuation in, 638–639 cooperation synchronization
in, 599 costs of, 17
design process for, 81–82 encapsulation constructs in,
482
evaluation of, 83–84 exception handling in, 16,
636–643
historical background of, 81 information hiding in,
482–483
language overview of, 82–83 packages in, 512, 516 pointer types in, 293
priorities of tasks in, 601–602 protected objects in, 602–603 task termination in, 601
Ada 95
child packages in, 562 dynamic binding in, 561–562 inheritance in, 559–560 introduction to, 84–85
object-oriented programming in, 21, 558–563
Addresses
fields for, 687
of simple subprograms, 443–445
of stack-dynamic local variables, 445–449
of variables, 208 Adopting protocols, 551
Aggregate values, 265 Aho, Al, 95
AI (artificial intelligence) introduction to, 6 LISP in, 47–48, 50 Project at MIT, 680
ALGOL 58
design process for, 53–54 overview of, 54
report on, 55 ALGOL 60
ALGOL 58 vs., 53–55 BNF in, 117–118
design process for, 55–56 evaluation of, 56–58 historical background of, 53 introduction to, 4–5, 52 overview of, 56
ALGOL 68
design process for, 73 evaluation of, 74–75 language overview of, 74 orthogonality in, 11, 73
ALGOL Bulletin, 55
Aliases, 208
Aliasing, 16
Allocation, 214, 532–533
Ambiguous grammars, 122–123 AND operators, 333–336
and then operators, 15, 336
Anonymous variables, 290 ANSI (American National Standards Institute)
on Ada, 82 on C, 78
Minimal BASIC standard of, 64
Antecedents, 149, 731–732 APES system, 758
APL (A Programming Language) as dynamic language,
generally, 71 introduction to, 14–15 origins and characteristics of,
71–72 trade-offs in, 23
append operations, 747–750 Apple, 90
Apply-to-all functional forms, 676, 697–698
APT (Automatically Programmed Tools), 22
Arithmetic expressions associativity in, 321–323 coercion in, 330–331 conditional, 325
errors in, 332
explicit type conversions and, 331–332
introduction to, 319 in LISP, 324
operand evaluation order in, 319–325
operand evaluation order in, 325–328
operator overloading and, 328–329
parentheses in, 323–324 precedence in, 319–321 in Prolog, 743–746
referential transparency in, 327–328
in Ruby, 324
side effects in, 325–328
type conversions and, 329–332
Array types
array initialization in, 264–265 array operations in, 266–267 categories in, 262–264
design issues for, 260

evaluation of, 269 formal parameters, 394
implementation of, 269–272 indices and, 260–262 introduction to, 259–260 jagged arrays in, 267–268 rectangular arrays in,
267–268 slices in, 268–269
subscript bindings in, 262–264
Artificial intelligence (AI). see AI (artificial intelligence)
ASCII (American Standard Code for Information Interchange), 249
Assemblies, .NET, 512
Assertions
in axiomatic semantics, 148–149
in Java, 653–654 Assignment statements
in axiomatic semantics, 150–152
compound assignment operators in, 337
conditional targets and, 337 in denotational semantics, 146 as expressions, 339–340
in functional programming languages, 340–341
introduction to, 318 mixed-mode, 341 multiple, 340
problem set on, 343–345 programming exercises on,
345–346
review questions on, 342–343 simple, 336–337
summary of, 341–342
syntax of, 118, 121–122, 127 unary assignment data types
in, 338–339 Association for Computing
Machinery (ACM), 53
Associative arrays implementation of, 276 introduction to, 272 structure and operations of,
272–276
Associativity, 126–128, 321–323
Atomic propositions, 729
Atoms, Prolog, 737
Attribute computation functions, 133
Attribute grammars
basic concepts of, 133–134 computing attribute values in,
137–138 defined, 134
evaluation of, 138–139 examples of, 135–136
intrinsic attributes in, 134–135 introduction to, 132–133 static semantics and, 133
Attributes
binding, 209–210 defined, 133 instance data as, 501 intrinsic, 134–135
Automatic generalization, 427 Automatic programming, 41 Automatically Programmed Tools
(APT), 22
awk scripting language, 95
Axiomatic semantics assertions in, 148–149 assignment statements in,
150–152 evaluation of, 160–161 introduction to, 148 logical pretest loops in,
154–158
program proofs in, 158–160 selection in, 153–154 sequences in, 152–153 weakest preconditions in,
149–150
Axioms, 149
Index |
775 |
B
B, language, 77
Babbage, Charles, 82, 388
Backtracking, 742 Backus, John
Fortran by, 20, 41–43
on functional vs. imperative languages, 672–673
on syntax, 117
Backus-Naur Form (BNF). see
BNF (Backus-Naur Form) Backward chaining, 741–742 base prefix, 557
BASIC
design process for, 63–64 evaluation of, 64–65 introduction to, 18 timesharing in, generally, 63
BASIC-PLUS, 64 Bauer, Fritz, 53
BCD (binary coded decimal), 248 Bell Laboratories. see AT&T Bell
Laboratories
BINAC computer, 40
binary coded decimal (BCD), 248
Binary operators, 319
Binary semaphors, 589
Binding
ad hoc, 418–419 attributes to variables,
209–210 deep, 418–419
dynamic. see Dynamic binding dynamic type, 212–214 exceptions to handlers, Ada,
637–638
exceptions to handlers, C++, 644
exceptions to handlers, Java, 648–649
explicit heap-dynamic variables in, 216–218
implicit heap-dynamic variables in, 218
introduction to, 204

776 Index
Binding (continued) lifetime of, 214–215 overview of, 209–210 shallow, 418–419
stack-dynamic variables in, 215–216
static type, 211–212 static variables in, 215 storage, 214–215 subscript, 262–264 type, 210–214
Binding time, 209 BLISS, 6
Blocked tasks, 584
Blocks
in Ruby, 374
for scope, 220–223
in subprograms, implementing, 460–462
Block-structured language, 56, 220
BNF (Backus-Naur Form) analyzing syntax in, 169 describing lists in, 119 expressions in, 145 Extended, 129–132 fundamentals of, 118–119 if-then-else statements
in, 128–129 introduction to, 55–57 static semantics in, 133 syntax and, 117–118
Body packages, 482–484 Böhm, Corrado, 350, 379
Boolean abstract data types, 497–498
Boolean data types, 249
Boolean expressions, 332–335, 340 boolean type variables, 92, 255,
612
Borland JBuilder, 31
Bottom-up parsers introduction to, 180
LR parsers and, 193–197 problem for, 190–192
shift-reduce algorithms for, |
assemblies in, 512–513 |
192–193 |
concurrency in, 21 |
Bottom-up resolution, 741 |
design process for, 101–102 |
Bound variables, 682–683 |
dynamic binding in, 557–558 |
Bounded wildcard types, 426 |
encapsulation constructs in, |
Bounds, 425–426 |
498 |
Boxing, 552 |
evaluation of, 103–104 |
Breadth-first searches, 742 |
event handling in, 661–664 |
break statements |
information hiding in, 498–499 |
guarded commands and, 379 |
inheritance in, 557 |
multiple-selection statements |
language overview of, 102–103 |
and, 355–358 |
nested classes in, 558 |
in user-located loop control |
as .NET language, 101 |
mechanisms, 370–371 |
object-oriented programming |
Brinch Hansen, Per, 590–591, |
in, 556–558 |
593–594 |
overview of, 101–104 |
Business applications, 5–6 |
threads in, 613–618 |
Business record computerization. |
C++ |
see COBOL |
abstract data types in, |
Byron, Augusta Ada, 82 |
485–490, 505–506 |
Byte code, 30 |
abstraction support in, 14 |
byte operands, 320, 331 |
compiler implementation |
C |
in, 25 |
constructors in, 487 |
|
C |
continuation in, 644–645 |
abstraction support in, 14 |
design process for, 88–89 |
compiler implementation in, 25 |
destructors in, 487 |
encapsulation constructs in, |
dynamic binding in, 544–547 |
510–511 |
encapsulation constructs in, |
evaluation of, 78–79 |
486, 511–512 |
expressivity in, 15 |
evaluation of, 89 |
historical background of, 77–78 |
exception handling in, 16, |
language categories in, 22 |
643–647 |
orthogonality in, 11 |
imperative features in, |
pointer types in, 294–295 |
generally, 88 |
popularity of, 3 |
information hiding in, 486 |
portable system of, generally, 77 |
inheritance in, 539–544 |
preprocessors in, 30 |
language overview of, 89 |
systems software in, 6–7 |
namespaces in, 514–515 |
type checking in, 15 |
object-oriented programming |
writability of, 13 |
in, 88, 538–539, |
C# |
547–549 |
2005 version of, 509 |
orthogonality in, 11–12 |
abstract data types in, |
pointer types in, 294–295 |
497–499, 509 |
popularity of, 3 |

systems software in, 6 trade-offs in, 23
Call chains, 450 Calls
dynamic binding of method, 566–568
indirect, 419–421
semantics of subprogram,442
Cambridge Polish, 679
Cambridge University, 77 Camel notation, 205 Caml, 52
canonical LR algorithm, 193 CAR functions, 687–688,
691–694
Case expressions, 357–359
Case sensitivity, 206
case statements, 75, 359–361 catch, 643, 648–649 Category interfaces, 550
C-based languages, 204–206 CBL (Common Business
Language), 59
CDE (Solaris Common Desktop Environment), 31
CDR functions, 687–688, 691–694
Celes, Waldemar, 100
central processing units (CPUs), 18–19
CGI (Common Gateway Interface), 97, 99
chain_offset, 455 Chambers, Craig, 548 char arrays, 250–251, 265 char ordinal types, 255
Character string types design issues for, 250 evaluation of, 253
implementation of, 253–255 string length options in,
252–253
string operations in, 250–252 type checking in, 302–303
Checked exceptions, 650
|
Index |
777 |
Child library packages, 562 |
Coercions |
|
Child packages, 562 |
in arithmetic expressions, |
|
Chomsky, Noam, 117 |
330–331 |
|
Church, Alonzo, 675 |
for deproceduring, 74 |
|
Cii Honeywell/Bull language, 82 |
in type checking, 302 |
|
Clark, K. L., 737 |
Colmerauer, Alain, 79, 736 |
|
Clarke, L. A., 227 |
Column major order, 270 |
|
class instance records (CIRs), |
Common Business Language |
|
566–568 |
(CBL), 59 |
|
Class methods, 527 |
Common Gateway Interface (CGI), |
|
Class variables, 527 |
97, 99 |
|
Classes |
Common Intermediate Language |
|
abstract, 529, 547 |
(CIL), 512 |
|
derived, 526, 540–544 |
Common LISP, 51–52, 699–701 |
|
of exceptions, 647 |
Common LISP Object System |
|
inner, 555–556 |
(CLOS), 21, 701 |
|
interface abstract, 553–555 |
Communicating Sequential |
|
interlocked, 616 |
Processes (CSP), 597 |
|
local nested, 556 |
Communications of the ACM, 55, |
|
nested, 533, 555–556, 558 |
672 |
|
parent, 526–527 |
Compatible types, 302, 530 |
|
sub, 526 |
Competition synchronization |
|
super, 526 |
in Ada, 599–601 |
|
wrapper, 530 |
in concurrency, generally, |
|
Clausal form, 350–351, 731–732 |
589–590 |
|
Clients, 477 |
introduction to, 581–585 |
|
Clocksin, W. F., 753 |
in Java, 607–608 |
|
CLOS (Common LISP Object |
with monitors, 591 |
|
System), 21, 701 |
with semaphores, 589–590 |
|
Closed accept clauses, 599 |
Compiler design, 4 |
|
Closed-world assumption, 754 |
Compiler implementation, 24–28 |
|
Closures, 430–432 |
Completed tasks, 601 |
|
CML (Concurrent ML), 619 |
Complex data types, 248 |
|
COBOL |
Compound assignment operators, |
|
compiler implementation in, |
337 |
|
25 |
Compound terms, 729 |
|
computerizing business records |
Computer architecture, 18–20 |
|
in, 58 |
Concurrency |
|
design process for, 59–60 |
in Ada, 594–603 |
|
evaluation of, 60–63 |
C# threads in, 613–618 |
|
FLO-MATIC and, 59 |
categories of, 579–580 |
|
historical background of, 59 |
competition synchronization |
|
introduction to, 5–6 |
in, 589–591, 598–601, |
|
Code-building functions, SCHEME, |
607–608 |
|
698–699 |
in Concurrent ML, 619 |
|

778 Index
Concurrency (continued) cooperation synchronization in,
586–589, 591–592 cooperation synchronization in,
Ada, 599
cooperation synchronization in, Java, 608–611
design issues for, 585–586 explicit locks in, Java 5.0,
612–613 in F#, 620–621
in functional languages, 618–621
in High-Performance Fortran, 621–623
introduction to, 21, 576–581 in Java threads. see Threads language design for, 585 message passing in, 593–594 monitors in, 591–593
in Multilisp, 618 multiprocessor architectures
in, 577–579 nonblocking synchronization
in, 612
protected objects in, 602–603 reasons for using, 580–581 semaphores in, 586–590, 607 statement-level, 621–623 subprogram-level, 581–586 synchronizing threads in,
616–617
synchronous message passing in, 593–594
task priorities in, 601–602 task termination in, 601 thread priorities in, 606–607
Concurrent Pascal, 591 Concurrent ML (CML), 619 Conditional expressions, 325, 708 Conditional targets, 337
Conjunctions, 738
CONS function, 688–694 Consequents, 149, 731–732 const constants, 233
Constrained variant variables, 285–287
Constraint_Error
exceptions, 639–642
Constructors, 487
Context-free grammars, 117–118 Continuation, 634–635
Control expressions, 350 Control flow, 685–686
Control statements, 348 Control structures, 349 Cooper, Alan, 66 Cooper, Jack, 82
Cooperation synchronization in Ada, 599
in concurrency, 586–589 introduction to, 581–585 in Java, 608–611
with monitors, 591–592 with semaphores, 586–589
Coroutines, 73, 432–435 Costs of languages, 16–18 Counter-controlled loops, 363,
367–368 in Ada, 364
in C-based languages, 364–366
in functional languages, 367–368
in Python, 366–367 Cox, Brad, 90
CPUs (central processing units), 18–19
CSP (Communicating Sequential Processes), 597
Currie, Malcolm, 81
Currying, 706
Cut Prolog, 752–753
D
Dahl, Ole-Johan, 72–73
Dangling pointers, 292–293 Dangling references, 294
Data abstraction. see Abstraction Data members, 486, 539
Data structures, 371–375
Data types
array. see Array types associative array, 272–276 boolean, 249
character, 249–250 character string, 250–255 complex, 248
decimal, 248–249 equivalence in, 304–308 floating point, 247–248 integer, 246–247 introduction to, 12, 244–246 in LISP, 677–678
list, 281–284 numeric, 246–249 ordinal, 255–258
pointer, 289–295, 297–302 primitive, 246–250 problem set on, 314–315 programming exercises on,
315–316 record, 276–280
reference, 290, 295–302 review questions on, 312–313 string length options in,
252–253 string operations in,
250–252
strong typing, 303–304 summary of, 310–311 theory and, 308–310 tuple, 280–281
union, 284–289 Dead tasks, 584
Deadlocks, 585 Deallocation, 214, 532–533 Decimal data types, 248–249 Declaration order, 223–224
Declarative languages, 728, 734–735
declare blocks, Ada, 263
Decorating parse trees, 137 Decrement fields, 687
Deep access, 462–464

Deep binding, 418–419 Deferred reference counting,
299–300
Definitions
in COBOL, 60
of functions, 682–684
in subprograms, 389–391
Delegates, 420–421 delete
in associative arrays, 273 in C++, 291–293, 486 data types, 263
explicit deallocation using, 538 Delphi, 90
Denotational semantics assignment statements in, 146 evaluation of, 147
examples of, 143–145 expressions in, 145–146 introduction to, 142–143 logical pretest loops in, 147 state of programs and, 145
Department of Defense (DoD), 59–61, 81
Dependents, 601 Depth-first searches, 742
Dereferencing pointers, 291 Derivations, 119–121
Derived classes, 526, 540–544 Derived types, 306 Descriptors, 245
Design issues
for abstract data types, 478–479
for array types, 260
for character string types, 250 for concurrency, 585–586
for exception handling, 633–636 for functions, 428–429
for iterative statements, 363 for multiple-selection
statements, 354–355 for names, 205
for object-oriented programming, 529–534
for pointer types, 290
for subprograms, 396–397, 413–414
trade-offs, 23
for two-way selection statements, 350
for union types, 285
Destructors, 487 Diamond inheritance, 531
Dictionaries, 99, 273 Dijkstra, Edsger
guarded commands by, 376–379, 593
on PL/I, 70 semaphores by, 586
on synchronization operations, 591
Direct left recursion, 187 Discriminated unions, 285–287 Disjoint tasks, 581
dispose, 298
DLLs (dynamic link libraries), 67, 512
DO CONCURRENT constructs, 45 do-while statements,
369–370
DoD (Department of Defense), 59–61, 81
Dot notation, 278–279
Double floating-point data types, 247
Dynabook, 86
Dynamic binding
in Ada 95, 561–562 in C#, 557–558
in C++, 544–547 introduction to, 210 in Java, 555
of method calls to methods, 566–568
in Objective-C, 551–552
in object-oriented programming, 527–529, 533
in Ruby, 565
in Smalltalk, 535
Index |
779 |
Dynamic chains, 450
Dynamic dispatch. see Dynamic binding
Dynamic languages, 68–71
Dynamic length strings, 253–255
dynamic link libraries (DLLs), 67, 512
Dynamic links, 446 Dynamic scoping, 227–229,
462–466
Dynamic semantics
axiomatic semantics as. see
Axiomatic semantics denotational semantics as,
142–147 introduction to, 139 operational semantics as,
139–142
Dynamic type binding, 212–214, 303, 569
Dynamic type checking, 303
E
Eager approach, 299
EBNF (Extended BNF), 129–132, 181–182
ECMA (European Computer Manufacturers Association), 97
Edinburgh syntax, 737 Edwards, Daniel J., 680 Eich, Brendan, 97
Elaboration, 215
Elemental operators, Fortran 95+, 266
Elliptical references, 279 else-if clause, 360–361 Encapsulation constructs
in Ada, 482, 512, 516 in C, 510–511
in C#, 498, 512–513 in C++, 486, 511–512,
514–515

780 Index
Encapsulation (continued) introduction to, 474,
509–510
in Java, 515–516 naming, 513–517
in Objective-C, 490–492
in Ruby, 499, 516–517 summary of, 517–518
entry clauses, 595
Enumeration constants, 255
Enumeration types in C, 308
in C#, 102
in C++, 256, 258 designing, 255–257 evaluation of, 257–258 introduction to, 255
Environment pointers (EPs), 442–448
Epilogue of subprogram linkage, 443–448
EPs (Environment pointers), 442–448
EQ? functions, 689–690, 693
Equivalence, 304–308 Erasure rule, 187
Errors
in arithmetic expressions, 332 in assignment statements,
146–147
in recursive-descent parsers, 183–184
European Computer Manufacturers Association (ECMA), 97
EVAL, 690, 698–699
Evaluation environments, 702
Event handling
bibliographic notes on, 665 in C#, 661–664
introduction to, 630, 655–656 in Java, 656–660
summary of, 664–665
Event listeners, 657
Events, 619, 655
Exception handling in Ada, 636–643
basic concepts of, 631–633 bibliographic notes on, 665 in C++, 643–647
design issues for, 633–636 introduction to, 16, 630–631 in Java, 647–655
summary of, 664–665
Exceptions, 332, 631 Exclusivity of objects, 529–530
Executable images, 27 expected_type, 136 Expert systems, 757–758
Explicit declarations, 211 Explicit heap-dynamic variables,
216–218
Explicit locks, Java 5.0, 612–613, 617
Explicit type conversions, 331–332
Expressions
arithmetic. see Arithmetic expressions
assignment statements as, 339–340
Boolean, 333–335
in denotational semantics, 145–146
introduction to, 318 mixed-mode, 330–331
in recursive-descent parsers, 182–185
relational, 332–333 short-circuit evaluation of,
335–336 summary of, 341–342
unambiguous grammar for, 125
Expressivity, 14–15
Extended accept clauses, 598 Extended ALGOL, 6
Extended BNF (EBNF), 129–132, 181–182
eXtensible Stylesheet Language Transformations (XSLT), 22
extern qualifiers, 224
F
F#, 620–621, 712–715 Fact statements, 737–738 Farber, J. D., 72
Fatbars, 377
Feature multiplicity, 9 Fetch-execute cycles, 19
FGCS (Fifth Generation Computing Systems), 736
Fields, 277
Fifth Generation Computing Systems (FGCS), 736
de Figueiredo, Luis Henrique, 100
filter, 705
final, Java, 233, 553–556 Finalization, 635 finalize methods, 553
finally clauses, 612, 652–653
Finite automata, 171 Finite mappings, 260 Firm coercion, 74
First-order predicate calculus, 729
Fixed heap-dynamic arrays, 262 Fixed stack-dynamic arrays, 262 flex arrays, 74
float
in C, 510
in C#, 498 introduction to, 15
in type checking, 302–303 in type conversions, 329–332
Floating-point data types, 247–248, 476
Floating-point operations, 42, 68 FLOW-MATIC, 59
FLPL (Fortran List Processing Language), 48
Flynn, Michael J., 578

for statements in Ada, 364 in C, 77–78
in C-based languages, 364–366
declaration order and, 224 defined, 12
in Plankalkül, 38
in Python, 366–367
in user-located loop control mechanisms, 372–373
foreach statements
in array processing, 264 in C#, 102
in JSP, 106
in .NET languages, 373–374 Form, 13, 205–206
Formal parameters, 391, 394 Fortran
abstraction support in, 14 Backus designing, 20 design process for, 43 evaluation of, 45–47 evolution of, generally, 42
historical background of, 42–43 introduction to, 4–5
name forms in, 205–207 versions of, 14, 43–45,
204–207
Fortran List Processing Language (FLPL), 48
Forward chaining, 741
FP (functional programming), 673 Free Software Organization, 737
Free unions, 285
Fully attributed parse trees, 134 Fully qualified references, 279
Functional compositions introduction to, 675 operators for, 714 in Scheme, 697
Functional forms, 675–676, 696–698
Functional programming (FP), 673
Functional programming languages assignment statements in,
340–341 bibliographic notes on, 721
Common LISP as, 699–701 concurrency in, 618–621 F# as, 712–715
functional forms in, 675–676
fundamentals of, 676–677 Haskell as, 707–712 imperative languages
supporting, 715–717 imperative languages vs.,
717–719 introduction to, 672–673 LISP as, 677–680
mathematical functions in, 673–676
ML as, 701–707 Scheme as. see Scheme
simple functions in, 674–675 summary of, 720–721
Functions
design issues for, 428–429 in Scheme, 691–694
side effects of, 428–429 as subprograms, 395–396
Functors, 729
future constructs, 618
G
GAMM (German Society for Applied Mathematics and Mechanics), 53
Garbage collection, 299–302 Gates, Bill, 66
Genealogy of languages, 37 General Purpose Simulation
System (GPSS), 22
Generality, 18 Generate and test, 753 Generation, 116–117 Generators, 709
Index |
781 |
Generic subprograms in C# 2005, 427 in C++, 423–425 in F#, 427–428
introduction to, 397, 422–423
in Java 5.0, 425–426 German Society for Applied
Mathematics and Mechanics (GAMM), 53
getPriority methods, 606 Getter methods, 564
Glennie, Alick E., 42–43 Global scope, 224–227 GNOME, 31
Go, 91
Goals, 739–740 Google, 91 Gosling, James, 92 goto, 195–197
GPSS (General Purpose Simulation System), 22
Grammars
ambiguous, 122–123 attribute. see Attribute
grammars context-free, 117–118 derivations and, 119–121 LL grammar class,
187–190 recognizers and, 132 unambiguous, 125–129 van Wijngaarden, 74
Graphical user interfaces (GUIs). see GUIs (graphical user interfaces)
Griesemer, Robert, 91 Griswold, R.E., 72
Guarded commands, 376–379, 593 Guards, 586
GUIs (graphical user interfaces) defined, 655
in Delphi, 90 UNIX and, 31

782 Index
H
Hammond, P., 758
Handles, 191–192 Harbison, Samuel P., 356 Hashes, 272–273, 276
introduction to, 96 Haskell, 707–712
Headed horn clauses, 734 Header files, 510–511 Headless horn clauses, 734 Heap-dynamic arrays, 263 Heap-dynamic variables, 290 Heaps, 289
Heavyweight tasks, 581 Hejlsberg, Anders, 90, 101
Hidden concurrency, 579 Higher-order functions, 675 High-Order Language Working
Group (HOLWG), 81 High-Performance Fortran (HPF),
621–623 Hoare, C.A.R. on Ada, 83
on language design, 14, 23 message passing by, 593–594 on monitors, 591
Pascal by, 75
HOLWG (High-Order Language
Working Group), 81 Hopper, Grace
award in name of, 480, 536 compiling systems by, 41
on programming languages, 59
Horn clauses, 734
HPF (High-Performance Fortran), 621–623
HTML (HyperText Markup Language)
introduction to, 7, 22 JavaScript and, 97–98 JSP and, 105
PHP and, 99 XML and, 104 Hursley Laboratory, 69
Hybrid implementation systems, 29–30
HyperText Markup Language (HTML). see HTML (HyperText Markup Language)
Hypotheses, 734
I
IAL (International Algorithmic Language), 54
IBM
APL developed by, 71 Fortran developed by, 42–47 orthogonality and, 10
PL/I developed by, 68, 73–74 PL/S developed by, 6 UNIVAC ”compiling” system
and, 41
“The IBM Mathematical FORmula TRANslating System: FORTRAN,” 43
id type, 551–552
Identifiers, 115, 204
Identity operators, 320
IEEE Floating-Point Standard, 247–248
Ierusalimschy, Roberto, 100, 274–275
If logical constructs, 45
IF selector functions, 685–686 if statements
assignments and, 340
in compound statements, 351
in Extended BNF, 130 in JSP, 105–106
in multiple-selection statements, 360–362
in nesting selectors, 351–354 in recursive-descent parsers,
181–186 rules for, 119
in selector expressions, 354
IFIP (International Federation of
Information Processing), 75
if-then-else statements,
128–129, 325 Imperative programming
languages functional languages
supporting, 715–717 functional languages vs.,
717–719 introduction to, 18
object-oriented hybrid languages and. see C++
Implementation methods compiler implementation,
24–28
hybrid implementation systems, 29–30
preprocessors in, 30 for protocols, 551 pure interpretation, 28 for subprograms. see
Subprograms, implementing understanding of, 4
Implicit declarations, 211 Implicit heap-dynamic arrays, 74
Implicit heap-dynamic variables, 218
Implicit locks, 612–613 import declarations, 515–516
In mode parameter passing, 400 in operators, 266
include statements, 565
Incremental mark-sweep garbage collection, 301
Indicants, 74 Indices, 260–262
Inference rules
evaluation of, 160–161 in logical pretest loops,
154–158
in program proofs, 158–160 as rule of consequence, 152

|
|
Index |
783 |
in selection statements, |
integer |
concurrency in, 21 |
|
153–154 |
data types, 246–247 |
design process for, 91–92 |
|
in sequences, 152–153 |
ordinal types, 255 |
dynamic binding in, 555 |
|
weakest preconditions and, |
reserved words, 206–207 |
evaluation of, 93–94 |
|
149–150 |
Interface abstract class, 553–555 |
event handling in, 656–660 |
|
Inferencing process, 740–743 |
Interlocked classes, 616 |
exception handling in, 16, |
|
Infix operators, 319 |
International Algorithmic |
647–655 |
|
Information hiding |
Language (IAL), 54 |
expressivity in, 15 |
|
in Ada, 482–483 |
International Federation of Infor- |
feature multiplicity in, 9 |
|
in C#, 498–499 |
mation Processing (IFIP), 75 |
finally clause in, 652–653 |
|
in C++, 486 |
International Standards |
imperative-based |
|
in Objective-C, 492–493 |
Organization (ISO), 97, 249 |
object-orientation of, 91 |
|
in Ruby, 499 |
Interpreter, 678–681 |
inheritance in, 553–555 |
|
Inheritance |
intrinsic attributes, 134–135 |
introduction to, 12 |
|
in Ada, 559–560 |
Intrinsic condition queues, 608 |
JIT systems in, 30 |
|
in C#, 557 |
Intrinsic limitations, 756 |
nested classes in, 555–556 |
|
in C++, 539–544 |
iPhones, 90 |
object-oriented programming |
|
introduction to, 525–527 |
IPL (Information Processing |
in, 552–556 |
|
in Java, 553–555 |
Language), 47–49 |
overview of, 91–94 |
|
in Objective-C, 549–551 |
is operators, 266 |
packages in, 515–516 |
|
in Ruby, 565 |
ISO (International Standards |
parameterized abstract data |
|
in Smalltalk, 534–535 |
Organization), 97, 249 |
types in, 506–509 |
|
Inherited attributes, 134 |
Iterative statements |
popularity of, 3 |
|
Initial values, 363 |
counter-controlled loops and, |
Swing GUI components in, |
|
Initialization, 234, 533–534 |
363, 367–368 |
656–657 |
|
Inner classes, 555–556 |
data structures for, 371–375 |
threads in. see Threads |
|
Inout mode parameter passing, |
design issues for, 363 |
Java Archives (JARs), 513 |
|
400 |
introduction to, 362–363 |
Java Server Pages Standard Tag |
|
Instance data storage, 566 |
logically controlled loops and, |
Library (JSTL), 22, 105–106 |
|
Instance methods, 527 |
368–370 |
JavaScript |
|
Instance variables, 527 |
for statements, 364–367 |
anonymous functions in, |
|
Instantiation, 733, 737 |
user-located loop controls as, |
715–716 |
|
int |
370–371 |
arrays in, 264 |
|
abstract data types, |
Iverson, Kenneth P., 71 |
dynamic type binding in, |
|
497–498 |
J |
213–214 |
|
in C, 326 |
event handling in, 656 |
|
|
in C++, 295 |
Jacopini, Giuseppe, 350, 379 |
evolution of, 97–98 |
|
in Java, 609–611 |
Jagged arrays, 267–268 |
execution speed in, 718 |
|
in ML, 702–704 |
JARs (Java Archives), 513 |
implicit heap-dynamic |
|
in nonblocking synchronized |
Java |
variables in, 218 |
|
access, 612 |
abstract data types in, |
lambda expressions in, 716 |
|
in type checking, 302–303 |
496–497, 506–509 |
Lua vs., 101 |
|
in type conversions, 329–332 |
assertions in, 653–654 |
nested functions in, 220–221 |
|
unary minus operator and, 320 |
classes of exceptions in, 647 |
nested subprograms in, 454 |

784 |
Index |
|
|
PHP vs., 99 |
for COBOL, 59–60 |
overview of, 169–177 |
|
pure interpretation in, 28 |
computer architecture in, |
parsing in. see Parsing |
|
relational operators in, 333 |
18–20 |
summary of, 197–199 |
|
JIT (Just-in-Time). see Just-in- |
evaluation criteria for, 7–18 |
Lexical scoping, 219 |
|
|
Time ( JIT) compilers |
for Fortran, 43 |
Lifetime, 214–215, 229–230 |
Jobs, Steve, 90 |
influences, 18–21 |
Lightweight tasks, 581 |
|
join methods, 604–606 |
for Java, 91–92 |
Limited dynamic length strings, |
|
JOVIAL, 55 |
for LISP, 48 |
253–255 |
|
JSP, 105–106 |
methodologies for, 20–21 |
Limited private types, 483 |
|
JSTL (Java Server Pages Standard |
for PL/I, 69 |
Linkers, 27, 444 |
|
|
Tag Library), 22, 105–106 |
for Prolog, 79 |
Linking, 27 |
Just-in-Time ( JIT) compilers, 30 |
for SIMULA 67, 72–73 |
Linking and loading, 27 |
|
K |
|
for Smalltalk, 85–86 |
LISP |
|
syntax in, 12–13 |
arithmetic expressions in, 324 |
|
Kay, Alan, 85–86 |
trade-offs, 23 |
artificial intelligence and, 47–48 |
|
Kemeny, John, 63–64 |
Language generators, 116–117 |
Common, 51–52 |
|
Kernighan, Brian, 95, 376 |
Language recognizers, 116 |
data structures in, 49, |
|
Keys, 272 |
Language selection, 3 |
677–678 |
|
Keyword parameters, 392 |
Laning and Zierler system, 43, 53 |
data types in, 677–678 |
|
Keywords, 206 |
last statements, 371 |
descendants of, 51 |
|
Knuth, Donald, 133, 193–194 |
Lazy approach, 299 |
design process for, 48 |
|
Korn, David, 95 |
Lazy evaluation, 710–712 |
evaluation of, 50–51 |
|
Kowalski, Robert |
LCF (Logic for Computable |
functional programming in, |
|
on logic-based semantic |
Functions), 52 |
47–50, 677 |
|
|
networks, 758 |
Learning new languages, 3–4 |
interpreter in, 678–680 |
Prolog by, 79, 736 |
Left factoring, 189–190 |
introduction to, 6 |
|
ksh scripting language, 95 |
Left recursive grammar rules, 128 |
languages related to, 52 |
|
Kurtz, Thomas, 63 |
Left-hand side (LHS) |
list processing and, 47–48 |
|
L |
|
in bottom-up parsers, 180, 191 |
orthogonality in, 11 |
|
in denotational semantics, 144 |
overview of, 49 |
|
Lambda calculus, 675 |
fundamentals of, 118–123 |
Scheme and, 51 |
|
Lambda expressions |
grammar rules for, 128 |
syntax of, 50 |
|
introduction to, 675 |
in LL parsers, 187–190 |
List comprehensions, 283 |
|
in JavaScript, 716 |
in LR parsing, 195 |
List functions, Scheme, 282–283 |
|
in ML, 705 |
Leftmost derivations, 120–121 |
Lists |
|
in Scheme, 682, 695 |
Lerdorf, Rasmus, 98 |
descriptions of, 119 |
|
Language design |
let |
functions of, 686–690 |
|
for Ada, 81–82 |
in declaration order, 221–223 |
processing, 47–48 |
|
for ALGOL 58, 53–54 |
in F#, 712–715 |
simple, 678, 691–692 |
|
for ALGOL 60, 55–56 |
in ML, 281 |
structures of, 49–50, 746–751 |
|
for ALGOL 68, 73 |
Level numbers, 277 |
types of, 281–284 |
|
for BASIC, 63–64 |
Lexemes, 115–116, 170–177 |
Liveness, 585 |
|
for C#, 101–102 |
Lexical analysis |
LL algorithms, 179 |
|
for C++, 88–89 |
introduction to, 25–26, |
LL grammar class, 187–190 |
|
categories in, 21–23 |
168–169 |
Load modules, 27 |

Loaders, 444
Local nested classes, 556 Local referencing environments,
397–399
Local variables, 218, 397–399 local_offset, 450
Locks, 612–613, 616–617
Locks-and-keys approach, 298 Logic for Computable Functions
(LCF), 52
Logic programming languages applications of, 757–758 bibliographic notes on, 759 clausal form in, 731–732 defined, 728
expert systems and, 757–758 introduction to, 22, 728 overview of, 734–736 predicate calculus for,
728–734
problem set on, 760–761 programming exercises on,
761
Prolog. see Prolog propositions in, 729–731 relational database
management systems and, 757
summary of, 758–759 theorem-proving in, 732–734
Logical concurrency, 579 Logical pretest loops, 147,
154–158
Logically controlled loops, 368–370
long primitive type variables, 612
Loop invariants, 154–158 Loop parameters, 363 Loop variables, 363–364
Loops
counter-controlled, 363–368 defined, 362
logical pretest, 147, 154–158 logically controlled, 368–370 user-located, 370–371
Lost heap-dynamic variables, 293 Love, Tim, 90
LR parsers, 190, 193–197 Lua
anonymous functions in, 390 arrays in, 264, 272, 276 enumeration types in, 257 evolution of, 37, 100–101 global variables in, 399 Ierusalimschy on, 274–275 multiple assignments in, 340 nested subprograms in, 454 parameters in, 393–395 records in, 278
relational operators in, 333 selection statements in, 353 tables in, 276
L-value, 208–209
M
MAC OS X, 90
Mark-sweep garbage collection, 299–302
Markup languages, defined, 22 Markup/programming hybrid languages, 104–106
Massachusetts Institute of Technology (MIT). see MIT (Massachusetts Institute of Technology)
match expressions, 288, 362
Matching subgoals, 740 Matching type parameters, 644 Mathematical functions,
673–676 Matsumoto, Yukihiro, 100 Mauchly, John, 40 McCabe, F. G., 737
McCarthy, John, 48, 677–680 McCracken, Daniel, 23
Meek coercion, 74 Mellish, C. S., 753
Member functions, 486, 539 Memory cells, 209
Memory leakage, 293
Index |
785 |
Message interfaces, 526 Message protocols, 526
Messages
binding dynamically. see
Dynamic binding in object-oriented
programming, 525–527 passing, 593–594
MetaLanguage (ML), 52, 701–707
Metalanguages, 118
Metasymbols, 130 Method calls, 566–568
Methods, 526–527, 566–568 Microsoft
C# by, 101 JScript.NET by, 97
.NET computing platform by, 89 Visual BASIC by, 66–67 Visual Studio .NET by, 31
Milner, Robin, 52 MIL-STD 1815, 82
MIMD (Multiple-Instruction Multiple-Data) computers, 578
Minsky, Marvin, 48 Miranda, 52
MIT (Massachusetts Institute of Technology)
AI Project at, 48 LISP at, 677 Scheme at, 51, 681
Mixed-mode assignment statements, 341
Mixed-mode expressions, 330–331
Mixins, 550
ML (MetaLanguage), 52, 701–707
M-notation, 678, 690 Modules, 516–517 Monitors, 591–593 MSDOS.exe, 66–67
Multicast delegates, 421 Multilisp, 618
Multiparadigm programming, 536

786 Index
Multiple assignment statements, 340
Multiple inheritance, 527, 531–532 Multiple-Instruction Multiple-
Data (MIMD) computers, 578
Multiple-selection statements design issues for, 354–355 examples of, 355–358 implementation of, 358–359 using if, 360–362
Multiprocessors, 577–579
Multithreaded programs, 579–580
N
Name type equivalence, 305 Named constants, 232–234
Names
design issues for, 205
in encapsulation constructs, 513–517
form of, 205–206 introduction to, 204–205 keywords, 206
reserved words and, 206–207 special words, 206–207 summary of, 234–235
of variables, 208 variables vs., 207–209
Narrowing type conversions, 329 National Physical Laboratory, 69
Natural operational semantics, 140 Naur, Peter, 55–56, 117
NCC (Norwegian Computing Center), 72
Negation problem, Prolog, 754–756
Nested classes in C#, 558
in Java, 555–556 in object-oriented
programming, 533 Nested list structures, 49
Nested subprograms, 397–399, 454–460
Nesting classes, 533 Nesting selectors, 351–354 nesting_depth, 455
.NET languages
assemblies in, 512–513 computing platform for, 89 evolution of, 101
F# as, 712 introduction to, 22 JIT systems in, 30 JScript.NET as, 97
Microsoft Visual Studio .NET as, 31
programming environments of, 31
NetBeans, 31
Netscape, 97
von Neumann, John, 18 von Neumann architecture
in imperative programming languages, 204
introduction to, 18–19 in LR parsing, 195
von Neumann bottlenecks, 27
new
in allocation of objects, 532 in C#, 498, 557
in C++, 486 data types, 263
in heap management, 298 in Java, 552
in Ruby, 564
New Programming Language (NPL), 69
Newell, Allen, 47
NeXT, 90
next iterators, 373 Nil values, 49, 289
Nonblocking synchronization, 612
Nonconverting cast conversions, 304
nonlocal, 227
Nonstrict programming languages, 710
Nonterminal symbols, 118, 122
Norwegian Computing Center (NCC), 72
NOT operators, 333–334 not operators, 755–756 NPL (New Programming Language), 69
NULL, 691–692
Numeric data types, 246–249 Numeric predicate functions, 685 Nygaard, Kristen, 72–73
O
Object slicing, 532–533 Objective-C
abstract data types in, 490–496
C++ and, 90
dynamic binding in, 551–552 encapsulation constructs in,
490–492
information hiding in, 492–493 object-oriented programming
in, 549–552 Object-oriented constructs, 566–568 Object-oriented languages
allocation of objects in, 532–533
deallocation of objects in, 532–533
design issues for, 529–534 dynamic binding in, 533 exclusivity of objects in,
529–530 initialization of objects in,
533–534
multiple inheritance in, 531–532
nested classes in, 533
single inheritance in, 531–532 subclasses vs. subtypes in,
530–531
Object-oriented programming in Ada, 558–563
binding method calls to methods in, 566–568

|
|
Index |
787 |
in C#, 556–558 |
introduction to, 125–129, 255 |
params, 393 |
|
in C++, generally, 538–539, |
subrange, 258–259 |
Parent classes, 526–527 |
|
547–549 |
Orthogonality, 9–12, 73 |
Parentheses, 323–324 |
|
in C++ dynamic binding, |
others, 265, 637 |
Parse trees, 25, 121–122 |
|
544–547 |
otherwise, 708, 711 |
Parsing |
|
in C++ inheritance, 539–544 |
Out mode parameter passing, 400 |
bottom-up, 180, 190–192 |
|
child packages in, 562 |
Output functions, 684 |
complexity of, 180–181 |
|
dynamic binding in, 527–529 |
Overflow, 332 |
introduction to, 177–178 |
|
inheritance in, 525–527 |
Overloaded literals, 256–257 |
LL grammar class in, |
|
instance data storage in, 566 |
Overloaded operators, 328–329 |
187–190 |
|
introduction to, 21 |
Overloaded subprograms, 397, |
LR parsers for, 193–197 |
|
in Java, 552–556 |
421–422 |
problem set on, 200–201 |
|
in Objective-C, 549–552 |
Overridden methods, 526–527 |
programming exercises |
|
in Ruby, 563–565 |
override commands, 557–558 |
on, 201 |
|
in Smalltalk, 85–87, 534–538 |
P |
recursive-descent, 181–187 |
|
Stroustrup on, 536 |
review questions on, |
|
|
summary of, 569–570 |
Package scope, 515 |
199–200 |
|
support for, generally, |
Package specification, 482–484 |
shift-reduce algorithms for, |
|
524–525 |
Packages, 482–485, 562 |
192–193 |
|
Objects |
Pairwise disjointness test, 188 |
summary of, 197–199 |
|
in abstract data types, 475 |
Papert, Seymour, 86 |
top-down, 179 |
|
defined, 245–246 |
Paradigms of programming, |
Partial correctness, 158 |
|
exclusivity of, 529–530 |
536–537 |
Partial evaluation, 706 |
|
initialization of, 533–534 |
Parameter profiles, 390 |
Pascal |
|
in object-oriented program- |
Parameterized abstract data types |
Concurrent, 591 |
|
ming, generally, 525–526 |
in Ada, 503–504 |
dispose operator in, 293 |
|
OCaml, 52 |
in C# 2005, 509 |
enumeration data types in, |
|
Operand evaluation order, |
in C++, 505–506 |
256 |
|
325–328 |
introduction to, 503–509 |
evolution of, 36–37, 57, |
|
Operational semantics |
in Java, 506–509 |
75–77 |
|
evaluation of, 142 |
Parameter-passing methods |
lock-and-keys approach |
|
introduction to, 139–140 |
of common languages, |
in, 298 |
|
process of, 140 |
406–408 |
nested subprograms in, 399 |
|
Operator evaluation order, |
examples of, 414–417 |
parameter-passing in, 419 |
|
319–325 |
implementation models for, |
run-time checks in, 312 |
|
Operator overloading, 9, 328–329 |
400–405 |
subrange types in, 258 |
|
Operator precedence, 123–126 |
implementation of, 405–406 |
Turbo, 101 |
|
Operator precedence rules, 320 |
introduction to, 399–400 |
Pass-by-assignment, 408 |
|
Optimization, 17 |
semantic models of, 400 |
Pass-by-copy, 403 |
|
or else statements, 336 |
Parameters |
Pass-by-name, 404–405 |
|
OR operators, 333–336 |
in multidimensional arrays, |
Pass-by-reference, 403–404 |
|
Ordinal data types |
410–413 |
Pass-by-result, 401–403 |
|
enumeration types, 255–258 |
for subprograms, 391–395 |
Pass-by-value-result, 403 |
|
implementation of, 259 |
subprograms as, 417–419 |
Passedby value, 401 |
|
integer, 255 |
Parametric polymorphism, 423 |
pcall constructs, 618 |
|

788 Index
PDA (Pushdown automaton), 193
Perl
arrays in, 261–264 assignments in, 337–341 associative arrays in, 272–276 binary logic operators in, 334 C# vs., 103
dynamic length strings in, 253 dynamic scoping in, 227–228 evolution of, 36–37 exponentiation in, 396 foreach statements in, 380 hybrid system implementing,
30
as imperative programming language, 22
overview of, 95–97 parameter passing in, 407 pattern matching in, 170, 252 prefix operators in, 319 Python vs., 99–100
Ruby vs., 100 slices in, 268
then and else clauses in, 350, 352
Unicode in, 249 variables in, 205, 211
Perlis, Alan, 46, 53 PHP
arrays in, 273, 276, 373 execution speed in, 718 foreach statements in, 103 global variables in, 224–225 overview of, 98–99
parameter passing in, 392, 407 pattern matching in, 252
pure interpretation in, 28 relational operators in, 333 as scripting language, 7, 28 switch statements in, 357 type binding in, 213 variable names in, 205
Phrases, 191–192
Physical concurrency, 579 Pike, Rob, 91
pipeline (|>) operators, 714 Plankalkül, 38–39
PL/I
design process for, 69 evaluation of, 70–71 historical background of, 68 introduction to, 68
language overview of, 69–70 operational semantics in, 142 overview of, 68–71
PL/S, 6
Pointer types in Ada, 293
in C and C++, 294–295 dangling, 292–293, 297–298 design issues for, 290 evaluation of, 297
heap management and, 298–302
introduction to, 289–290 lost heap-dynamic variables
in, 293
operations in, 290–291 problems in, 291 representations of, 297
Polonsky, I. P., 72
Polymorphic references, 528 Polymorphic subprograms,
422–423 Polymorphism, 422–423 Pontifical University of Rio de
Janeiro, 100, 274
Portability, 18
Portable systems languages. see C
Positional parameters, 392
Postconditions
in assignment statements, 150–152
introduction to, 148–149 in logical pretest loops,
154–158
in program proofs, 158–160
in selection statements, 153–154
in sequences, 152–153 weakest preconditions
and. see Weakest preconditions
Posttest, 363 pragma, 601, 640 Precedence, 319–321
Precision, 247
Preconditions
in assignment statements, 150–152
introduction to, 148–149 in logical pretest loops,
154–158
in program proofs, 158–160 in selection statements,
153–154
in sequences, 152–153 weakest. see Weakest preconditions
Predicate calculus defined, 729
for logic programming languages, 728–734
in Prolog, 79
Predicate functions, 134, 689–691
Predicate transformers, 154–158
Prefix operators, 319
Preprocessors, 30 Pretest, 362
Primitive data types boolean, 249 character, 249–250 complex, 248 decimal, 248–249
floating point, 247–248 integer, 246–247 numeric, 246–249
Primitive numeric functions, 681–682

Priorities of tasks, 601–602 Priorities of threads, 606–607
private
in Ada, 562
in C#, 498–499
in C++, 486–487, 540–544 in Ruby, 500–501
Private types, 482–484 Procedure-oriented programming,
21
Procedures, 395–396
Process abstraction, 475 Processes, 581 Producer-consumer problems,
582
Productions, 118 Program calculus, 38
Program counters, 19 Program proofs, 158–160
Program_Error exceptions,
639
Programming design methodologies, 20–21
Programming domains artificial intelligence in, 6
business applications in, 5–6 generally, 5
scientific applications in, 5 in systems programming, 6–7 Web software and, 7
Programming environments, 31 Prolog
arithmetic in, 743–746 closed-world assumption in, 754 deficiencies of, 751–756 design process for, 79
elements of, generally, 736–737
evaluation of, 80
fact statements in, 737–738 goal statements in, 739–740 inferencing process of, 740–743 intrinsic limitations in, 756 introduction to, 6
language overview of, 79–80 list structures in, 746–751 logic in, generally, 79 negation problem in, 754–756 origins of, 736
resolution order control in, 751–753
rule statements in, 738–739 terms in, 737
Prolog++, 21
Prologue of subprogram linkage, 443–448
Properties, C#, 498–499 Propositions, 729–731 protected access modifiers, 498 Protected objects, 592, 602–603
Protocols, 390, 551 Prototypes, 391 Pseudocodes
introduction to, 39–40 related work, 42 Short Code, 40–41 Speedcoding, 41
UNIVAC ”compiling” system, 41
public
in C#, 498
in C++, 486 derivations, 540–544 in Ruby, 500–501
Pure interpretation, 28
Pure virtual functions, 546 Pure virtual method, 529
Pushdown automaton (PDA), 193 Python
arrays in, 264–268 complex values in, 248 concurrency in, 585 def statements in, 390 dictionaries in, 273
elif statements in, 360 interpreting expressions in, 681 lambda expressions in, 716 long integer type of, 246
Index |
789 |
mutable lists in, 283–284, 311 nested subprograms in, 219,
454, 510 overview of, 99–100
parameters in, 392–394 pass-by-assignments in, 408 pattern matching in, 252 referencing environments and,
230 strings in, 251
subprograms in, 389
then and else clauses in, 351 tuples in, 280–281, 712 type binding in, 213 Unicode in, 249–250
Q
Quantifiers, 730
Quasi-concurrency, 433 Quasi-concurrent subprograms,
579–580 Queries, 739–740 QUOTE, 686–687
R
Race conditions, 582 Radio buttons
in C#, 661–664
in Java, 656–660 raise statements, 640
Raised exceptions, 631 RAND Corporation, 47
Range
for arrays, 284
in floating-point data types, 247
iterators, 372 in Python, 367
Raw methods, 425
RDBMSs (Relational database management systems), 757
Read statements, 630 Readability, 8, 16 Reader macros, 701

790 |
Index |
|
|
Readers, 701 |
Relational database management |
Romanovsky, Alexander, 643 |
|
read-evaluate-print loops (REPLs), |
systems (RDBMSs), 757 |
van Rossum, Guido, 99 |
|
|
681 |
Relational expressions, 332–333 |
Roussel, Phillippe, 79, 736 |
readonly constants, 233–234 |
Relational operators, 332–335 |
Row major order, 270 |
|
Ready tasks, 583 |
Reliability, 15 |
RPG (Report Program |
|
Real types, 703 |
Rendezvous, 594–597 |
Generator), 22 |
|
Recognition, 116 |
repeat, 19 |
Ruby |
|
Record types |
REPLs (read-evaluate-print loops), |
abstract data types in, |
|
definition of records in, |
681 |
499–503 |
|
|
277–278 |
Report Program Generator (RPG), |
arithmetic expressions in, 324 |
evaluation of, 279 |
22 |
dynamic binding in, 565 |
|
implementation of, 279–280 |
Reserved words, 206–207 |
evolution of, 67, 100 |
|
introduction to, 276–277 |
reset, 373 |
inheritance in, 565 |
|
references to fields in, 278–279 |
Resolution |
modules in, 516–517 |
|
Rectangular arrays, 267–268 |
arithmetic computation for, |
object-oriented programming |
|
Recursion, 449–453 |
743–746 |
in, 563–565 |
|
Recursive rules, 119 |
closed-world assumption in, |
Rule of consequence, 152 |
|
Recursive-descent parsers |
754 |
Rules, 118–119, 739–740 |
|
LL grammar class in, |
defined, 732 |
run methods, 603–604 |
|
|
187–190 |
list structures for, 746–751 |
Running tasks, 584 |
overview of, 181–187 |
order control, 751–753 |
Run-time stacks, 447 |
|
as pushdown automatons, |
in Prolog, 740–743, 751–753 |
Russell, Stephen B., 680 |
|
|
193 |
Resumes, 433–434 |
R-value, 209 |
ref type, F#, 620 |
Resumption, 634 |
S |
|
Reference counters, 299 |
Returned values, 429 |
||
Reference parameters, 406 |
Returns, 442 |
Sandén, Bo, 643 |
|
Reference types |
reverse functions, 364, 750 |
Satisfying subgoals, 740 |
|
dangling pointers and, |
Richards, Martin, 77 |
Scalable algorithms, 577 |
|
|
297–298 |
Right recursive grammar rules, |
Schedulers, 583 |
heap management and, |
128 |
Scheme |
|
|
298–302 |
Right-hand side (RHS) |
apply-to-all functional forms |
implementation of, 297 |
in bottom-up parsers, 180, 191 |
in, 697–698 |
|
introduction to, 289–290 |
in denotational semantics, |
code-building functions in, |
|
overview of, 295–297 |
143–144 |
698–699 |
|
representations of, 297 |
derivations and, 121 |
control flow in, 685–686 |
|
Referencing environments, |
in Extended BNF, 130–132 |
defining functions in, |
|
|
230–232 |
fundamentals of, 118–123 |
682–684 |
Referential transparency, |
grammar rules for, 128 |
example of, 691–694 |
|
|
327–328, 676–677 |
in LL parsers, 187–190 |
functional compositions in, |
Refutation complete, 733 |
in LR parsing, 195 |
697 |
|
Regular expressions, 252 |
in recursive-descent parsers, |
functional forms in, 696–698 |
|
Regular grammars, 117 |
182–184 |
as functional language, 681 |
|
Regular languages, 171 |
in top-down parsers, 179 |
interpreter in, 681 |
|
Relational data types, 332–333 |
Ritchie, Dennis, 77–78, 91, 376 |
LET, 694–695 |

|
|
Index |
791 |
LISP, 51 |
bibliographic notes on, |
SIMULA 67 |
|
list functions in, 686–689 |
161–162 |
data abstraction in, 72 |
|
numeric predicate functions |
denotational. see Denotational |
design process for, 72–73 |
|
in, 685 |
semantics |
introduction to, 21 |
|
origins of, 681 |
dynamic, 139 |
language overview of, 73 |
|
output functions in, 684 |
introduction to, 113–115 |
object-oriented programming |
|
predicate functions in, 689–691 |
natural operational, 140 |
in, 525 |
|
primitive numeric functions in, |
operational, 139–142 |
Single inheritance, 527, |
|
681–682 |
static, 133 |
531–532 |
|
symbolic atoms and lists in, |
structural operational, 140 |
Single-Instruction Multiple-Data |
|
689–691 |
of subprogram calls and |
(SIMD) computers, 578 |
|
tail recursive functions in, |
returns, 442 |
Single-size cells, 299 |
|
695–696 |
summary of, 161 |
sleep methods, 605 |
|
Schwartz, Jules I., 55 |
syntax and. see Syntax |
Slices, 250, 268–269 |
|
Scientific applications, 5 |
Semaphores, 586–590, 607 |
Smalltalk |
|
Scope |
Sentences, 115 |
design process for, 85–86 |
|
blocks for, 220–223 |
Sentential forms, 120 |
dynamic binding in, 535 |
|
declaration order for, 223–224 |
Sequences, 152–153 |
evaluation of, 87 |
|
dynamic scoping, 227–229 |
Sergot, M. J., 758 |
inheritance in, 534–535 |
|
global, 224–227 |
Server tasks, 596 |
introduction to, 21 |
|
introduction to, 204 |
Servlet containers, 105 |
language overview of, 86–87 |
|
lifetime and, 229–230 |
Setter methods, 564 |
object-oriented programming |
|
named constants and, |
S-expressions, 680 |
in, 85, 525, 534–538 |
|
232–234 |
Shallow access, 464–466 |
SNOBOL, 71–72 |
|
overview of, 218 |
Shallow binding, 418–419 |
Solaris Common Desktop |
|
referencing environments and, |
SHARE, 53–55, 68–69 |
Environment (CDE), 31 |
|
230–232 |
Shared inheritance, 531 |
Source languages, 25 |
|
static scoping, 219–220, 227 |
Shaw, J. C., 47 |
special, 52 |
|
summary of, 234–235 |
Shift-reduce algorithms, 192–193 |
Special words, 12, 206–207 |
|
Scott, Dana, 147 |
Short Code, 40–41 |
Speedcoding, 41 |
|
Scripting languages, 95–101 |
short operands, 320, 331 |
SQL (Structured Query Language), |
|
Scripts, 95 |
Short Range Committee, 60 |
757 |
|
select statements, 597–599 |
Short-circuit evaluation, 335–336 |
Stack-dynamic arrays, 56, 262 |
|
Selection, 153–154 |
Side effects, 325–328, 428–429 |
Stack-dynamic local variables, |
|
Selection statements |
SIGPLAN Notices, 82 |
445–453 |
|
counter-controlled loops, 363 |
SIMD (Single-Instruction |
Stack-dynamic variables, |
|
introduction to, 350 |
Multiple-Data) computers, 578 |
215–216 |
|
multiple-selection, 354–362 |
Simon, Herbert, 47 |
Stanford University, 75 |
|
two-way, 350–354 |
Simple assignment statements, |
start methods, 604 |
|
Selector expressions, 354 |
336–337 |
Start symbols, 119 |
|
Semantic domains, 142 |
Simple functions, 674–675 |
State diagrams, 171 |
|
Semantics |
Simple lists, 678, 691–692 |
State of programs, 145 |
|
axiomatic. see Axiomatic |
Simple phrases, 191–192 |
Statement-level concurrency, |
|
semantics |
Simplicity, 8–9, 13–14 |
621–623 |
|

792 |
Index |
|
|
Statement-level control structures |
Strachey, Christopher, 147 |
generic, 422–428 |
|
conclusions about, 379–380 |
Strawman requirements document, |
implementation of. see |
|
counter-controlled loops, |
81–82 |
Subprograms, |
|
|
367–368 |
Strict programming languages, |
implementing |
guarded commands, 376–379 |
710 |
introduction to, 388 |
|
introduction to, 2–3, 347–349 |
Strong typing, 303–304 |
in Java 5.0, 425–426 |
|
iterative statements, 362–363, |
Stroustrup, Bjarne |
local referencing environments |
|
|
371–375 |
on C++, 480–481 |
for, 397–399 |
logically controlled loops, |
C++ by, 88 |
local variables in, 397–399 |
|
|
368–370 |
on programming paradigms, |
multidimensional arrays and, |
selection statements, 350 |
536–537 |
410–413 |
|
for statements, 364–367 |
structs |
nested, 397–399 |
|
summary of, 380 |
in C, 308, 310 |
overloaded, 421–422 |
|
two-way selection statements, |
in C#, 102 |
parameter-passing in. see |
|
|
350–354 |
in C-based languages, 38 |
Parameter-passing |
unconditional branch |
data type, 277 |
methods |
|
|
statements, 375–376 |
introduction to, 11 |
parameters as, 417–419 |
Static ancestors, 219 |
Structural operational semantics, |
parameters for, 391–395 |
|
Static arrays, 262 |
140 |
problem set on, 438–439 |
|
Static binding, 210, 533 |
Structure type equivalence, 305 |
procedures as, 395–396 |
|
Static chaining, 454–460 |
Structured Query Language (SQL), |
returned values and, 429 |
|
Static length strings, 252–255 |
757 |
side effects of functions in, |
|
Static links, 454–455 |
Structures, 737 |
428–429 |
|
static modifiers, 263 |
Subclasses, 526, 530–531 |
summary of, 435–436 |
|
Static parents, 219 |
Subgoals, 740 |
type checking parameters, |
|
Static scoping |
Subprogram calls, 389 |
408–410 |
|
evaluation of, 227 |
Subprogram definitions, 389 |
user-defined overloaded data |
|
overview of, 219–220 |
Subprogram headers, 389 |
types in, 430 |
|
pointers in, 455 |
Subprogram linkage, 442 |
Subprograms, implementing |
|
Static semantics, 133 |
Subprogram-level concurrency, |
blocks in, 460–462 |
|
Static type bindings, 211–212 |
581–586 |
calls in, 442 |
|
Static variables |
Subprograms |
deep access in, 462–464 |
|
in binding, 215 |
in C# 2005, 427 |
dynamic scoping in, |
|
in dynamic scoping, 229 |
in C++, 423–425 |
462–466 |
|
introduction to, 13 |
calling indirectly, 419–421 |
introduction to, 442 |
|
in nested subprograms, 398 |
characteristics of, 388–389 |
of nested subprograms, |
|
static_depth, 455 |
closures, 430–432 |
454–460 |
|
Steele Jr., Guy L., 356 |
coroutines, 432–435 |
with recursion, 451–453 |
|
Steelman requirements document, |
definitions in, 389–391 |
returns in, 442 |
|
|
82 |
design issues for, 396–397, |
shallow access in, 464–466 |
Stepsize, 363 |
413–414 |
of simple subprograms, |
|
Stichting Mathematisch Centrum, |
in F#, 427–428 |
443–445 |
|
|
99 |
functions as, 395–396, |
stack-dynamic local variables |
Storage bindings, 214–215 |
428–429 |
for, 445–453 |
|
Storage_Error exceptions, 639 |
fundamentals of, 388 |
static chaining for, 454–460 |

summary of, 466
without recursion, 449–451
Subrange types designing, 258–259 evaluation of, 259 introduction to, 258
Subscript bindings, 262–264
Subscripts, 258 Substring references, 250
subtype enumeration type, 258 Subtype polymorphism, 422
Subtypes, 306, 530–531 Sun Microsystems, 92
super
in Java, 553
in Objective-C, 550 pseudovariables, 535 in Ruby, 564
Superclasses, 526
Suppress pragma, 640 Swing GUI components, 656–657
switch
in C, 77–78
in C#, 376 multiple-selection statements
and, 355–358 Symbolic atoms and lists,
689–691
Symbolic logic, 729
Synchronization
in Ada, 599–601
in concurrency, 586–592 introduction to, 581–585 in Java, 607–608
of modifiers, 93, 592 nonblocking, 612
of statements, 608 of threads, 616–617
Synchronous message passing, 593–594
Syntactic domains, 142 Syntax
ambiguous grammars in, 122–123
analysis of, 25–27, 168–169
associativity in, 126–128 attribute grammars and. see
Attribute grammars bibliographic notes on,
161–162
BNF and, 117–118 context-free grammars and,
117–118 derivations in, 119–121 design of, 12–13
in Extended BNF, 129–132 fundamentals of, 118–119 generation of, 116–117 grammars and, 117–121, 132 if-then-else statements,
128–129 introduction to, 113–115
issues in describing, 115–117 of LISP, 50
list descriptions in, 119 methods of describing, 117 operator precedence in,
123–126
parsing and. see Parsing recognition of, 116 recognizers in, 132 semantics and. see Semantics summary of, 161, 197–199 unambiguous grammars in,
128–129
Synthesized attributes, 134 Syracuse University, 732
System.Object, 102
Systems programming, 6–7
Systems software, 6
T
Tagged types, 559–561 Tail recursive functions,
695–696
Task descriptors, 586 Task ready queues, 584
task specifications, 594–595 Task termination, 601 Tasking_Error exceptions, 639
Index |
793 |
Tasks, 581–585 Template functions, 423
Terminal symbols, 118, 122
Terminal values, 363 terminate, 599, 601
Terms, 737
Ternary operators, 319
Tests, 709
Texas A&M University, 480, 536 Text boxes, 656
then, 128–129, 350 Theorem-proving, 732–734 Theory of data types, 308–310 Thompson, Ken, 91
Threads
in C++, 544
in competition synchronization, 607–608
concurrency in, 603–604, 613 in cooperation synchronization,
608–611 defined, 581
explicit locks in, 612–613 in Java, 93, 606–607
in nonblocking synchronization, 612
priorities of, 606–607 semaphores in, 607 Thread class, 604–606
Threads of control, 579–580 throw statements, 644–651 Thrown exceptions, 631 throws clauses, 654 Tokens, 115, 170–177
Tombstones, 297–298 Top-down parsers, 179 Top-down resolution, 741 Total correctness, 158 Tracing models, 744–745 Trimming, 74
Tripod, 66–67
try blocks, 612, 614 try clauses
in C++, 643–646
in Java, 648–653

794 Index
Tuples, 280–281 Turing machines, 678 Turner, David, 52
twos complement, 247 Two-way selection statements
clause forms in, 350–351 control expressions for, 350 design issues for, 350
nesting selectors in, 351–354 selector expressions in, 354
type
in Ada enumeration types, 258 in Ada equivalence, 306–307 in Ada union types, 286, 289 in F#, 287
in ML, 281 Type, defined, 209 Type bindings
dynamic, 212–214 introduction to, 210 static, 211–212
Type checking introduction to, 15 overview of, 302–303
parameters in, 408–410 Type conversions, 329–332
type enumeration type, 257, 261 Type equivalence, 304–308
Type errors, 303 Type inference, 211 typedef, 308
U
Unambiguous grammars, 123–126 Unary assignment data types,
338–339 Unary operators, 319
Unchecked exceptions, 650 Unconditional branch statements,
375–376 undef, 145–147
undefined, 264
Underflow, 332
Ungar, David, 548
Unicode, 249
Unification, 733, 759 Uninstantiated variables, 737 union, 285, 308
Union types
in Ada, 285–287 design issues for, 285
discriminated vs. free unions in, 285
evaluation of, 288 in F#, 287–288
implementation of, 289 introduction to, 284
Unit-level concurrency. see subprogram-level
UNIVAC, 40–41
UNIVAC Scientific Exchange (USE), 53
University of Aix-Marseille, 79, 736
University of Edinburgh, 79, 736 University of Utah, 85
UNIX
programming environment of, 31
readability of, 13 systems software for, 6–7
Unlimited extent, 431 unsafe, C#, 296
USE (UNIVAC Scientific
Exchange), 53 use clause, 484, 516 User-defined
abstract data types, 476–478
ordinal data types. see Ordinal data types
overloaded data types, 430 User-located loop control mecha-
nisms, 370–371 using directive, 515
V
val statements, 341, 704–706
Value, 209 Value types, 290
var declarations, 211–212 Variables
addresses of, 208 defined, 245 names of, 208
names vs., 207–209 type of, 209
value of, 209
Variable-size cells, 301 VAX minicomputers, 10 VB (Visual BASIC), 13 VDL (Vienna Definition
Language), 142
Vector processors, 578 Vienna Definition Language
(VDL), 142
virtual method tables (vtables), 566–568
virtual reserved word, 545, 557
Visible variables, 218
Visual BASIC (VB), 13, 65–67 Visual languages, 22
Visual Studio, 22, 31 void, 11, 389–393 void * pointers, 295
vtables (virtual method tables), 566–568
W
wait semaphores, 586–590 Wall, Larry, 95
Weakest preconditions
in assignment statements, 150–152
in axiomatic semantics, 149–150
in logical pretest loops, 154–158
in sequences, 152–153 Web software, 7 Weinberger, Peter, 95
Well-definedness, 18
Wheeler, David J., 42 when clauses, 598–599

while |
Widgets, 655–656 |
for assignments as expressions, |
van Wijngaarden |
339 |
grammars, 74 |
in C#, 616 |
Wildcard types, 426 |
in Java, 92, 609 |
Wileden, J. C., 227 |
in logically controlled loops, |
Wilkes, Maurice V., 42 |
368–370 |
Windows, 66–67 |
loops, 154–158 |
Wirth, Niklaus, 75, 379 |
in short-circuit evaluations, |
with clauses |
335 |
in Ada, 484 |
as special word, 12 |
in Ada packages, 516, 562 |
syntax of, 114–115 |
Wolf, A. L., 227 |
in user-located loop control |
Woodenman requirements |
mechanisms, 371 |
document, 82 |
Whitaker, Lt. Col. William, 81 |
Wrapper classes, 530 |
Widening type conversions, 329 |
Writability, 13, 16 |
Index |
795 |
X
Xerox Palo Alto Research Center (Xerox PARC), 86
XML (eXtensible Markup Language), 104–106
XSLT (eXtensible Stylesheet Language Transformations), 22, 104–105
Y
yacc, 132
yield methods, 605
Z
Zuse, Konrad, 38