690 likes | 863 Views
CSC 434 Programming Languages Fall 2001. Why Study P.L.’s?. Broader point of view Employability Pick appropriate P.L. for the job Design a new P.L. Use in implementing a P.L. Programming Paradigms. Imperative Functional Logic Object oriented Distributed / parallel.
E N D
Why Study P.L.’s? • Broader point of view • Employability • Pick appropriate P.L. for the job • Design a new P.L. • Use in implementing a P.L.
Programming Paradigms • Imperative • Functional • Logic • Object oriented • Distributed / parallel
Criteria for Evaluating Programming Languages • Expressive power • Simplicity and orthogonality • Implementation • Error detection and correction • Program correctness and standards
Expressive Power • Writability control structures data structures operators modularity • Readability syntax ! maintenance
Simplicity and Orthogonality • Levels of precedence (15 in C) • Not too many constructions, with all combinations valid and no special cases K++ ++K K += 1 K = K + 1
Implementation IssuesCost and Efficiency • Compiling 2 stages faster execution • Interpreting 1 stage slower execution
The Stages of Compiling Source program Lexical phase Tokens Syntax phase Parse tree Semantic phase Object program
Error Detection and Correction • Type checking • Pointer problems • Array subscripts out of range • Run-time exceptions …
Correctness and Standards • BASIC versus Ada for standards • Program structure • Formal proofs (predicate calculus) invariants pre-conditions and post-conditions
Evolution of P.L.’s (1 of 2) • Fortran – surprising success of 1st HLL • Algol 60 – reasons it did not succeed, but enormous influence, BNF • COBOL – data processing, influence of DOD • PL/1 – synthesis of Fortran and COBOL • Basic – original simplicity, time-sharing, lack of a standard
Evolution of P.L.’s (2 of 2) • Pascal – for teaching CS concepts, influence of strong typing • C – for systems programming, weak typing • Ada – influence of DOD, rigorous standard • Modula-2 – simpler alternative to Ada • Others – Lisp, Prolog, C++, Java, … See Appendix 1, pp. 329-345
Syntax and Semantics of P.L.’sBackus Normal Form (BNF) • Syntax versus semantics • BNF is a meta-language, first used for Algol 60 • A grammar G defines a language L(G) • The grammar G can be used: to generate a valid sentence in L(G) to recognize if a given sentence is valid according to the rules of G
Elements of BNF Syntax • Consists of rules, or productions • ::= means ‘is defined to be’ • | means ‘or’ • Identifiers within ‘< >’ are syntactic categories, or non-terminal symbols • Other symbols are terminal symbols that represent themselves literally
Example of a BNF Grammar <exp> ::= <exp> + <term> | <exp> - <term> | <term> <term> ::= <term> * <factor> | <term> / <factor> | <factor> <factor> ::= ( <exp> ) | <identifier>
Other Features of Syntax • Ambiguous grammars – the dangling else • EBNF uses [ ] for optional items and { } for zero or more repetitions <integer> ::= [+|-] <unsigned integer> <identifier> ::= <letter> { <letter> | <digit> } • Syntax diagrams a graphical form of EBNF
Semantics of P.L.’s – Harder! • Operational Semantics – uses a virtual machine • Denotational Semantics – manipulates mathematical objects • Axiomatic Semantics – uses predicate calculus to prove properties of program statements
Miscellaneous P.L. Syntax • Special words in a P.L. keywords – meaning varies with context reserved words – meaning is fixed • Use of blanks (Fortran example) • Comments /* … */ // … • Case sensitivity – why it might be avoided
Block Structure • Nested functions / procedures • Scope of variables (inside out) local variables non-local variables global variables • Storage categories (lifetime) static storage automatic storage dynamic storage
Bindings • Binding name to its declaration – scope • Binding declaration to its reference – lifetime • Binding reference to its value – assignment • When do bindings occur? compile time? load time? run time? • own variables in Algol 60, static in C • Finding value, given address is dereferencing
Static Scope and Dynamic Scope • In static scope a procedure is called in the environment of its definition – can be determined at compile time. • In dynamic scope a procedure is called in the environment of its caller – must be determined at run time. • Hazards of dynamic scope.
Static Scope and Dynamic Scope PROGRAM Dynamic (input, output); VAR x: integer; PROCEDURE a; BEGIN … write (x); … END; PROCEDURE b; VAR x: real; BEGIN … x := 2.0; … a; … END; BEGIN … x := 1; … b; … a; … END.
Binding the Type • Strong typing (static) is good – catch errors at compile time – Pascal, Ada • Implicit typing – e.g., first letter of variable name in Fortran, $ suffix in Basic, … • Type inferencing – type determined at run time, can change during execution – APL
Simple Data Types • Primitive Data Types (portability ??) boolean (not in C) integers reals complex (in Fortran) • Enumerated Types day = (Sun, Mon, Tues, Wed, Thurs, Fri, Sat); • Subrange Types work = Mon .. Fri;
Pointer Variables TYPE integerpt = ^integer; VAR p: integer; pipoint, another: integerpt; new (pipoint); pipoint^ := 17; another := pipoint; Another is now an alias for pipoint. If we deallocate using pipoint, the memory block is gone, but another still refers to it – a dangling reference – a severe source of runtime errors.
Data Structures • Arrays • Records • Sets • Strings • Dynamic – using pointers lists stacks queues trees graphs
Arrays • Index type and base type • Array storage allocation – the dope vector • Array sizes – static, semi-dynamic, dynamic • Cross-sections or slices • Equivalence structural equivalence name equivalence
Name/Structural Equivalence TYPE first = ARRAY [1..10] OF integer; second = ARRAY [1..10] OF integer; VAR a: first; b: second; c: ARRAY [1..10] OF integer; d,e: ARRAY [1..10] OF integer; f: first;
Records • Arrays use indexing – A[j,k] – homogeneous elements Records use qualification – R.field – heterogeneous fields • Arrays with records as elements Records with arrays as fields • Variant records – conserve memory a fixed part a tag field, or discriminant a variant part but variant part may not correspond to tag!
Records – An Example TYPE spouse = RECORD name: ARRAY [1..10] OF CHAR; age: INTEGER; END; employee = RECORD name: ARRAY [1..20] OF CHAR; bday: ARRAY [1..3] OF INTEGER; wage: real; status: char; spice = ARRAY [1..n] OF spouse; END;
Records – Another Example TYPE shape = (circle, triangle, rectangle); colors = (red, green, blue); figure = RECORD filled: boolean; color: colors; CASE form: shape OF circle: (diameter: real); triangle: (leftside: integer; riteside: integer; angle: real); rectangle: (side1: integer; side2: integer); END; VAR myfigure: figure;
Sets & Strings • Set representations the characteristic vector union / intersection via OR / AND • String representations terminal characters fixed-length strings varying-length strings count-delimited strings indexed list of strings linked list strings
Evaluating Expressions • Overloading of operators • Short circuit evaluation • Type conversions mixed mode arithmetic assignment coercion of parameters casts
Control Structures • Sequential Processing do A, then B, then C, … • Conditional Processing (branching or selection) if A is true, then do B, else do C • Iterative Processing (looping or repetition) while A is true, do B {and test A again} • Exceptions
Issues with Iteration • Is lcv a floating point variable? • Is lcv declared explicitly or implicitly? • What is value of lcv when loop terminates? • When is termination test done? • Can lcv be changed inside the loop? • Can the loop be exited from the middle?
Structuring Programs • Procedures, functions, subroutines, … • Formal versus actual parameters • Named parameters • Default parameters • Overloading of function names – signatures • Independent versus separate compilation
Parameter Passing • Principal methods call by value call by value-result call by reference call by name • Complications with aliasing
Parameter Passing VAR element: integer; a: ARRAY [1..2] OF integer; PROCEDURE whichmode (x: ? MODE integer) BEGIN a[1] := 6; element := 2; x := x + 3; END; BEGIN a[1] := 1; a[2] := 2; element := 1; whichmode (a[element]); …
Elements of OOP • Encapsulation – information hiding, as with ADT’s – modules, packages, classes, … • Inheritance • Polymorphism – as with overloading • Dynamic binding – method call can invoke different actual methods, determined at run time
Java Abstract Classes • An abstract method is one that has a header but no body, so cannot be implemented. • An abstract class is one in which one or more of the methods are abstract.
Java Interfaces • Multiple inheritance would be desirable, as provided in C++, but has significant problems. • Instead Java provides interfaces. An interface contains just constants and abstract methods. Since they are all abstract, they are not labeled as such. • A class can then inherit from a parent class, and also implement several interfaces. To do so, the class must provide bodies for each of the abstract methods in the interfaces.
Java Exceptions • Throwable objects include: • errors, from which there is no recovery • unchecked exceptions, such as for arithmetical errors, which need not be (but can be!) caught and dealt with • checked exceptions, which must be caught, even if no action is provided • Code that may cause one or more exceptions is placed in a try block. • Code for dealing with exceptions is placed in catch blocks.
Parallel Architectures • Single Instruction, Multiple Data (SIMD) • Multiple Instruction, Multiple Data (MIMD) via shared memory • Multiple Instruction, Multiple Data (MIMD) via message passing • Each of these must deal with the issue of coordinating the parallel activities.
Problems of Parallelism • Non-determinism • Deadlock • Starvation • Fairness • Termination • Load Balancing
Solving the Preceding Problems • Semaphores are low-level, using flags set by the user – easy to use improperly. • Monitors are procedures that take on all of the responsibility of assigning critical resources to other processes, in response to their requests. • Rendezvous is the use of message passing to coordinate the allocation of resources and tasks to be performed. • Both monitors and rendezvous were invented by Tony Hoare!
Java Threads (1 of 3) • Java provides concurrency, which may or not be true parallelism on multiple CPU’s, via threads. • Threads can be in several states: created, running, suspended, stopped, … • Once a thread is created, one must explicitly start it; it will then perform the functionality of its run method. • Threads can be created either by extending the thread class, or by implementing the runnable interface.
Java Threads (2 of 3) • Java restricts access by competing threads to critical regions of code via the synchronized reserved word. • When a method of a Java object is synchronized, the object becomes a monitor. • When an object is a monitor in Java, then when a thread T is using one of the monitor’s synchronized methods, no other thread can use any of the monitor’s synchronized methods until T relinquishes the monitor.
Java Threads (3 of 3) • Synchronization is still not adequate to coordinate the activities of threads. It just prevents threads from stepping on each other. • To provide coordination, one must use wait( ) and notify( ), as with the Producer-Consumer problem.
Dijkstra’s Guarded IF if expr1 -> stmt1 [ ] expr2 -> stmt2 [ ] … [ ] exprn -> stmtn fi
Dijkstra’s Guarded DO do expr1 -> stmt1 [ ] expr2 -> stmt2 [ ] … [ ] exprn -> stmtn od