PPL Study Material 241212 061141
PPL Study Material 241212 061141
UNIT-1
Preliminary Concepts
Background
• Frankly, we didn‘t have the vaguest idea how the thing [FORTRAN
language and compiler] would work out in detail. …We struck out
simply to optimize the object program, the running time, because
most people at that time believedyou couldn‘t do that kind of thing.
They believed that machined-coded programswould be so inefficient
that it would be impractical for many applications.
• John Backus, unexpected successes are common – the browser is
another example of an unexpected success
1
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• Readability : the ease with which programs can be read and understood
• Writability : the ease with which a language can be used to create programs
• Reliability : conformance to specifications (i.e., performs to its specifications)
• Cost : the ultimate total cost
Readability
• Overall simplicity
– A manageable set of features and constructs
– Few feature multiplicity (means of doing the same operation)
– Minimal operator overloading
• Orthogonality
– A relatively small set of primitive constructs can be combined in a relatively small
number of ways
– Every possible combination is legal
• Control statements
– The presence of well-known control structures (e.g., while statement)
• Data types and structures
– The presence of adequate facilities for defining data structures
• Syntax considerations
– Identifier forms: flexible composition
– Special words and methods of forming compound statements
– Form and meaning: self-descriptive constructs, meaningful keywords
Writability
• Simplicity and Orthogonality
– Few constructs, a small number of primitives, a small set of rules for combining them
• Support for abstraction
– The ability to define and use complex structures or operations in ways that allow details
to be ignored
• Expressivity
– A set of relatively convenient ways of specifying operations
– Example: the inclusion of for statement in many modern languages
Reliability
• Type checking
– Testing for type errors
• Exception handling
– Intercept run-time errors and take corrective measures
• Aliasing
– Presence of two or more distinct referencing methods for the same memory location
• Readability and writability
– A language that does not support “natural” ways of expressing an algorithm will
necessarily use “unnatural” approaches, and hence reduced reliability
Cost
• Training programmers to use language
• Writing programs (closeness to particular applications)
• Compiling programs
• Executing programs
• Portability
– The ease with which programs can be moved from one implementation to another
• Generality
– The applicability to a wide range of applications
• Well-definedness
– The completeness and precision of the language‘s official definition
Computer Architecture
• Well-known computer architecture: Von Neumann
• Imperative languages, most dominant, because of von Neumann computers
– Data and programs stored in memory
– Memory is separate from CPU
– Instructions and data are piped from memory to CPU
– Basis for imperative languages
• Variables model memory cells
• Assignment statements model piping
• Iteration is efficient
Programming Methodologies
• 1950s and early 1960s: Simple applications; worry about machine efficiency
• Late 1960s: People efficiency became important; readability, better control structures
– structured programming
– top-down design and step-wise refinement
3
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
4
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Figure 1.2 Layered View of Computer: The Figure 1.3: the compilation process
Operating system and language
Implementation are layered over Machine
Interface of a computer
Additional Compilation
Terminologies
• Load module (executable image): the user and system code together
5
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• Linking and loading: the process of collecting system program and linking them to user
program
Execution of Machine Code
Fetch-execute-cycle (on a von Neumann architecture)
initialize the program counterrepeat forever
fetch the instruction pointed by
the counterincrement the
counter
decode the
instruction
execute
the
instruction
• end repeat
• Von Neumann Bottleneck
• Connection speed between a computer‘s memory and its processor determines the
speed of a computer
• Program instructions often can be executed a lot faster than the above connection
speed; the connection speed thus results in a bottleneck
• Known as von Neumann bottleneck; it is the primary limiting factor in the speed of
computers
Pure Interpretation
• No translation
• Easier implementation of programs (run-time errors can easily and immediately
displayed)
• Slower execution (10 to 100 times slower than compiled programs)
• Often requires more space
• Becoming rare on high-level languages
6
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
7
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
1.7 Programming
Environments
Programming Environments
A programming environments is the collection of tools used in the development of software.
This collection may consist:
• A file system,
• A text editor,
• A linker,
• A compiler,
• Integrated tools
These tools may be access through a uniform interface (GUI).
Some of the examples of programming environments are:
1. Microsoft Visual Studio .NET, which is a large collection of software development tools,
used through a windows interface. It is used to develop software in following languages-
1. C#,
2. Visual Basic .NET,
3. JScript(MS JavaScript version),
4. J# (MS Java version),
5. managed C++.
2. NetBeans
3. Turbo C, C++
4. Dreamweaver
5. Arduino, etc.
Four of the most common IDEs are IntelliJ, Eclipse, NetBeans, and Visual Studio.
• UNIX
• Borland JBuilder
9
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Who must use language definitions?
Other language designers
• Implementors
Operational semantics
Operational semantics uses the idea that languages are abstract machines and
evaluation of a P program is a series of state
transitions from an initial to a final state.
There are two major ways to write operational semantics: small-step or big-step.
Denotational semantics
Denotational semantics uses the idea that languages are mathematical objects.
Axiomatic semantics is an approach based on mathematical logic for proving the correctness of
computer programs. It is closely related to Hoare logic. Axiomatic semantics define the meaning
of a command in a program by describing its effect on assertions about the program state.
11
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
BNF Rules
• A rule has a left-hand side (LHS) and a right-hand side (RHS), and consists of
terminal and nonterminal symbols
• A grammar is a finite nonempty set of rules
• An abstraction (or nonterminal symbol) can have more than one RHS
<stmt> → <single_stmt>
| begin <stmt_list> end
Describing Lists
• Syntactic lists are described using recursion
<ident_list> → ident
| ident, <ident_list>
• A derivation is a repeated application of rules, starting with the start symbol and ending
with a sentence (all terminal symbols)
An Example Grammar
<program> → <stmts>
<stmts> → <stmt> | <stmt> ; <stmts>
<stmt> → <var> = <expr>
<var> → a | b | c | d
<expr> → <term> + <term> | <term> - <term>
<term> → <var> | const
Parse Tree
A hierarchical representation of a derivation
Figure 2.1 Parse Tree
12
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
An example derivation
<program> <stmts>
<stmt>
<var>=<expr>
a=<expr>
a=<term>+<term>
a=<var>+<term>
a=b+<term>
a=b+const
Derivation
• Every string of symbols in the derivation is a sentential form
• A sentence is a sentential form that has only terminal symbols
• A leftmost derivation is one in which the leftmost nonterminal in each sentential form is
the one that is expanded
• A derivation may be neither leftmost nor rightmost
Ambiguity in Grammars
• A grammar is ambiguous iff it generates a sentential form that has two or more distinct
parse trees
An Unambiguous Expression Grammar
If we use the parse tree to indicate precedence levels of the operators, we cannot have
ambiguity
<expr> → <expr> - <term>|<term>
<term> → <term> / const|const
13
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Associativity of Operators
Operator associativity can also be indicated by a grammar
<expr> → <expr> + <expr> | const (ambiguous)
<expr> → <expr> + const | const (unambiguous)
14
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Definition
• An attribute grammar is a context-free grammar G = (S, N, T, P) with the following
additions:
– For each grammar symbol x there is a set A(x) of attribute values
– Each rule has a set of functions that define certain attributes of the nonterminals in the
rule
– Each rule has a (possibly empty) set of predicates to check for attribute consistency
– Let X0 X1 ... Xn be a rule
– Functions of the form S(X0) = f(A(X1), ... , A(Xn)) define synthesized attributes
– Functions of the form I(Xj) = f(A(X0), ... , A(Xn)), for i <= j <= n, define
inherited attributes
– Initially, there are intrinsic attributes on the leaves
Example
• Syntax
<assign> → <var> = <expr>
<expr> → <var> + <var> | <var>
<var> → A | B | C
• actual_type: synthesized for <var> and <expr>
• expected_type: inherited for <expr>
• Syntax rule :<expr> → <var>[1] + <var>[2]
Semantic rules :<expr>.actual_type → <var>[1].actual_type
Predicate :<var>[1].actual_type == <var>[2].actual_type
<expr>.expected_type == <expr>.actual_type
• Syntax rule :<var> → id
Semantic rule :<var>.actual_type lookup (<var>.string)
• How are attribute values computed?
– If all attributes were inherited, the tree could be decorated in top-down order.
– If all attributes were synthesized, the tree could be decorated in bottom-up order.
– In many cases, both kinds of attributes are used, and it is some combination of top-down
and bottom-up that must be used.
<expr>.expected_type inherited from parent
<var>[1].actual_type lookup (A)
<var>[2].actual_type lookup (B)
<var>[1].actual_type =? <var>[2].actual_type
<expr>.actual_type <var>[1].actual_type
<expr>.actual_type =? <expr>.expected_type
Operational Semantics
• A better alternative: A complete computer simulation
• The process:
– Build a translator (translates source code to the machine code of an idealized computer)
– Build a simulator for the idealized computer
• Evaluation of operational semantics:
– Good if used informally (language manuals, etc.)
– Extremely complex if used formally (e.g., VDL), it was used for describing semantics of
PL/I.
• Axiomatic Semantics
– Based on formal logic (predicate calculus)
– Original purpose: formal program verification
– Approach: Define axioms or inference rules for each statement type in the language (to
allow transformations of expressions to other expressions)
– The expressions are called assertions
Axiomatic Semantics
• An assertion before a statement (a precondition) states the relationships and
constraints among variables that are true at that point in execution
• An assertion following a statement is a postcondition
• A weakest precondition is the least restrictive precondition that will guarantee the
postcondition
• Pre-post form: {P} statement {Q}
• An example: a = b + 1 {a > 1}
• One possible precondition: {b > 10}
• Weakest precondition: {b > 0}
• Program proof process: The postcondition for the whole program is the desired result.
Work back through the program to the first statement. If the precondition on the first
statement is the same as the program spec, the program is correct.
• An axiom for assignment statements (x = E):
{Qx->E} x = E {Q}
• An inference rule for sequences
– For a sequence S1;S2:
– {P1} S1 {P2}
– {P2} S2 {P3}
• An inference rule for logical pretest loops For the loop construct:
{P} while B do S end {Q} Characteristics of the loop invariant I must meet the following
conditions:
– P => I (the loop invariant must be true initially)
– {I} B {I} (evaluation of the Boolean must not change the validity of I)
– {I and B} S {I} (I is not changed by executing the body of the loop)
– (I and (not B)) => Q (if I is true and B is false, Q is implied)
– The loop terminates (this can be difficult to prove)
• The loop invariant I is a weakened version of the loop postcondition, and it is also a
precondition.
16
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• I must be weak enough to be satisfied prior to the beginning of the loop, but when
combined with the loop exit condition, it must be strong enough to force the truth of the
postcondition.
Denotational Semantics
– Based on recursive function theory
– The most abstract semantics description method
– Originally developed by Scott and Strachey (1970)
– The process of building a denotational spec for a language (not necessarily easy):
– Define a mathematical object for each language entity
– Define a function that maps instances of the language entities onto instances of the
corresponding mathematical objects
– The meaning of language constructs are defined by only the values of the program's
variables
– The difference between denotational and operational semantics: In operational
semantics, the state changes are defined by coded algorithms; in denotational semantics, they
are defined by rigorous mathematical functions
– The state of a program is the values of all its current variables
s = {<i1, v1>, <i2, v2>, …, <in, vn>}
– Let VARMAP be a function that, when given a variable name and a state, returns the
current value of the variable
VARMAP(ij, s) = vj
• Decimal Numbers
– The following denotational semantics description maps decimal numbers as strings of
symbols into numeric values
<dec_num> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
| <dec_num> (0 | 1 | 2 | 3 | 4 |5 | 6 | 7 | 8 | 9)
Mdec('0') = 0, Mdec ('1') = 1, …, Mdec ('9') = 9
Mdec (<dec_num> '0') = 10 * Mdec (<dec_num>) Mdec (<dec_num> '1’) = 10 * Mdec
(<dec_num>) + 1
…
Mdec (<dec_num> '9') = 10 * Mdec (<dec_num>) + 9
Expressions
• Map expressions onto Z {error}
• We assume expressions are decimal numbers, variables, or binary expressions having
one arithmetic operator and two operands, each of which can be an expression
• Assignment Statements
– Maps state sets to state sets
• Logical Pretest Loops
– Maps state sets to state sets
• The meaning of the loop is the value of the program variables after the statements in
the loop have been executed the prescribed number of times, assuming there have been no
errors
• In essence, the loop has been converted from iteration to recursion, where the recursive
control is mathematically defined by other recursive state mapping functions
17
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Summary
• BNF and context-free grammars are equivalent meta-languages
– Well-suited for describing the syntax of programming languages
• An attribute grammar is a descriptive formalism that can describe both the syntax and
the semantics of a language
• Three primary methods of semantics description
– Operation, axiomatic, denotational
18
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
UNIT-2
Names, Bindings & Scopes
1. Introduction
DATA TYPES
1. Introduction
2. primitive
Control Structure
1. Introduction, Selection Statements
2. Iterative Statements, Unconditional Branching,
3. Guarded Commands.
19
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Names
Design issues for names:
• Maximum length?
• Are connector characters allowed?
• Are names case sensitive?
• Are special words reserved words or keywords?
Name Forms
A name is a string of characters used to identify some entity in a program.
If too short, they cannot be connotative
Language examples:
• FORTRAN I: maximum 6
• COBOL: maximum 30
• FORTRAN 90 and ANSI C: maximum 31
• Ada and Java: no limit, and all are significant
• C++: no limit, but implementers often impose a length limitation because they do not
want the symbol table in which identifiers are stored during compilation to be too large and also
to simplify the maintenance of that table.
Names in most programming languages have the same form: a letter followed by a string
consisting of letters, digits, and (_).
Although the use of the _ was widely used in the 70s and 80s, that practice is far less
popular.
C-based languages (C, C++, Java, and C#), replaced the _ by the “camel” notation, as in
myStack.
Prior to Fortran 90, the following two names are equivalent:
Sum Of Salaries // names could have embedded spaces SumOfSalaries // which were
ignored
• Case sensitivity
– Disadvantage: readability (names that look alike are different)
• worse in C++ and Java because predefined names are mixed case (e.g.
IndexOutOfBoundsException)
• In C, however, exclusive use of lowercase for names.
– C, C++, and Java names are case sensitive rose, Rose, ROSE are distinct names “What
about Readability”
20
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Special words
• An aid to readability; used to delimit or separate statement clauses
• A keyword is a word that is special only in certain contexts.
• Ex: Fortran
• Disadvantage: poor readability. Compilers and users must recognize the difference.
• A reserved word is a special word that cannot be used as a user-defined name.
• As a language design choice, reserved words are better than keywords.
• Ex: In Fortran, one could have the statements
Integer Real // keyword “Integer” and variable “Real” Real Integer// keyword “Real” and
variable “Integer”
Variables
• A variable is an abstraction of a memory cell(s).
• Variables can be characterized as a sextuple of attributes:
• Name
• Address
• Value
• Type
• Lifetime
• Scope
Name
- Not all variables have names: Anonymous, heap-dynamic variables
Address
• The memory address with which it is associated
• A variable name may have different addresses at different places and at different times
during execution.
// sum in sub1 and sub2
• A variable may have different addresses at different times during execution. If a
subprogram has a local var that is allocated from the run time stack when the subprogram is
called, different calls may result in that var having different addresses.
// sum in sub1
• The address of a variable is sometimes called its l-value because that is what is required
when a variable appears in the left side of an assignment statement.
Aliases
• If two variable names can be used to access the same memory location, they are called
aliases
• Aliases are created via pointers, reference variables, C and C++
unions.
• Aliases are harmful to readability (program readers must remember all of them)
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.
• For example, the int type in Java specifies a value range of -2147483648 to 2147483647,
and arithmetic operations for addition, subtraction, multiplication, division, and modulus.
Value
• The value of a variable is the contents of the memory cell or cells associated with the
variable.
21
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• Abstract memory cell - the physical cell or collection of cells associated with a variable.
• A variable’s value is sometimes called its r-value because that is what is required when a
variable appears in the right side of an assignment statement.
The Concept of Binding
• The l-value of a variable is its address.
• The r-value of a variable is its value.
• A binding is an association, such as between an attribute and an entity, or between
anoperation and a symbol.
• Binding time is the time at which a binding takes place.
• Possible binding times:
• Language design time: bind operator symbols to operations.
• For example, the asterisk symbol (*) is bound to the multiplication operation.
• Language implementation time:
• A data type such as int in C is bound to a range of possible values.
• Compile time: bind a variable to a particular data type at compile time.
• Load time: bind a variable to a memory cell (ex. C static variables)
• Runtime: bind a nonstatic local variable to a memory cell.
Type Bindings
• If static, the type may be specified by either an explicit or an implicit
declaration.
Variable Declarations
• An explicit declaration is a program statement used for declaring the types of variables.
• An implicit declaration is a default mechanism for specifying types of variables (the
firstappearance of the variable in the program.)
• Both explicit and implicit declarations create static bindings to types.
• FORTRAN, PL/I, BASIC, and Perl provide implicit declarations.
• EX:
– In Fortran, an identifier that appears in a program that is not explicitly declared is
implicitly declared according to the following convention:
I, J, K, L, M, or N or their lowercase versions is implicitly declared to be Integer type; otherwise,
it is implicitly declared as Real type.
– Advantage: writability.
– Disadvantage: reliability suffers because they prevent the compilation process
fromdetecting some typographical and programming errors.
– In Fortran, vars that are accidentally left undeclared are given default types and
unexpected attributes, which could cause subtle errors that, are difficult to diagnose.
• Less trouble with Perl: Names that begin with $ is a scalar, if a name begins with @ it is
an array, if it begins with %, it is a hash structure.
– In this scenario, the names @apple and %apple are unrelated.
• In C and C++, one must distinguish between declarations and definitions.
– Declarations specify types and other attributes but do no cause allocation of
storage.Provides the type of a var defined external to a function that is used in the function.
– Definitions specify attributes and cause storage allocation.
Dynamic Type Binding (JavaScript and PHP)
• Specified through an assignment statement
• Ex, JavaScript
list = [2, 4.33, 6, 8]; single-dimensioned array list = 47; scalar variable
22
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
– Disadvantages:
– High cost (dynamic type checking and interpretation)
• Dynamic type bindings must be implemented using pure interpreter not compilers.
• Pure interpretation typically takes at least ten times as long as to execute equivalent
machine code.
Type error detection by the compiler is difficult because any
variable can be assigned a value of any type.
• Incorrect types of right sides of assignments are not detected as errors; rather, the type
of the left side is simply changed to the incorrect type.
• Ex:
• i, x ➔ Integer
• y ➔ floating-point array
• i = x ➔ what the user meant to typei = y ➔ what the user
typed instead
• No error is detected by the compiler or run-time system. i is simply changed to a
floating-point array type. Hence, the result is erroneous. In a static type binding language, the
compiler would detect the error and the program would not get to execution.
Type Inference (ML, Miranda, and Haskell)
• Rather than by assignment statement, types are determined from the context of the
reference.
• Ex:
fun circumf(r) = 3.14159 * r * r;
The argument and functional value are inferred to be real.
fun times10(x) = 10 * x;
The argument and functional value are inferred to be int.
Storage Bindings & Lifetime
– Allocation - getting a cell from some pool of available cells.
– Deallocation - putting a cell back into the pool.
– The lifetime of a variable is the time during which it is bound to a particular memory
cell. So the lifetime of a var begins when it is bound to a specific cell and ends when it is
unbound from that cell.
– Categories of variables by lifetimes: static, stack-dynamic, explicit heap-dynamic, and
implicit heap-dynamic
Static Variables:
– 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.
– Advantages:
• Efficiency: (direct addressing): All addressing of static vars can be direct. No run-
timeoverhead is incurred for allocating and deallocating vars.
• History-sensitive: have vars retain their values between separate executions of the
subprogram.
Disadvantage:
• Storage cannot be shared among variables.
• Ex: if two large arrays are used by two subprograms, which are never active at the same
time, they cannot share the same storage for their arrays.
Stack-dynamic Variables:
– Storage bindings are created for variables when their declaration statements are
elaborated, but whose types are statically bound.
– Elaboration of such a declaration refers to the storage allocation and binding process
indicated by the declaration, which takes place when execution reaches the code to which the
declaration is attached.
23
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
– Ex:
• The variable declarations that appear at the beginning of a Java method are elaborated
when the method is invoked and the variables defined by those declarations are deallocated
when the method completes its execution.
– Stack-dynamic variables are allocated from the run-time stack.
– If scalar, all attributes except address are statically bound.
– Ex:
• Local variables in C subprograms and Java methods.
– Advantages:
• Allows recursion: each active copy of the recursive subprogram has its own version of
the local variables.
• In the absence of recursion it conserves storage b/c all subprograms share the same
memory space for their locals.
– Disadvantages:
• Overhead of allocation and deallocation.
• Subprograms cannot be history sensitive.
• Inefficient references (indirect addressing) is required b/c the place in the stack where a
particular var will reside can only be determined during execution.
– In Java, C++, and C#, variables defined in methods are by default
stack-dynamic.
Explicit Heap-dynamic Variables:
– Nameless memory cells that are allocated and deallocated by explicit directives “run-
time instructions”, specified by the programmer, which take effect during execution.
– These vars, which are allocated from and deallocated to the heap, can only be referenced
through pointers or reference variables.
– The heap is a collection of storage cells whose organization is highly disorganized b/c of
the unpredictability of its use.
– e.g. dynamic objects in C++ (via new and delete)
int *intnode;
intnode = new int; // allocates an int cell
delete intnode; // deallocates the cell to which
// intnode points
– An explicit heap-dynamic variable of int type is created by the new operator.
– This operator can be referenced through the pointer, intnode.
– The var is deallocated by the delete operator.
– Java, all data except the primitive scalars are objects.
– Java objects are explicitly heap-dynamic and are accessed through
reference variables.
– Java uses implicit garbage collection.
– Explicit heap-dynamic vars are used for dynamic structures, such as linked lists and
trees that need to grow and shrink during execution.
– Advantage:
– Provides for dynamic storage management.
– Disadvantage:
– Inefficient “Cost of allocation and deallocation” and unreliable “difficulty of using pointer
and reference variables correctly”
Implicit Heap-dynamic Variables:
– Bound to heap storage only when they are assigned value. Allocation and deallocation
caused by assignment statements.
– All their attributes are bound every time they are assigned.
– e.g. all variables in APL; all strings and arrays in Perl and JavaScript.
– Advantage:
– Flexibility allowing generic code to be written.
– Disadvantages:
24
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
25
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
o The search proceeds from the local procedure, Sub1, to its caller,
Sub2, where a declaration of X is found.
Note that if static scoping was used, in either calling sequence the reference to X in Sub1
would be to Big’s X.
Scope and Lifetime
Ex:
void printheader()
{
…
} /* end of printheader */
void compute()
{
int sum;
… printheader();
} /* end of compute */
The scope of sum in contained within compute.
The lifetime of sum extends over the time during which printheader executes.
Whatever storage location sum is bound to before the call to printheader, that binding
will continue during and after the execution of printheader.
Referencing environment
It is the collection of all names that are visible in the statement.
• In a static-scoped language, it is the local variables plus all of the visible variables in all
of the enclosing scopes.
• The referencing environment of a statement is needed while that statement is being
compiled, so code and data structures can be created to allow references to non-local vars in
both static and dynamic scoped languages.
• 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.
Ex, Ada, static-scoped languageprocedure Example is A, B : Integer;
procedure Sub1 isA, B : Integer;
…
procedure Sub1 is
X, Y : Integer;
begin -- of Sub1
… 1
end -- of Sub1
procedure Sub2 is
X : Integer;
…
procedure Sub3 is
X : Integer;
begin -- of Sub3
… 2
end; -- of Sub3
begin -- of Sub2
… 3
end; { Sub2}
begin
… 4
end; {Example}
27
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
28
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Enumeration Types
• All possible values, which are named constants, are provided in the definition
• C# example
enum days {mon, tue, wed, thu, fri, sat, sun};
• Design issues
– Is an enumeration constant allowed to appear in more than one type definition, and if
so, how is the type of an occurrence of that constant checked?
– Are enumeration values coerced to integer?
– Any other type coerced to an enumeration type?
Subrange Types
• An ordered contiguous subsequence of an ordinal type
– Example: 12..18 is a subrange of integer type
• Ada‘s design
type Days is (mon, tue, wed, thu, fri, sat, sun); subtype Weekdays is Days range mon..fri; subtype
Index is Integer range 1..100;
Subrange Evaluation
• Aid to readability
– Make it clear to the readers that variables of subrange can store only certain range of
values
• Reliability
– Assigning a value to a subrange variable that is outside the specified range is detected as
an error
Implementation
• Enumeration types are implemented as integers
• Subrange types are implemented like the parent types with code inserted (by the
compiler) to restrict assignments to subrange variables
Array Types
• An array is an aggregate of homogeneous data elements in which an individual element
is identified by its position in the aggregate, relative to the first element.
Array Design Issues
• What types are legal for subscripts?
• Are subscripting expressions in element references range checked?
• When are subscript ranges bound?
• When does allocation take place?
• What is the maximum number of subscripts?
• Can array objects be initialized?
• Are any kind of slices supported?
Array Indexing
• Indexing (or subscripting) is a mapping from indices to elements
array_name (index_value_list) an element
• Index Syntax
– FORTRAN, PL/I, Ada use parentheses
• Ada explicitly uses parentheses to show uniformity between array references and
function calls because both are mappings
– Most other languages use brackets
Arrays Index (Subscript) Types
• FORTRAN, C: integer only
• Ada: integer or enumeration (includes Boolean and char)
• Java: integer types only
• Index range checking
– C, C++, Perl, and Fortran do not specify range checking
– Java, ML, C# specify range checking
– In Ada, the default is to require range checking, but it can be turned off
Subscript Binding and Array Categories
• Static: subscript ranges are statically bound and storage allocation is static (before run-
31
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
time)
– Advantage: efficiency (no dynamic allocation)
• Fixed stack-dynamic: subscript ranges are statically bound, but the allocation is done at
declaration time
– Advantage: space efficiency
• Stack-dynamic: subscript ranges are dynamically bound and the storage
allocation is dynamic (done at run-time)
– Advantage: flexibility (the size of an array need not be known until the array is to be
used)
• Fixed heap-dynamic: similar to fixed stack-dynamic: storage binding is dynamic but
fixed after allocation (i.e., binding is done when requested and storage is allocated from heap,
not stack)
• Heap-dynamic: binding of subscript ranges and storage allocation is dynamic and can
change any number of times
– Advantage: flexibility (arrays can grow or shrink during program execution)
• C and C++ arrays that include static modifier are static
• C and C++ arrays without static modifier are fixed stack-dynamic
• C and C++ provide fixed heap-dynamic arrays
• C# includes a second array class ArrayList that provides fixed heap-dynamic
• Perl, JavaScript, Python, and Ruby support heap-dynamic arrays
Array Initialization
• Some language allow initialization at the time of storage allocation
– C, C++, Java, C# example
int list [] = {4, 5, 7, 83}
– Character strings in C and C++
char name [] = “freddie”;
– Arrays of strings in C and C++
char *names [] = {“Bob”, “Jake”, “Joe”};
– Java initialization of String objects
String[] names = {“Bob”, “Jake”, “Joe”};
Heterogeneous Arrays
• A heterogeneous array is one in which the elements need not be of the same type
• Supported by Perl, Python, JavaScript, and Ruby
Arrays Operations
• APL provides the most powerful array processing operations for vectors and matrixes as
well as unary operators (for example, to reverse column elements)
• Ada allows array assignment but also catenation
• Python‘s array assignments, but they are only reference changes. Python also supports
array catenation and element membership operations
• Ruby also provides array catenation
• Fortran provides elemental operations because they are between pairs of array
elements
– For example, + operator between two arrays results in an array of the sums of the
element pairs of the two arrays
Rectangular and Jagged Arrays
• A rectangular array is a multi-dimensioned array in which all of the rows have the same
number of elements and all columns have the same number of elements
• A jagged matrix has rows with varying number of elements
– Possible when multi-dimensioned arrays actually appear as arrays of arrays
• C, C++, and Java support jagged arrays
• Fortran, Ada, and C# support rectangular arrays (C# also supports jagged arrays)
Slices
• A slice is some substructure of an array; nothing more than a referencing mechanism
32
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Slice Examples
– Fortran 95
Integer, Dimension (10) :: Vector Integer, Dimension (3, 3) :: Mat
Integer, Dimension (3, 3) :: Cube
Implementation of Arrays
• Access function maps subscript expressions to an address in the array
• Access function for single-dimensioned arrays:
address(list[k]) = address (list[lower_bound])+((k-lower_bound) * element_size)
Compile-Time Descriptors
33
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Associative Arrays
34
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Unions Types
• A union is a type whose variables are allowed to store different type values at different
times during execution
• Design issues
– Should type checking be required?
– Should unions be embedded in records?
37
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Pointer Assignment Illustration
Variable-Size Cells
• All the difficulties of single-size cells plus more
• Required by most programming languages
• If mark-sweep is used, additional problems occur
– The initial setting of the indicators of all cells in the heap is difficult
– The marking process in nontrivial
– Maintaining the list of available space is another source of overhead
39
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Type Compatibility
Summary
• The data types of a language are a large part of what determines that language‘s style
and usefulness
• The primitive data types of most imperative languages include numeric, character, and
Boolean types
• The user-defined enumeration and subrange types are convenient and add to the
readability and reliability of programs
• Arrays and records are included in most languages
• Pointers are used for addressing flexibility and to control dynamic storage management
• Case sensitivity and the relationship of names to special words represent design issues
of names
• Variables are characterized by the sextuples: name, address, value, type, lifetime, scope
• Binding is the association of attributes with program entities
• Scalar variables are categorized as: static, stack dynamic, explicit heap dynamic, implicit
heap dynamic
• Strong typing means detecting all type errors
Tuple
A tuple is a compound data type having a fixed number of terms. Each term in a tuple is known
as an element. The number of elements is the size of the tuple.
A tuple can have any number of items and they may be of different types (integer,
float, list,string, etc.)
Tuple. Tuples are used to store multiple items in a single variable. Tuple is one of 4 built-in data
types in Python used to store collections of data, the other 3 are List, Set, and Dictionary, all with
different qualities and usage. A tuple is a collection which is ordered and unchangeable.
In computer science, tuples come in many forms. Most typed functional programming languages
implement tuples directly as product types,[1] tightly associated with algebraic data types,
pattern matching, and destructuring assignment.[2] Many programming languages offer an
alternative to tuples, known as record types, featuring unordered elements accessed by label.[3]
A few programming languages combine ordered tuple product types and unordered record
types into a single construct, as in C structs and Haskell records. Relational databases may
formally identify their rows (records) as tuples.
41
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Advantages of Tuple
Tuples offer the following advantages −
• Tuples are fined size in nature i.e. we can’t add/delete elements to/from a tuple.
• We can search any element in a tuple.
• Tuples are faster than lists, because they have a constant set of values.
• Tuples can be used as dictionary keys, because they contain immutable values like
strings, numbers, etc.
List Types
• A list is a number of items in an ordered or unordered structure. A list can be used for a
number of things like storing items or deleting and adding items. But for the programmer to
perform the different tasks for the list, the program must have enough memory to keep up with
changes done to the list. List is the most versatile data type available in functional programming
languages used to store a collection of similar data items. The concept is similar to arrays in
object-oriented programming. List items can be written in a square bracket separated by
commas. The way to writing data into a list varies from language to language.
• There is different sort of lists which are linear list and linked list. Also, the list can be
referred to as an abstract data type.
• Linear List - A static abstract data type. The amount of data does not change at run time.
• Linked List - Dynamic Abstract Data Type. Uses pointers to vary memory used at run
time.
• List is not a data type in Java/C/C++, but we have alternative ways to create a list in Java,
i.e., by using ArrayList and LinkedList.
For example, in LISP, (A B C D)
Nested lists have the same form, so we could have (A (B C) D) is composed of 3 elements
In which A & D are atoms & (B C ) are sub-list
• OPERATIONS IN LIST ARE: add, remove/ delete, update, searching, sorting.
•
TYPE EQUIVALENCE
42
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
43
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
The operator precedence rules for expression evaluation define the order in which adjacent
operators of different precedence levels are evaluated.
Conditional Expressions
Conditional Expressions (ternary operator ?:) available in C-based languages. An example: (C,
C++)
average = (count == 0)? 0 : sum/count
Evaluates as if written like
if (count == 0)
average = 0
else
average = sum /count
Operand Evaluation
Order
Operand evaluation order as follows.
• Variables: fetch the value from memory.
• Constants: sometimes a fetch from memory; sometimes the constant is in the machine
language instruction.
• Parenthesized expressions: evaluate all operands and operators first.
• The most interesting case is when an operand is a function call.
Potentials for Side Effects Functional side effects: when a function changes a two-
wayparameter or a non-local variable
Problem with functional side effects: When a function referenced in an expression alters
another operand of the expression;
e.g., for a parameter change:
a = 10;
/* assume that fun changes its parameter */
b = a + fun(a);
Two possible solutions to the functional side effects problem: Write the language definition to
disallow functional side effects.
• No two-way parameters in functions
• No non-local references in functions
Advantage: it works!
Disadvantages: inflexibility of one-way parameters and lack of non-local references
– Write the language definition to demand that operand evaluation order be fixed.
44
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Overloaded Operators
Use of an operator for more than one purpose is called operator overloading.
• Some are common (e.g., + for int and float)
• Some are potential trouble (e.g., * in C and C++)
Problems:
• Loss of compiler error detection (omission of an operand should be a detectable error)
• Some loss of readability
• Can be avoided by introduction of new symbols (e.g., Pascal‘s div for integer division)
• C++, Ada, Fortran 95, and C# allow user-defined overloaded operators
Potential problems:
• Users can define nonsense operations.
• Readability may suffer, even when the operators make sense.
Type Conversions
A narrowing conversion is one that converts an object to a type that cannot include all of the
values of the original type.
e.g., float to int
A widening conversion is one in which an object is converted to a type that can include at least
approximations to all of the values of the original type.
e.g., int to float
Mixed Mode
A mixed-mode expression is one that has operands of different types A coercion is an implicit
type conversion
Disadvantage of coercions:
– They decrease in the type error detection ability of the compiler
• In most languages, all numeric types are coerced in expressions, using widening
conversions.
• In Ada, there are virtually no coercions in expressions Explicit Type Conversions called
as casting in C-based languages. Examples:-
C: (int)angle, Ada: Float (Sum)
– Note that Ada’s syntax is similar to that of function calls
Errors in Expressions causes
• Inherent limitations of arithmetic e.g., division by zero
• Limitations of computer arithmetic e.g., overflow
• Often ignored by the run-time system
Relational and Boolean Expressions
Relational Expressions:
• Use relational operators and operands of various types
• Evaluate to some Boolean representation
• Operator symbols used vary somewhat among languages (!=, /=, .NE., <>, #)
• JavaScript and PHP have two additional relational operator, === and !==
• Similar to their cousins, == and !=, except that they do not coerce their operands
Boolean Expressions:
Operands are Boolean and the result is Boolean Example operators
FORTRAN 77 FORTRAN 90 C Ada
.AND. and && and
.OR. or || or
.NOT. not ! not
xor --- --- ----
45
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• No Boolean Type in C
• C89 has no Boolean type--it uses int type with 0 for false and nonzero for true
• One odd characteristic of C‘s expressions: a<b<c is a legal expression, but the result is
not what you might expect:
• Left operator is evaluated, producing 0 or 1
• The evaluation result is then compared with the third operand (i.e., c)
Assignment as an Expression
In C, C++, and Java, the assignment statement produces a result and can be used as operands.
while ((ch = getchar())!= EOF){…}
ch = getchar() is carried out; the result (assigned to ch) is used as a conditional value for the
while statement
List Assignments
Perl and Ruby support list assignments
46
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Mixed-Mode Assignment
Assignment statements can also be mixed-mode, for example
int a, b; float c;
c = a / b;
– In Fortran, C, and C++, any numeric type value can be assigned to any numeric type
variable.
– In Java, only widening assignment coercions are done.
– In Ada, there is no assignment coercion.
2.9 Control Structures - CO3
A control structure is a control statement and the statements whose execution it controls.
Levels of Control Flow
• Within expressions
• Among program units
• Among program statements
if x > y :
x=y
print "case 1"
Nesting Selectors:Java example
if (sum == 0) if (count == 0) result = 0;
else result = 1;
47
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• default clause is for unrepresented values (if there is no default, the whole
statementdoes nothing)
• C#
– Differs from C in that it has a static semantics rule that disallows the implicit execution
of more than one segment
– Each selectable segment must end with an unconditional branch (goto or break)
• Ada
case expression is
when choice list => stmt_sequence;
…
when choice list => stmt_sequence; when others => stmt_sequence;] end case;
More reliable than C‘s switch (once a stmt_sequence execution is completed, control is passed to
the first statement after the case statement
• Ada design choices:
1. Expression can be any ordinal type
2. Segments can be single or compound
48
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Iterative Statements
• The repeated execution of a statement or compound statement is accomplished either
by iteration or recursion
• General design issues for iteration control statements:
1. How is iteration controlled?
2. Where is the control mechanism in the loop?
Counter-Controlled Loops
A counting iterative statement has a loop variable, and a means of specifying the initial and
terminal, and stepsize values
Design Issues:
• What are the type and scope of the loop variable?
• What is the value of the loop variable at loop termination?
• Should it be legal for the loop variable or loop parameters to be changed in the loop
body, and if so, does the change affect loop control?
• Should the loop parameters be evaluated only once, or once for every iteration?
Iterative Statements: Examples
FORTRAN 95 syntax
DO label var = start, finish [, stepsize] Stepsize can be any value but zero Parameters can be
expressions
Design choices:
1. Loop variable must be INTEGER
2. Loop variable always has its last value
3. The loop variable cannot be changed in the loop, but the parameters can; because they
are evaluated only once, it does not affect loop control
4. Loop parameters are evaluated only once
• FORTRAN 95 : a second form:
[name:] Do variable = initial, terminal [,stepsize]
…
End Do [name]
– Cannot branch into either of Fortran‘s Do statements
• Ada
for var in [reverse] discrete_range loop ... end loop
• Design choices:
– Type of the loop variable is that of the discrete range (A discrete range is a sub-range of
an integer or enumeration type).
– Loop variable does not exist outside the loop
– The loop variable cannot be changed in the loop, but the discrete range can; it does not
49
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Guarded Commands
• Designed by Dijkstra
• Purpose: to support a new programming methodology that
supported verification (correctness) during development
• Basis for two linguistic mechanisms for concurrent programming (in CSP and Ada)
• Basic Idea: if the order of evaluation is not important, the program should not specify
one
Selection Guarded Command
• Form
if <Boolean exp> -> <statement> [] <Boolean exp> -> <statement>
...
[] <Boolean exp> -> <statement> fi
Semantics: when construct is reached,
• Evaluate all Boolean expressions
• If more than one are true, choose one non-deterministically
• If none are true, it is a runtime error
Summary
• Expressions
51
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
52
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
UNIT-3
Subprograms and Blocks
Introduction
• Two fundamental abstraction facilities
– Process abstraction
• Emphasized from early days
– Data abstraction
• Emphasized in the1980s
53
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• C# methods can accept a variable number of parameters as long as they are of the same
type
• Suppose the spec is changed so that D must now access some data in B
• Solutions:
– Put D in B (but then C can no longer call it and D cannot access A's variables)
– 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
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
Scope Example
MAIN
- declaration of x SUB1
- declaration of x -
...
call SUB2
... SUB2
...
- reference to x -
...
...
call SUB1
…
• Static scoping
– Reference to x is to MAIN's x
• Dynamic scoping
– Reference to x is to SUB1's x
• Evaluation of Dynamic Scoping:
– Advantage: convenience
– Disadvantage: poor readability
• Indirect addressing
• Subprograms cannot be history sensitive
• Local variables can be static
– More efficient (no indirection)
– No run-time overhead
55
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• The value of the actual parameter is used to initialize the corresponding formal
parameter
– Normally implemented by copying
– Can be implemented by transmitting an access path but not recommended (enforcing
write protection is not easy)
– When copies are used, additional storage is required
– Storage and copy operations can be costly
56
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Pass-by-Name (Inout Mode)
• By textual substitution
• Formals are bound to an access method at the time of the call, but actual binding to a
value or address takes place at the time of a reference or assignment
• Allows flexibility in late binding
Implementing Parameter-Passing
Methods
• In most language parameter communication takes place thru the run-time stack
• Pass-by-reference are the simplest to implement; only an address is placed in the stack
• A subtle but fatal error can occur with pass-by-reference and pass-by-value result: a
formal parameter corresponding to a constant can mistakenly be changed
Parameter Passing Methods of Major Languages
• Fortran
– Always used the inout semantics model
– Before Fortran 77: pass-by-reference
– Fortran 77 and later: scalar variables are often passed by value-result
• C
– Pass-by-value
– Pass-by-reference is achieved by using pointers as parameters
• C++
– A special pointer type called reference type for pass-by-reference
• Java
– All parameters are passed are passed by value
– Object parameters are passed by reference
• Ada
– Three semantics modes of parameter transmission: in, out, in out; in is the default mode
– Formal parameters declared out can be assigned but not referenced; those declared in
can be referenced but not assigned; in out parameters can be referenced and assigned
• C#
– Default method: pass-by-value
– Pass-by-reference is specified by preceding both a formal parameter and its actual
parameter with ref
• PHP: very similar to C#
• Perl: all actual parameters are implicitly placed in a predefined array named @_
Type Checking Parameters
• Considered very important for reliability
• FORTRAN 77 and original C: none
• Pascal, FORTRAN 90, Java, and Ada: it is always required
• Ada
– Constrained arrays - like Pascal
– Unconstrained arrays - declared size is part of the object declaration
Multidimensional Arrays as Parameters: Fortran
• Formal parameter that are arrays have a declaration after the header
– For single-dimension arrays, the subscript is irrelevant
– For multi-dimensional arrays, the subscripts allow the storage-mapping function
Multidimensional Arrays as Parameters: Java and C#
• Similar to Ada
• Arrays are objects; they are all single-dimensioned, but the elements can be arrays
• Each array inherits a named constant (length in Java, Length in C#) that is set to the
length of the array when the array object is created
CLOSURES
• Closures (i.e., subroutine + non-local environment) are needed only when subroutines
can be nested
• Object-oriented languages without nested subroutines can use objects to implement a
form of closure
> a method plays the role of the subroutine
> instance variables provide the non-local environment
• Objects playing the role of a function + non-local environment are called object closures
or function objects
59
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Figure 5.2 Possible Execution Controls Figure 5.3 Possible Execution Controls
60
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
61
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
– The representation of the abstract type appears in a part of the specification called the
private part
• More restricted form with limited private types
– Private types have built-in operations for assignment and comparison
– Limited private types have NO built-in operations
• Reasons for the public/private spec package:
1. The compiler must be able to see the representation after seeing only the spec package
(it cannot see the private part)
2. Clients must see the type name, but not the representation (they also cannot see the
private part)
• Having part of the implementation details (the representation) in the spec package and
part (the method bodies) in the body package is not good
One solution: make all ADTs pointers
Problems with this:
1. Difficulties with pointers
2. Object comparisons
3. Control of object allocation is lost
An Example in Ada
package Stack_Pack is
type stack_type is limited
private;max_size:
constant := 100;
function empty(stk: in stack_type) return Boolean;
procedure push(stk: in out stack_type; elem:in
Integer);procedure pop(stk: in out stack_type);
function top(stk: in stack_type) return
Integer;private -- hidden from clients
type list_type is array (1..max_size)
of Integer;type stack_type is record
list: list_type;
62
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
63
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• Each instance of a class has its own copy of the class data members
• Instances can be static, stack dynamic, or heap dynamic
• Information Hiding
– Private clause for hidden entities
– Public clause for interface entities
– Protected clause for inheritance (Chapter 12)
• Constructors:
– Functions to initialize the data members of instances (they do not create the objects)
– May also allocate storage if part of the object is heap-dynamic
– Can include parameters to provide parameterization of the objects
– Implicitly called when an instance is created
– Can be explicitly called
Name is the same as the class name
• Destructors
– Functions to cleanup after an instance is destroyed; usually just to reclaim heap
storage
– Implicitly called when the object‘s lifetime ends
– Can be explicitly called
– Name is the class name, preceded by a tilde (~) An Example in C++
class stack {
private:
int *stackPtr, maxLen, topPtr; public:
stack() { // a constructor stackPtr = new int [100]; maxLen = 99;
topPtr = -1;
};
~stack () {delete [] stackPtr;}; void push (int num) {…}; void pop () {…};
int top () {…};
int empty () {…};
}
Evaluation of ADTs in C++ and Ada
• C++ support for ADTs is similar to expressive power of Ada
• Both provide effective mechanisms for encapsulation and information hiding
• Ada packages are more general encapsulations; classes are types
• Friend functions or classes - to provide access to private members to some unrelated
units or functions
– Necessary in C++
Language Examples:
Java
• Similar to C++, except:
– All user-defined types are classes
– All objects are allocated from the heap and accessed through reference variables
– Individual entities in classes have access control modifiers (private or public), rather
than clauses
– Java has a second scoping mechanism, package scope, which can be used in place of
friends
• All entities in all classes in a package that do not have access control modifiers are
visible throughout the package
An Example in Java
class StackClass { private:
private int [] *stackRef;
private int [] maxLen, topIndex; public StackClass() { // a constructor
stackRef = new int [100]; maxLen = 99;
topPtr = -1;
};
64
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
public void push (int num) {…}; public void pop () {…};
public int top () {…};
public boolean empty () {…};
}
Language Examples: C#
• Based on C++ and Java
• Adds two access modifiers, internal and protected internal
• All class instances are heap dynamic
• Default constructors are available for all classes
• Garbage collection is used for most heap objects, so destructors are rarely used
• structs are lightweight classes that do not support inheritance
• Common solution to need for access to data members: accessor methods(getter and
setter)
• C# provides properties as a way of implementing getters and setters without requiring
explicit method calls
C# Property Example
public class Weather {
public int DegreeDays { //** DegreeDays is
a propertyget {return degreeDays;}
set {
if(value < 0 || value > 30)
Console.WriteLine("Value is out of range:
{0}", value); else degreeDays = value;}
}
private int degreeDays;
...
}
...
Weather w = new Weather();
int degreeDaysToday, oldDegreeDays;
...
w.DegreeDays = degreeDaysToday;
...
oldDegreeDays = w.DegreeDays;
3.12ENCAPSULATION CONSTRUCTS
INTRODUCTION TO
ENCAPSULATION
Encapsulation Encapsulation is the process of combining or packaging data with functions and
66
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
thereby The concept of abstraction brings forth another related term known as encapsulation.
Original motivation:
Large programs have two special needs:
Some means of organization, other than simply division into subprograms.
Some means of partial compilation (compilation units that are smaller than the whole program).
Obvious solution:
a grouping of subprograms that are logically related into a unit that can be separately compiled.
These are called encapsulations.
Examples of Encapsulation Mechanisms
Nested subprograms in some ALGOL-like languages (e.g., Pascal).
67
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
3.13Naming Encapsulation
• Naming encapsulations define name scopes that assist in avoiding these name conflicts.
• Naming encapsulations are logical encapsulations, in the sense that they need not be
contiguous.
• Several different collections of code can be placed in the same namespace, even though
they are stored in different places.
The subprogram call and return operations of a language are together called its subprogram
linkage
A subprogram call has numerous actions associated with it.
Parameter passing methods Static local variables Execution status of calling program Transfer
of control Subprogram nesting.
68
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Call Semantics
Save the execution status of the caller Carry out the parameter-passing process Pass the return
address to the callee Transfer control to the callee
69
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
70
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
71
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
72
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
73
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
74
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Nested Subprograms
• Some non-C-based static-scoped languages
(e. g. , Fortran 95, Ada, Java. Script) use stack-dynamic local variables and allow subprograms to
be nested
• All variables that can be non-locally accessed reside in some activation record instance in the
stack
• The process of locating a non-local reference:
1. Find the correct activation record instance
2. Determine the correct offset within that activation record instance
Locating a Non-local Reference
• Finding the offset is easy
• Finding the correct activation record instance
– Static semantic rules guarantee that all nonlocal variables that can be referenced have been
allocated in some activation record instance that is on the stack when the reference is made
Static Scoping
• A static chain is a chain of static links that connects certain activation record instances
75
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• The static link in an activation record instance for subprogram A points to one of the
activation record instances of A's static parent
• The static chain from an activation record instance connects it to all of its static ancestors
• Stack Contents at Position 1
Dynamic Links; MAIN_2 calls
BIGSUB calls
SUB 2 calls
SUB 3 calls SUB 1
Static Links:
SUB 1 static parent:
BIGSUB 2 static parent:
BIGSUB 3 static parent: SUB 2
Displays
• An alternative to static chains
• Static links are stored in a single array called a display
• The contents of the display at any given time is a list of addresses of the accessible activation
record instances
76
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Blocks
• Blocks are user-specified local scopes for variables
• The lifetime of temp in the above example begins when control enters the block
• An advantage of using a local variable like temp is that it cannot interfere with any other
variable with the same name
Implementing Blocks
Two Methods:
1. Treat blocks as parameter-less subprograms that are always called from the same location –
Every block has an activation record; an instance is created every time the block is executed
2. Since the maximum storage required for a block can be statically determined, this amount of
space can be allocated after the local variables in the activation record
Implementing Dynamic Scoping
• Deep Access: non-local references are found by searching the activation record instances on
the dynamic chain
• Shallow Access: put locals in a central place
– One stack for each variable name
– Central table with an entry for each variable name
Scoping
SUMMARY
• Subprogram linkage semantics requires many action by the implementation
• Simple subprograms have relatively basic actions
• Stack-dynamic languages are more complex
• Subprograms with stack-dynamic local variables and nested subprograms have two
components – actual code – activation record
• Activation record instances contain formal parameters and local variables among other things
• Static chains are the primary method of implementing accesses to non-local variables in static-
scoped languages with nested subprograms
• Access to non-local variables in dynamic-scoped languages can be implemented by use of the
dynamic chain or thru some central variable table method
77
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
UNIT - 4
4.1 Concurrency
• Concurrency can occur at four levels:
– Machine instruction level
– High-level language statement level
– Unit level
– Program level
• Because there are no language issues in instruction- and program-level concurrency,
they are not addressed here
Multiprocessor Architectures
• Late 1950s - one general-purpose processor and one or more special purpose
processors for input and output operations
• Early 1960s - multiple complete processors, used for program-level concurrency
• Mid-1960s - multiple partial processors, used for instruction-level concurrency
• Single-Instruction Multiple-Data (SIMD) machines
• Multiple-Instruction Multiple-Data (MIMD) machines
– Independent processors that can be synchronized (unit-level concurrency)
Categories of Concurrency
• A thread of control in a program is the sequence of program points reached as control
flows through the program
• Categories of Concurrency:
– Physical concurrency - Multiple independent processors (multiple threads of control)
– Logical concurrency - The appearance of physical concurrency is presented by time-
sharing one processor (software can be designed as if there were multiple threads of control)
• Coroutines (quasi-concurrency) have a single thread of control
Motivations for Studying Concurrency
• Involves a different way of designing software that can be very useful— many real-
world situations involve concurrency
• Multiprocessor computers capable of physical concurrency are now widely used
Subprogram-Level Concurrency
• A task or process is a program unit that can be in concurrent execution with other
program units
• Tasks differ from ordinary subprograms in that:
– A task may be implicitly started
– When a program unit starts the execution of a task, it is not necessarily suspended
– When a task‘s execution is completed, control may not return to the caller
• Tasks usually work together
Two General Categories of Tasks
• Heavyweight tasks execute in their own address space
• Lightweight tasks all run in the same address space
• A task is disjoint if it does not communicate with or affect the execution of any other
task in the program in any way
Task Synchronization
• A mechanism that controls the order in which tasks execute
• Two kinds of synchronization
– Cooperation synchronization
– Competition synchronization
• Task communication is necessary for synchronization, provided by:
– Shared nonlocal variables
78
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
– Parameters
Message passing
Kinds of
synchronization
• Cooperation: Task A must wait for task B to complete some specific activity before task
A can continue its execution, e.g., the producer-consumer problemCompetition: Two or more
tasks must use some resource that cannot be simultaneously used, e.g., a shared counter
– Competition is usually provided by mutually exclusive access (approaches are discussed
later)
Scheduler
79
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• Semaphores can be used to implement guards on the code that accesses shared data
structures
• Semaphores have only two operations, wait and release (originally called P and
V by Dijkstra)
• Semaphores can be used to provide both competition and
cooperation synchronization
Cooperation Synchronization with Semaphores
• Example: A shared buffer
• The buffer is implemented as an ADT with the operations DEPOSIT and FETCH as the
only ways to access the buffer
• Use two semaphores for cooperation: emptyspots and fullspots
• The semaphore counters are used to store the numbers of empty spots and full spots in
the buffer
• DEPOSIT must first check emptyspots to see if there is room in the buffer
• If there is room, the counter of emptyspots is decremented and the value is inserted
• If there is no room, the caller is stored in the queue of emptyspots
• When DEPOSIT is finished, it must increment the counter of fullspots
• FETCH must first check fullspots to see if there is a value
– If there is a full spot, the counter of fullspots is decremented and the value is removed
– If there are no values in the buffer, the caller must be placed in the queue of fullspots
– When FETCH is finished, it increments the counter of emptyspots
• The operations of FETCH and DEPOSIT on the semaphores are accomplished through
two semaphore operations named wait and release
Semaphores: Wait Operation
wait(aSemaphore)
if aSemaphore‘s counter > 0
then decrement
aSemaphore‘s
counter
else
put the caller in
aSemaphore‘s queue attempt
to transfer control to a ready
task
-- if the task ready queue is empty,
-- deadlock occurs
end
Semaphores: Release Operation
release(aSemaphor
e)
if aSemaphore‘s queue is empty then increment aSemaphore‘s counter
else
put the calling task in the task ready queue transfer control
to a task from aSemaphore‘s queue
end
put the calling task in the task ready queue transfer control to a task from aSemaphore‘s queue
80
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
wait (emptyspots); {wait for space}
DEPOSIT(VALUE);
release(fullspots); {increase filled}
end loop;
end producer;
81
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Monitors
• Ada, Java, C#
• The idea: encapsulate the shared data and its operations to restrict access
• A monitor is an abstract data type for shared data
Competition Synchronization
• Shared data is resident in the monitor (rather than in the client units)
• All access resident in the monitor
– Monitor implementation guarantee synchronized access by allowing only one access at a
time
82
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
– Calls to monitor procedures are implicitly queued if the monitor is busy at the time
of the call
Cooperation Synchronization
• Cooperation between processes is still a programming task
– Programmer must guarantee that a shared buffer does not experience underflow or
overflow
83
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Evaluation of Monitors
• A better way to provide competition synchronization than are semaphores
• Semaphores can be used to implement monitors
• Monitors can be used to implement semaphores
• Support for cooperation synchronization is very similar as with semaphores, so it has
the same problems
Message Passing
• Message passing is a general model for concurrency
– It can model both semaphores and monitors
– It is not just for competition synchronization
• Central idea: task communication is like seeing a doctor--most of the time she waits for you or
you wait for her, but when you are both ready, you get together, or rendezvous
Message Passing Rendezvous
• To support concurrent tasks with message passing, a language needs:
– A mechanism to allow a task to indicate when it is willing to accept messages
– A way to remember who is waiting to have its message accepted and some
“fair” way of choosing the next message
• When a sender task‘s message is accepted by a receiver task, the actual message
transmission is called a rendezvous
end Entry_1;
end loop; end Task_Example;
Ada Message Passing Semantics
• The task executes to the top of the accept clause and waits for a message
• During execution of the accept clause, the sender is suspended
• accept parameters can transmit information in either or both directions
• Every accept clause has an associated queue to store waiting messages
end if;
Sleep;
end select;
end loop;
end Gas_S_A;
87
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Competition Synchronization with Message Passing
• Modeling mutually exclusive access to shared data
• Example--a shared buffer
• Encapsulate the buffer and its operations in a task
• Competition synchronization is implicit in the semantics of accept clauses
– Only one accept clause in a task can be active at any given time
Task Termination
• The execution of a task is completed if control has reached the end of its code body
• If a task has created no dependent tasks and is completed, it is terminated
• If a task has created dependent tasks and is completed, it is not terminated until all its
dependent tasks are terminated
The terminate Clause
• A terminate clause in a select is just a terminate statement
• A terminate clause is selected when no accept clause is open
• When a terminate is selected in a task, the task is terminated only when its master and all of
the dependents of its master are either completed or are waiting at a terminate
• A block or subprogram is not left until all of its dependent tasks are terminated
Message Passing Priorities
• The priority of any task can be set with the pragma priority pragma Priority (expression);
• The priority of a task applies to it only when it is in the task ready queue
Binary Semaphores
88
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• For situations where the data to which access is to be controlled is NOT encapsulated in a task
task Binary_Semaphore is entry Wait;
entry release; end Binary_Semaphore;
task body Binary_Semaphore is begin
loop
accept Wait; accept Release; end loop;
end Binary_Semaphore;
Concurrency in Ada 95
• Ada 95 includes Ada 83 features for concurrency, plus two new features
– Protected objects: A more efficient way of implementing shared data to allow access to a
shared data structure to be done without rendezvous
– Asynchronous communication
Asynchronous Communication
• Provided through asynchronous select structures
• An asynchronous select has two triggering alternatives, an entry clause or a delay
– The entry clause is triggered when sent a message
– The delay clause is triggered when its time limit is reached
Java Threads
• The concurrent units in Java are methods named run
– A run method code can be in concurrent execution with other such methods
– The process in which the run methods execute is called a thread
Class myThread extends Thread{
public void run () {…}
}
…
Thread myTh = new MyThread (); myTh.start();
Thread Priorities
• A thread‘s default priority is the same as the thread that create it
89
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• The notify method is called to tell one waiting thread that the event it was waiting has
happened
• The notifyAll method awakens all of the threads on the object‘s wait list
C# Threads
• Loosely based on Java but there are significant differences
• Basic thread operations
– Any method can run in its own thread
– A thread is created by creating a Thread object
– Creating a thread does not start its concurrent execution; it must be requested through
the Start method
– A thread can be made to wait for another thread to finish with Join
– A thread can be suspended with Sleep
– A thread can be terminated with Abort
Synchronizing Threads
• Three ways to synchronize C# threads
– The Interlocked class
• Used when the only operations that need to be synchronized are incrementing or
decrementing of an integer
– The lock statement
• Used to mark a critical section of code in a thread lock (expression) {… }
– The Monitor class
• Provides four methods that can be used to provide
more sophisticated synchronization
C#’s Concurrency Evaluation
• An advance over Java threads, e.g., any method can run its own thread
90
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Statement-Level Concurrency
• Objective: Provide a mechanism that the programmer can use to inform compiler of
ways it can map the program onto multiprocessor architecture
• Minimize communication among processors and the memories of the other processors
High-Performance Fortran
• A collection of extensions that allow the programmer to provide information to the
compiler to help it optimize code for multiprocessor computers
• Specify the number of processors, the distribution of data over the memories of those
processors, and the alignment of data
Primary HPF Specifications
• Number of processors
!HPF$ PROCESSORS procs (n)
• Distribution of data
!HPF$ DISTRIBUTE (kind) ONTO procs :: identifier_list
– kind can be BLOCK (distribute data to processors in blocks) or CYCLIC (distribute data to
processors one element at a time)
Categories of Concurrency:
It involves a new way of designing software that can be very useful--many real-world
situation involve concurrency
Def: Ataskis a program unit that can be in concurrent execution with other program units
When a program unit starts the execution of a task, it is not necessarily suspended
When a task’s execution is completed, control may not return to the caller
Def: A task isdisjointif it does not communicate with or affect the execution of any other task
intheprogram in any way Task communication is necessary for synchronization
92
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Design Issues
• How are user-defined exceptions specified?
• Should there be default exception handlers for programs that do not provide their
own?
• Can built-in exceptions be explicitly raised?
• Are hardware-detectable errors treated as exceptions that can be handled?
• Are there any built-in exceptions?
• How can exceptions be disabled, if at all?
• How and where exception handlers specified and what are their scope?
• How is an exception occurrence bound to an exception handler?
• Can information about the exception be passed to the handler?
• Where does execution continue, if at all, after an exception handler completes its
execution? (continuation vs. resumption)
• Is some form of finalization provided?
Throwing Exceptions
• Exceptions are all raised explicitly by the statement: throw [expression];
• The brackets are metasymbols
• A throw without an operand can only appear in a handler; when it appears, it simply re-
raises the exception, which is then handled elsewhere
• The type of the expression disambiguates the intended handler
Unhandled Exceptions
• An unhandled exception is propagated to the caller of the function in which it is raised
• This propagation continues to the main function
Continuation
• After a handler completes its execution, control flows to the first statement after the last
handler in the sequence of handlers of which it is an element
• Other design choices
• To ensure that all exceptions are caught, a handler can be included in any try construct
that catches all exceptions
– Simply use an Exception class parameter
– Of course, it must be the last in the try construct
Checked and Unchecked Exceptions
• The Java throws clause is quite different from the throw clause of C++
• Exceptions of class Error and RunTimeException and all of their descendants are called
unchecked exceptions; all other exceptions are called checked exceptions
• Checked exceptions that may be thrown by a method must be either:
– Listed in the throws clause, or
– Handled in the method
An event is a notification that something specific has occurred, such as a mouse click on a
graphical button The event handler is a segment of code that is executed in response to an event
Java Swing GUI Components Text box is an object of class JTextField Radio button is an object of
class JRadioButton Applet’s display is a frame, a multilayered structure Content pane is one
layer, where applets put output GUI components can be placed in a frame Layout manager
objects are used to control the placement of components
The Java Event Model User interactions with GUI components create events that can be caught
by event handlers, called event listeners An event generator tells a listener of an event by
sending a message An interface is used to make event- handling methods conform to a standard
protocol A class that implements a listener must implement an interface for the listener
One class of events is ItemEvent, which is associated with the event of clicking a checkbox, a
radio button, or a list item The ItemListener interface prescribes a method, itemStateChanged,
which is a handler for ItemEvent events The listener is created with addItemListener
Components are positioned by assigning a new Point object to the Location property of the
component private RadioButton plain = new RadioButton(); plain.Location = new Point(100,
300); plain.Text = ″Plain″; controls.Add(plain);
All C# event handlers have the same protocol, the return type is void and the two parameters
are of types object and EventArgs
An event handler can have any name A radio button is tested with the Boolean Checked
property of the button private void rb_CheckedChanged (object o, EventArgs e) { if
(plain.Checked)....... }
To register an event, a new EventHandler object must be created and added to the predefined
delegate for the event
When a radio button changes from unchecked to checked, the CheckedChanged event is raised
If the handler was named rb_CheckedChanged, we could register it on the radio button named
plain with: plain. CheckedChanged += new EventHandler (rb_CheckedChanged);
SUMMARY
98
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
UNIT-5
Functional Programming Languages & Scripting Language
Mathematical Functions
• A mathematical function is a mapping of members of one set, called the domain set, to
another set, called the range set
• A lambda expression specifies the parameter(s) and the mapping of a function in the
following form
(x) x * x * x
for the function cube (x) = x * x * x
Lambda Expressions
• Lambda expressions describe nameless functions
• Lambda expressions are applied to parameter(s) by placing the parameter(s) after
the expression
e.g., ( (x) x * x * x)(2) which evaluates to 8
Functional Forms
• A higher-order function, or functional form, is one that either takes functions as
parameters or yields a function as its result, or both
Function Composition
• A functional form that takes two functions as parameters and yields a function whose
value is the first actual parameter function applied to the application of the second
Form: h f ° g
which means h(x)f(g(x))
For f (x) x + 2 and g (x) 3 * x, h f ° g yields (3 * x)+ 2
99
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Apply-to-all
• A functional form that takes a single function as a parameter and yields a list of values
obtained by applying the given function to each element of a list of parameters
Form:
For h (x) x * x
(h, (2, 3, 4)) yields (4, 9, 16)
5.2 Fundamentals of Functional Programming Languages- CO5
• The objective of the design of a FPL is to mimic mathematical functions to the greatest
extent possible
• The basic process of computation is fundamentally different in a FPL than in an
imperative language
In an imperative language, operations are done and the results are stored in
variablesfor later use
– Management of variables is a constant concern and source of complexity for imperative
programming
• In an FPL, variables are not necessary, as is the case in mathematics
Referential Transparency
• In an FPL, the evaluation of a function always produces the same result given the same
parameters
CO5
– Simple semantics
– Simple syntax
– Inefficient execution
– Programs can automatically be made concurrent
Pragmatics
A software system often consists of a number of subsystems controlled or connected by a script.
Scripting is a paradigm characterized by:
• Use of scripts to glue subsystems together.
• Rapid development and evolution of scripts.
• Modest efficiency requirements.
• Very high-level functionality in application-specific areas.
Key Concepts
The following concepts are characteristic of scripting languages:
• Very high-level string processing.
• Very high-level graphical user interface support.
• Dynamic typing.
• PYTHON supports break, continue, and return sequencers. It also supports exceptions,
which are objects of a subclass of Exception, and which can carry values.
• The following code computes the Greatest Common Divisor of two integers, m and n:
p, q = m, n
while p % q != 0:
p, q = q, p % q gcd = q
• Note the elegance of simultaneous assignment.
• Note also that indentation is required to indicate the extent of the loop body.
• The following code sums the numeric components of a list row, ignoring any
nonnumeric components:
sum = 0.0
for x in row:
if isinstance(x, (int, float)): sum += x
PYTHON Exceptions
• The following code prompts the user to enter a numeric literal, and stores the
corresponding real number in num:
while True:
try:
response = raw_input("Enter a numeric literal: ") num = float(response)
104
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
break
except ValueError:
print "Your response was ill-formed."
This while-command keeps prompting until the user enters a well-formed numeric literal. The
library procedure raw_input(...) displays the given prompt and returns the user’s response as a
string. The type conversion ‘‘float(response)’’ attempts to convert the response to a real
number. If this type conversion is possible, the following break sequencer terminates the loop. If
not, the type conversion throws a ValueError exception, control is transferred to the ValueError
exception handler, which displays a warning message, and finally the loop is iterated again.
Procedural Abstraction
• PYTHON supports function procedures and proper procedures.
• The only difference is that a function procedure returns a value, while a proper
procedure returns nothing.
• Since PYTHON is dynamically typed, a procedure definition states the name but not the
type of each formal parameter. The corresponding argument may be of different types on
different calls to the procedure.
PYTHON Procedures
• The following function procedure returns the greatest common divisor of its two
arguments:
def gcd (m, n):
p, q = m, n
while p % q != 0:
p, q = q, p % q
return q
Here p and q are local variables.
• The following proper procedure takes a date represented by a triple and prints that date
in ISO format (e.g., ‘‘2000-01-01’’):
def print_date (date):
y, m, d = date
if m = "Jan":
m=1
elif m = "Feb":
m=2
...
elif m = "Dec":
m = 12
print "%04d-%02d-%02d" % (y, m, d)
Here y, m, and d are local variables.
105
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
106
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
Data Abstraction
• PYTHON has three different constructs relevant to data abstraction: packages, modules,
and classes.
• Modules and classes support encapsulation, using a naming convention to distinguish
between public and private components.
• A package is simply a group of modules. A module is a group of components that may be
variables, procedures, and classes.
• These components may be imported for use by any other module. All components of
a module are public, except those whose identifiers start with ‘‘_’’ which are private.
• A class is a group of components that may be class variables, class methods, and instance
methods. A procedure defined in a class declaration acts as an instance method if its first formal
parameter is named self and refers to an object of the class being declared. Otherwise the
procedure acts as a class method.
• To achieve the effect of a constructor, we usually equip each class with an initialization
method named ‘‘ init ’’; this method is automatically called when an object of the class is
constructed. Instance variables are named using the usual ‘‘.’’ Notation (as in self.attr), and
they may be initialized by the initialization method or by any other method. All components
of a class are public, except those whose identifiers start with ‘‘ ’’, which are private.
PYTHON Class
• Consider the following class:
class Person:
def init (self, sname, fname,
gender, birth):self. surname =
sname
self. forename = fname
self. female = (gender == "F" or
gender == "f")self. birth = birth
def get_surname (self):
return self. surname
def change_surname
(self, sname):self.
surname = sname
def print_details (self):
print self. forename + " " + self. surname
107
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
• This class is equipped with an initialization method and three other instance methods,
each of which has a self parameter and perhaps some other parameters. In the following
code:
dw = Person("Watt", "David", "M", 1946)
the object construction on the right first creates an object of class Person; it then passes the
above arguments, together with a reference to the newly created object, to the initialization
method. The latter initializes the object’s instance variables, which are named surname,
forename, female, and birth (and thus are all private).
• PYTHON supports multiple inheritance: a class may designate any number of
superclasses. Ambiguous references to class components are resolved by searching the
superclasses in the order in which they are named in the class declaration.
• PYTHON’s support for object-oriented programming is developing but is not yet mature.
The use of the ‘‘ ’’ naming convention to indicate privacy is clumsy and error-prone; class
components are public by default. Still more seriously, variable components can be created
(and deleted) at any time, by any method and even by application code.
Separate Compilation
• PYTHON modules are compiled separately. Each module must explicitly import every
other module on which it depends. Each module’s source code is stored in a text file.
• For example, a module named widget is stored in a file named widget.py. When that
module is first imported, it is compiled and its object code is stored in a file named widget.pyc.
• Whenever the module is subsequently imported, it is recompiled only if the source code
has been edited in the meantime. Compilation is completely automatic.
• The PYTHON compiler does not reject code that refers to undeclared identifiers. Such
code simply fails if and when it is executed.
Module Library
• PYTHON is equipped with a very rich module library, which supports string handling,
markup, mathematics and cryptography, multimedia, GUIs, operating system services, Internet
services, compilation, and so on.
• Unlike older scripting languages, PYTHON does not have built-in high-level string
processing or GUI support. Instead, the PYTHON module library provides such functionality. For
example, the re library module provides powerful string matching facilities using regular
expressions.
• The pragmatic issues that influence the design of scripting languages: gluing, rapid
development and evolution, modest efficiency requirements, and very high-level functionality in
relevant areas.
• The concepts common to most scripting languages: very high-level support for string
processing, very high-level support for GUIs, and dynamic typing.
• The design of a major scripting language PYTHON, resembles a conventional
programming language, except that it is dynamically typed, and that it derives much of its
expressiveness from a rich module library.
108
Dept of CSE, NRCM M.Sowmya, Asst Professor
PROGRAMMING LANGUAGES (CS3112PE)
109
Dept of CSE, NRCM M.Sowmya, Asst Professor