Static and Dynamic Programming Structures: A Comprehensive Study
290 likes | 383 Vues
Explore the precise definitions and concepts of block-structured programming languages. Learn about scope rules and the impact on program behavior. Understand the use of variables, blocks, and scopes in program design and implementation.
Static and Dynamic Programming Structures: A Comprehensive Study
E N D
Presentation Transcript
Part IIProcedural, block structured, languages Procedural: • Function(*) as main programming construct • variables to denote values Block-structured: • Blocks to control visibility of variables (local definitions) (*)In this part, function is used for both function, procedure block structure
Main requirements: • Precisely defined, conceptually simple static structure for programs addressed by universally accepted scope rules • Static structure should provide good understanding of dynamic behavior addressed by correct use of scope in semantics & implementation Program structure should enable programmer to predict its behavior block structure
Contents: • Semi-formal description of static structure • The substitution model: operational semantics for asimple functional language • Introduction to type systems • Definitions, comparison of dynamic/static typing • A simple monomorphictype system – specification, type-checking, correctness • Extensions of the language with additional constructs recursion, cells with assignment, data structures,… including both semantics and types The environment model: an alternative operational semantics block structure
Block structure • Literals, identifiers, variables • Variable declarations, definitions, uses • Blocks, regions, scope • Common kinds of blocks block structure
Literals, identifiers & variables • literals: numbers, booleans, strings, … • identifiers --- used by programmers to name entities Two categories distinguished by syntax conventions Identifier name spaces : • Variables: denotevalues (numbers, booleans, cells, functions, lists, …) • Type names(simply: types) • Constructors (in ML) • . . . . . block structure
An identifier collision: when same identifier used for different purposes in a program Collisions between different name spaces – often resolved by position: type bing = Bing of int;; let bing= Bing(5);; (* a value of type bing *) But, within a space, rules must be used. We deal with variable space block structure
Variable declarations, definitions, uses Variableoccurrence: a variable in a specific position Occurrences divided into: • declaration -- introduces a variable often carries additional information: type,lifetime,… • use: an occurrence that is not a declaration • definition:occurrence in expression whose elaboration at run-time associates the variable with a value may be a use, or a declaration(most often the latter) block structure
Programming languages offer a variety of • declaration constructs • definition constructs These often group several declarations/definitions together block structure
Examples in C: int x; a declaration & (implicit) definition (why?) real foo(real x){, int z; … return x+y+z;} declares &defines foo, declares x, declares & defines z, uses x, y, z int goo(int x); (a function prototype) declares goo, x int goo(int x){return x+1;} given the declaration, a definition & a use of goo block structure
Scheme, OCAML: • (define foo (lambda (x) (+ x y))) declares & defines foo, declares x, uses x, y 2. (let ((x 3) (y (+ z 1))) (+ x z))(a definition construct) declares & defines x, y; uses x, z • let x = 5;; declares & defines x 4. let foo = function x x+1; declares & defines foo, declares x 5. let x = 4 and y = z+1 in x+z;; declares & defines x, y; uses x, z block structure
Block, region , scope Block: any program construct that restricts visibility of variables declared in it variable declared at most once in a block • Functions/procedures are abstractions restrict visibility of formal parameters are blocks • Other common blocks: let, let rec, let* (scheme), program, function body, compound statement (in some pl’s) block structure
A program may contain several declarations of variables with same name (in different blocks) – these are different variables • Blocks may be nested Q:To which variable (declaration) does a give use refer (is statically bound to)? block structure
Examples: int x; real y = 0.0; real foo(real x){int z; … return x+y+z;} (define foo (lambda (x) (+ x y))) The use of x is statically bound, that of y is free block structure
Q: Why is it important to associate uses with declarations? A: This defines their meaning, their run-time values • At run-time, declared variables are dynamically bound to values Each binding is associated with a declaration • Many bindings for a given identifier may exist • Static binding of a use to a declaration allows to select for it only the dynamic binding(s) associated with that declaration Static structure determines dynamic behavior block structure
zoo 5: zoo 5: zoo 5: Example: int n = 43; ………… int x = 3; int zoo(int n){if n =0 then return 1 else x+zoo(n-1) block structure
Terminology: d(x) – a declaration of x, u(x) – a use of x decl(u(x)) – the declaration to which u(x) is statically bound The rules that determine decl(u(x)): • Block specific rules • A universal rule block structure
Block specific: Each variable declared in a block has an associated region (ofvisibility)in the block ( a component of the block) Each block-kind has specific rules that determine the region for each variable declared in it block structure
Examples: 1. let x = E1 in E2;; the region of d(x) here is E2 2. let rec f = E1 in E2;; the region of d(f) here is both E1, E2 3. int x = 5; int y = x+5; the region of a declared variable in a C block : from after the declaration to end of block block structure
Blocks and regions may be nested Partial overlap not allowed hierarchies The important one: theregion hierarchy The universal rule: The scopeof a declaration of x: its region, excluding allnested regions of other declarations of x block structure
Region --- associated with block kinds Scope --- determines actual visibility in given program, based on actual nesting Region – איזור , scope – תחום The discipline is called static/lexical) scoping: תיחום סטטי Static--- determined by program structure block structure
Example: int n = 43; ………… int x = 3; int zoo(int n){if n =0 then return 1 else x+zoo(n-1) The region of 1st declaration of n: down to end of program Its scope: the function expression for zoo is excluded block structure
A bit more terminology: A declaration d(x) binds each u(x) in its scope ‘use bound todecl.’ --- a binary, functional relation A use u(x) is bound/free in a program phrase E: decl(u(x)) is/is not defined in E (two unary predicates) ( local, globalhave similar meanings) Variable x is free/bound in E, if it has a free/bound use in E (can have both) For all: add statically- block structure
Common kinds of blocks • Function • Non-recursive, (possibly) parallel(collateral) • Regions do not contain defining expressions • independent definitions • Sequential – definitions elaboratedone by one, • each may use previously defined variables • regions do not contain defining expressions • Recursive – the regions do contain the defining expressions Comment: In all kinds except function, each declaration may be viewed as a definition (possibly to null) block structure
region region dec dec (pseudo-code) (pseudo-code) Graphic illustration: P Non-recursive, parallel block: let x = 3, y = x + 5 in x + y Sequential block: let* x = 3, y = x + 5 in x + y (Scheme let*) block structure
A recursive block: let rec factorial = function n => if n=0 then 1 else n*factorial (n-1) in factorial 3 Another recursive block(mutual recursion) letrec even = function n if n = 0 then true else odd (n-1) and odd = function n if n=0 then false else even (n-1) in even 3;; block structure
Comment on recursion in C • Recursion of a single function – by default (in C) a recursive block • For mutual recursion – use a sequential block, separate declaration from definition int foo(int x); // function declaration … int goo(int y){…foo(y-1)…} int foo(int x){….goo(x+1)…} // function definition block structure
Every block is (up syntactic variation) one of the four kinds Example: for (int i = 1, i++, i<k){ …} This loop construct is a block Could separate the definition from the uses: {int t; (implicit definition) for (i=1…… } • It is convenient to make blocks of various constructs (here a loop) • But, they typically fall into one of the kinds above block structure
A sequential block may interleave defintions and expressions A sequential block can be converted to nested parallel blocks (let* ((x 3) (y (+ x 4)) (+ x y)) (let ((x 3)) (let ((Y (+ x 4)) (+ x y))) It can be ignored in general semantic discussion block structure
Conclusions: • Languages are very similar in terms of their block structure • It suffices to define semantics for a toy language with the three main kinds of blocks block structure