Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
E-Bookshop-master / uploads / file / 0152_T_Sebesta_programming.pdf
Скачиваний:
265
Добавлен:
28.06.2021
Размер:
5.2 Mб
Скачать

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

Соседние файлы в папке file