Download presentation
Presentation is loading. Please wait.
1
Names, Bindings, Type Checking, and scopes
Chapter 5 Names, Bindings, Type Checking, and scopes
2
This Chapter Introduces the fundamental semantic issues of variables
The Nature of names and special words in programming languages. The attributes of variables, including type, address, and value.
3
The issue of aliases is included.
The important concepts of binding and binding times. Type checking, strong typing, and type compatibility rules. The two very different scoping rules for names, static and dynamic.
4
Introduction A variable can be characterized by a collection of properties, or attributes, the most important of which is type, a fundamental concepts in programming languages. The design of the data types of a language requires that a variety of issues be considered. Among the most important of these are the scope and lifetime of variables.
5
Introduction Related to these are the issues of types checking and initialization. A Knowledge of all these concepts is requisite to understanding the imperative languages. Type compatibility is another important part of the data type design of a language.
6
Names Names : is a string of characters used to identify some entities in n a program Design issues: Maximum length? Are connector characters allowed? Are names case sensitive? Are special words reserved words or keywords?
7
Length FORTRAN I: maximum 6 COBOL: maximum 30
FORTRAN 90 and ANSI C: maximum 31 Ada: no limit, and all are significant C++: no limit, but implementers often impose one
8
Connectors Connector Character such as the underscore( _ ).
Pascal, Modula-2, and FORTRAN 77 don't allow. Others do
9
Case sensitivity In some languages, notably C,C++, Java, uppercase and lowercase letters in names are distinct; that is names in these languages are case sensitive. Example: the following three names are distinct in C++: rose,ROSE, and Rose. Disadvantage: readability (names that look alike are different) worse in Modula-2 because predefined names are mixed case (e.g. WriteCard) C, C++, Java, and Modula-2 names are case sensitive The names in other languages are not
10
Special words Special words in programming languages are used to make programs more readable by naming actions to be performed .They also are used to separate the syntactic entities of programs. In most languages, these words are classified as reserved words, but in some they are only keywords. A keyword: Is a word that is special only in certain contexts. FORTRAN is one of the languages whose special words are keywords. Disadvantage: poor readability. A reserved word : Is a special word of a programming language that cannot be used as name. As a language design choice, reserved words are better than keywords because the ability to redefine keywords can lead to readability problems.
11
In Fortran: REAL APPLE < Type REAL = < Variable INTEGER REAL :Variable REAL to integer type REAL INTEGER :Variable integer to real type The appearance of real and integer as variable names elsewhere in the program could be misleading to program readers.
12
Many languages include predefined names, which are in a sense between reserved words and user-defined names. Examples : 1- Writeln and readln in PASCAL 2- scanf and printf in C Note : predefined names are called sometimes standard identifiers.
13
Variables A variable is an abstraction of a memory cell
Variables can be characterized as a sextuple of attributes: name, address, value, type, lifetime, and scope Name - not all variables have them
14
Address - the memory address with which it is associated
A variable may have different addresses at different times during execution A variable may have different addresses at different places in a program If two variable names can be used to access the same memory location, they are called aliases Aliases are harmful to readability
15
- How aliases can be created:
Pointers, reference variables, Pascal variant records, C and C++ unions, and FORTRAN EQUIVALENCE. (and through parameters - discussed in Chapter 8) Some of the original justifications for aliases are no longer valid; e.g. memory reuse in FORTRAN replace them with dynamic allocation
16
Type - determines the range of values of variables and the set of operations that are defined for values of that type; in the case of floating point, type also determines the precision. Value - the contents of the location with which the variable is associated Abstract memory cell - the physical cell or collection of cells associated with a variable
17
Note : The l-value of a variable is its address The r-value of a variable is its value
18
The concepts of binding
Def: A binding is an association, such as between an attribute and an entity, or between an operation and a symbol Def: Binding time is the time at which a binding takes place.
19
Possible binding times:
1. Language design time--e.g., bind operator symbols to operations 2. Language implementation time--e.g., bind fl. pt. type to a representation 3. Compile time--e.g., bind a variable to a type in C or Java 4. Load time--e.g., bind a FORTRAN 77 variable to a memory cell (or a C static variable) 5. Runtime--e.g., bind a nonstatic local variable to a memory cell
20
Def: A binding is static if it occurs before run time and remains unchanged throughout program execution. Def: A binding is dynamic if it occurs during execution or can change during execution of the program.
21
Type Bindings 1. How is a type specified?
2. When does the binding take place? If static, type may be specified by either an explicit or an implicit declaration
22
Def: An explicit declaration is a program statement used for declaring the types of variables
Def: An implicit declaration is a default mechanism for specifying types of variables (the first appearance of the variable in the program)
23
FORTRAN, PL/I, BASIC, and Perl provide implicit declarations
Advantage: writability Disadvantage: reliability (less trouble with Perl)
24
Dynamic Type Binding - Specified through an assignment statement
e.g. APL LIST < LIST <- 17.3 Advantage: flexibility (generic program units) Disadvantages: 1. High cost (dynamic type checking and interpretation) 2. Type error detection by the compiler is difficult
25
Type Inferencing (ML, Miranda, and Haskell)
Rather than by assignment statement, types are determined from the context of the reference. Example : fun circumf( r ) = 3.14 * r; fun circumf( r) = 3 * r;
26
Storage Bindings Allocation - getting a cell from some pool of available cells Deallocation - putting a cell back into the pool Def: The lifetime of a variable is the time during which it is bound to a particular memory cell
27
Categories of variables by lifetimes
1. Static--bound to memory cells before execution begins and remains bound to the same memory cell throughout execution. e.g. all FORTRAN 77 variables, C static variables Advantage: efficiency (direct addressing), history-sensitive subprogram support Disadvantage: lack of flexibility (no recursion)
28
Categories of variables by lifetimes
2. Stack-dynamic--Storage bindings are created for variables when their declaration statements are elaborated. If scalar, all attributes except address are statically bound e.g. local variables in Pascal and C subprograms Advantage: allows recursion; conserves storage Disadvantages: - Overhead of allocation and deallocation - Subprograms cannot be history sensitive - Inefficient references (indirect addressing)
29
Categories of variables by lifetimes
3. Explicit heap-dynamic--Allocated and deallocated by explicit directives, specified by the programmer, which take effect during execution Referenced only through pointers or references e.g. dynamic objects in C++ (via new and delete) all objects in Java Advantage: provides for dynamic storage management Disadvantage: inefficient and unreliable
30
Categories of variables by lifetimes
4. Implicit heap-dynamic--Allocation and deallocation caused by assignment statements e.g. all variables in APL Advantage: flexibility Disadvantages: Inefficient, because all attributes are dynamic Loss of error detection
31
Type Checking Generalize the concept of operands and operators to include subprograms and assignments Def: Type checking is the activity of ensuring that the operands of an operator are of compatible types Def: A compatible type is one that is either legal for the operator, or is allowed under language rules to be implicitly converted, by compiler-generated code, to a legal type. This automatic conversion is called a coercion. Def: A type error is the application of an operator to an operand of an inappropriate type
32
Type Checking - If all type bindings are static, nearly all type checking can be static If type bindings are dynamic, type checking must be dynamic Def: A programming language is strongly typed if type errors are always detected
33
Type Checking Advantage of strong typing: allows the detection of the misuses of variables that result in type errors
34
Languages: 1. FORTRAN 77 is not: parameters, EQUIVALENCE
2. Pascal is not: variant records 3. Modula-2 is not: variant records, WORD type 4. C and C++ are not: parameter type checking can be avoided; unions are not type checked 5. Ada is, almost (UNCHECKED CONVERSION is loophole) (Java is similar) Coercion rules strongly affect strong typing—they can weaken it considerably (C++ versus Ada)
35
Type Compatibility Def: Type compatibility by name means the two variables have compatible types if they are in either the same declaration or in declarations that use the same type name
36
Type Compatibility - Easy to implement but highly restrictive:
- Subranges of integer types are not compatible with integer types - Formal parameters must be the same type as their corresponding actual parameters (Pascal)
37
Type compatibility Def: Type compatibility by structure means that two variables have compatible types if their types have identical structures More flexible, but harder to implement
38
Problems Consider the problem of two structured types:
Suppose they are circularly defined Are two record types compatible if they are structurally the same but use different field names? Are two array types compatible if they are the same except that the subscripts are different? (e.g. [1..10] and [-5..4]) Are two enumeration types compatible if their components are spelled differently? With structural type compatibility, you cannot differentiate between types of the same structure (e.g. different units of speed, both float)
39
Language examples Pascal: usually structure, but in some cases name is used (formal parameters) C: structure, except for records Ada: restricted form of name Derived types allow types with the same structure to be different Anonymous types are all unique, even in: A, B : array (1..10) of INTEGER:
40
Scope Def: The scope of a program variable is the range of statements in which the variable is visible. A variable is visible in a statement if it can be referenced in that statement.
41
Scope Def: The nonlocal variables of a program unit are those that are visible but not declared there The scope rules of a language determine how references to names are associated with variables
42
Scope ALGOL 60 introduced the method of binding names to nonlocal variables ,called static scoping ,which has been copied by most subsequent imperative languages ,and many nonimperative languages as well. Static scoping is thus named because the scope of a variable can be determined ,that is , prior to execution.
43
Static scope Based on program text
To connect a name reference to a variable, you (or the compiler) must find the declaration Search process: search declarations, first locally, then in increasingly larger enclosing scopes, until one is found for the given name Enclosing static scopes (to a specific scope) are called its static ancestors; the nearest static ancestor is called a static parent
44
Static scope Variables can be hidden from a unit by having a "closer" variable with the same name C++ and Ada allow access to these "hidden" variables
45
Blocks - a method of creating static scopes inside program units--from ALGOL 60
Examples: C and C++: for (...) { int index; ... } Ada: declare LCL : FLOAT; begin end
46
Evaluation of Static Scoping
Consider the example: Assume MAIN calls A and B A calls C and D B calls A and E MAIN A C D B E A B C D E
47
MAIN MAIN A B A B C D E C D E
48
Suppose the spec is changed so that D must now access some data in B
Solutions: 1. Put D in B (but then C can no longer call it and D cannot access A's variables) 2. Move the data from B that D needs to MAIN (but then all procedures can access them) Same problem for procedure access! Overall: static scoping often encourages many globals
49
Dynamic Scope Based on calling sequences of program units, not their textual layout (temporal versus spatial) References to variables are connected to declarations by searching back through the chain of subprogram calls that forced execution to this point
50
MAIN - declaration of x SUB1 - declaration of x - ... call SUB2 SUB2 - reference to x - call SUB1 MAIN calls SUB1 SUB1 calls SUB2 SUB2 uses x Static scoping - reference to x is to MAIN's x Dynamic scoping - reference to x is to SUB1's x
51
Evaluation of Dynamic Scoping:
Advantage: convenience Disadvantage: poor readability
52
Scope and lifetime are sometimes closely related, but are different concepts!!
Consider a static variable in a C or C++ function although the scope and lifetime of the variable are clearly not the same because static scope is textual , or spatial , concept whereas lifetime is temporal concept ,they at least appear to be related in this case . Scope and lifetime are also unrelated when Subprogram calls are involved.
53
Referencing Environments
Def: The referencing environment of a statement is the collection of all names that are visible in the statement. The referencing environment of a statement in a static-scoped language is the variables declared in its local scope plus the collection of all variables of its ancestor scopes that are visible.
54
Referencing Environments
In a static scoped language, that is the local variables plus all of the visible variables in all of the enclosing scopes - See book example (p. 208)
55
Example Program example; Var a,b : integer;
…………… Point Referencing environment Procedure sub1; x and y of sub1, a and b of example var x,y : integer; x of sub3, ( x of sub2 is hidden ), a and b of example begin { sub1 } x of sub2, a and b of example ……………… a and b of example end; Procedure sub2; var x: integer; ………. Procedure sub3; var x : integer; Begin { sub3} End; Begin { sub2} …3 End; { sub2} Begin … End { example}
56
Example Void sub1() { point referencing environment
int a, b; 1 a and b of sub1, c of sub2,d of main ( c of main and b of sub2 are hidden) } 2 b and c of sub2, d of main (c of main is hidden) Void sub2() { Int b,c; 3 c and d of main Sub1; } Void main() { Int c,d; sub2();
57
A subprogram is active if its execution has begun but has not yet terminated
In a dynamic-scoped language, the referencing environment is the local variables plus all visible variables in all active subprograms - See book example (p. 209)
58
Named constant Def: A named constant is a variable that is bound to a value only when it is bound to storage; its value can’t be changed by assignment or bay an input statement. Advantages: readability and modifiability
59
The binding of values to named constants can be either static (called manifest constants) or dynamic
Languages: Pascal: literals only Modula-2 and FORTRAN 90: constant- valued expressions Ada, C++, and Java: expressions of any kind
60
Variable Initialization
Def: The binding of a variable to a value at the time it is bound to storage is called initialization Initialization is often done on the declaration statement e.g., Ada SUM : FLOAT := 0.0; Neither Pascal nor modula-2 provides a way to initialize variables except at runtime with assignment statement.
61
Answers to selected questions Page 212
62
Review Q1: What are the design issues for names ? Answer: 1- Maximum length 2- Can connectors be used 3- Are names case sensitive 4- Are the special words reserved words or keywords
63
Review Q10 : What are the advantages and disadvantage of implicit declaration ?
Answer: Advantages: Have a minor convenience to programmers Disadvantages: Detrimental to reliability because it prevent the compiler from detecting errors.
64
Review Q20 : What is a static ancestor of a subprogram
Review Q20 : What is a static ancestor of a subprogram? What is a dynamic ancestor of a subprogram ? Answer: The static parent of subprogram such as a, and its static parent, and so fourth up to the including the main, are called the static ancestors of a.
65
Procedure main() Var x : integer Procedure ali Begin x Procedure ahmed begin …… end End Begin main …. Static ancestors of Ahmed are : Ali and main Static ancestors of Ali are : main
66
The dynamic parent of subprogram such as a, and its dynamic parent, and so fourth up to the including the main, are called the dynamic ancestors of a. Note : Dynamic parent of a subprogram is the subprogram that call him, not the relation between them.
67
Procedure main() Var x : integer Procedure ali Begin ….. end Procedure ahmed begin ……Ali()….. End Begin main ….Ahmed(); Dynamic ancestors of Ahmed are : main Dynamic ancestors of Ali are : Ahmed and main
68
ProblemQ10 : Consider the following program:
Program main; Var x, y, z : integer; Procedure sub1; Var a, y, z : integer; Procedure sub2; Var a, b, z : integer; Begin { sub2 } …. End ; { sub2 } Begin { sub1 } ….. End; { sub1 } Procedure sub3; Var a,x, w: interger; Begin { sub3 } End; { sub3 } Begin { main } End { main }
69
List all the variables, along with the program units Where they are declared, that are visible in the Bodies of sub1, sub2, and sub3, assuming static Scoping is used?
70
Solution: Sub1 : a,y,z from sub1, x from main Sub2 : a,b,z from sub2,
Program main; Var x, y, z : integer; Procedure sub1; Var a, y, z : integer; Procedure sub2; Var a, b, z : integer; Begin { sub2 } …. End ; { sub2 } Begin { sub1 } ….. End; { sub1 } Procedure sub3; Var a,x, w: interger; Begin { sub3 } End; { sub3 } Begin { main } End { main } Solution: Sub1 : a,y,z from sub1, x from main Sub2 : a,b,z from sub2, y from sub1, x from main. Sub3 : a,x,w from sub3, y,z from main
71
Problem Q5: Dynamic type binding is closely related to implicit heap-dynamic variables. Explain this relationship Answer: In Dynamic type binding, the variable is bound to a type when it is assigned a value in an assignment statement. When the assignment statement is executed, the variable being assigned is bound to the type of the value, variable, or expression on the right side of the assignment.
72
implicit heap-dynamic variable is bound to heap storage only when they are assigned values. all the attributes of the variable are bound every time it is assigned. In other words, they are similar in that this is done at run time.
73
Problem Q14 Consider the following program
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main}
74
Given the following calling sequences and Assuming that dynamic scoping is used. What Variables are visible during execution of the last Subprogram activated? Include with each visible variable the name of the unit where it is declared ? Main calls sub1; sub1 calls sub2; sub2 calls sub3; Main calls sub1, sub1 calls sub3; Main calls sub2; sub2 calls sub3; sub3 calls sub1; Main calls sub3; sub3 calls sub1; Main calls sub1; sub1 calls sub3; sub3 calls sub2; Main calls sub3; sub3 calls sub2; sub2 calls sub1;
75
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main}
76
Main calls sub1; sub1 calls Sub2; sub2 calls sub3 Solution:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub1; sub1 calls Sub2; sub2 calls sub3 Solution: The variables are: a,x,w from sub3 b,z from sub2; y from sub1 and nothing from the main
77
Main calls sub1; sub1 calls Sub3; Solution: The variables are:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub1; sub1 calls Sub3; Solution: The variables are: a,x,w from sub3 y,z from the main
78
Main calls sub2; sub2 calls Sub3; sub3 calls sub1; Solution:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub2; sub2 calls Sub3; sub3 calls sub1; Solution: The variables are: a,y,z from sub1 x,w from sub3; b from sub2 and nothing from main
79
Main calls sub3; sub3 calls sub1; Solution: The variables are:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub3; sub3 calls sub1; Solution: The variables are: a,y,z from sub1 x,w from sub3; and nothing from main
80
Main calls sub1; sub1 calls sub3;sub3 calls sub2 Solution:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub1; sub1 calls sub3;sub3 calls sub2 Solution: The variables are: a,b,z from sub2 x,w from sub3; y from sub1 and nothing from main
81
Main calls sub3; sub3 calls Sub2;sub2 calls sub1 Solution:
Program main; Var x, y, z : integer; Procedure sub1; Var a,y,z : integer; Begin { sub1 1 } …. End; Procedure sub2; Var a,b,z : integer; Begin { sub 2 } End { sub 2 } Procedure sub3; Var a, x, w : integer; Begin … Begin { main } End . { main} Main calls sub3; sub3 calls Sub2;sub2 calls sub1 Solution: The variables are: a,y,z from sub1 b from sub2; x,w from sub1 and nothing from main
82
Problem Q 6 : Describe a situation when a history-sensitive variable in a subprogram is useful ? Answer : Any case you would like to count how many times the subprogram is executed. Thus, you declare a static variable ( history-sensitive ). For example, in C++, you can count how many objects are created if you have a static variable in your function.
83
Review Q23 What are the advantages of Named constants ? Answer :
1- Improve readability 2- Improve reliability 3- Reduce modification to the program. For example, if the size of the matrix is 100, then instead of repeating it several times, you just have const size = 100;
84
Problem Q 9: Assume the following program was compiled and executed using static scoping rules. What value of x is printed in procedure sub1 ? Under dynamic scoping rules, What value of x is printed in procedure sub1 ?
85
Program main; Var x : integer; Procedure sub1; Begin { sub1 } Writeln (‘x = ‘, x } End { sub1 Procedure sub2; Begin { sub 2 }; X : = 10; Sub1; End; Begin { main } X : = 5; Sub2; End.
86
Program main; Var x : integer; Procedure sub1; Begin { sub1 } Writeln (‘x = ‘, x } End { sub1 } Procedure sub2; Begin { sub 2 }; X : = 10; Sub1; End; Begin { main } X : = 5; Sub2; End.
87
Using static: X = 5 Program main; Var x : integer; Procedure sub1;
Begin { sub1 } Writeln (‘x = ‘, x } End { sub1 } Procedure sub2; Begin { sub 2 }; X : = 10; Sub1; End; Begin { main } X : = 5; Sub2; End. Using static: X = 5
88
Using dynamic: X = 10 Program main; Var x : integer; Procedure sub1;
Begin { sub1 } Writeln (‘x = ‘, x } End { sub1 } Procedure sub2; Begin { sub 2 }; X : = 10; Sub1; End; Begin { main } X : = 5; Sub2; End. Using dynamic: X = 10
89
Review Q2 What is the potential danger of case-sensitive names ?
Answer: Detriment the readability because names that look very similar denote different entities. For example, Var1, var1, and VAR1. This violates the deign principle that language constructs that look the same should have the same meaning.
90
Problem Q2 Some programming languages are typeless. What are the obvious advantages and disadvantages of having no types in a language ? Answer : Advantage : Make the programmer free from The worrying about the types. Disadvantage : Create the possibility of more errors
91
Review Q22 What are the advantages and Disadvantages of dynamic scoping ? Answer : Advantage: convenience Disadvantage: poor readability
92
Review Q 21: What is a block ?
Answer : A method of creating static scopes inside program units--from ALGOL 60 Examples: C and C++: for (...) { int index; ... } Ada: declare LCL : FLOAT; begin end
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.