Control in Sequential Languages

Similar documents
CS 345. Exceptions. Vitaly Shmatikov. slide 1

Control in Sequential Languages

Scope, Functions, and Storage Management

INF 102 CONCEPTS OF PROG. LANGS FUNCTIONAL COMPOSITION. Instructors: James Jones Copyright Instructors.

INF 212 ANALYSIS OF PROG. LANGS FUNCTION COMPOSITION. Instructors: Crista Lopes Copyright Instructors.

CS 314 Principles of Programming Languages

Announcements. Scope, Function Calls and Storage Management. Block Structured Languages. Topics. Examples. Simplified Machine Model.

FP Foundations, Scheme

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

Functional Programming. Big Picture. Design of Programming Languages

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Functional Programming. Pure Functional Programming

CS 314 Principles of Programming Languages

Recursive Functions of Symbolic Expressions and Their Computation by Machine Part I

CS 360 Programming Languages Interpreters

Topic III. LISP : functions, recursion, and lists References: Chapter 3 of Concepts in programming languages by J. C. Mitchell. CUP, 2003.

Deferred operations. Continuations Structure and Interpretation of Computer Programs. Tail recursion in action.

Functional Programming

Test 1 Summer 2014 Multiple Choice. Write your answer to the LEFT of each problem. 5 points each 1. Preprocessor macros are associated with: A. C B.

INF 212 ANALYSIS OF PROG. LANGS ELEMENTS OF IMPERATIVE PROGRAMMING STYLE. Instructors: Crista Lopes Copyright Instructors.

Organization of Programming Languages CS3200/5200N. Lecture 11

Scheme. Functional Programming. Lambda Calculus. CSC 4101: Programming Languages 1. Textbook, Sections , 13.7

COP4020 Programming Assignment 1 - Spring 2011

Common LISP Tutorial 1 (Basic)

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

LECTURE 16. Functional Programming

Functional Programming. Pure Functional Languages

CS 242. Fundamentals. Reading: See last slide

Fundamentals of Artificial Intelligence COMP221: Functional Programming in Scheme (and LISP)

Functional Languages. Hwansoo Han

A Second Look At ML. Chapter Seven Modern Programming Languages, 2nd ed. 1

Iterators. Lecture 24: Iterators & Exceptions. Implementing Iterators. When Good Programs Go Bad! - where! Abstract over control structures (in Clu)!

Functional Programming. Pure Functional Languages

Principles of Programming Languages COMP251: Functional Programming in Scheme (and LISP)

11/6/17. Functional programming. FP Foundations, Scheme (2) LISP Data Types. LISP Data Types. LISP Data Types. Scheme. LISP: John McCarthy 1958 MIT

Notes on Higher Order Programming in Scheme. by Alexander Stepanov

Concepts Introduced in Chapter 7

CSE 413 Midterm, May 6, 2011 Sample Solution Page 1 of 8

CMSC 331 Final Exam Section 0201 December 18, 2000

SOFTWARE ARCHITECTURE 6. LISP

low and not larger than high. 18 points

Comp 311: Sample Midterm Examination

Computer Science 21b (Spring Term, 2015) Structure and Interpretation of Computer Programs. Lexical addressing

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler Front-End

The role of semantic analysis in a compiler

COMP80 Lambda Calculus Programming Languages Slides Courtesy of Prof. Sam Guyer Tufts University Computer Science History Big ideas Examples:

Summer 2017 Discussion 10: July 25, Introduction. 2 Primitives and Define

Introduction to LISP. York University Department of Computer Science and Engineering. York University- CSE V.

Heap storage. Dynamic allocation and stacks are generally incompatible.

Types and Type Inference

Principles of Programming Languages Topic: Functional Programming Professor L. Thorne McCarty Spring 2003

Racket. CSE341: Programming Languages Lecture 14 Introduction to Racket. Getting started. Racket vs. Scheme. Example.

Chapter 7 Control I Expressions and Statements

Imperative languages

Foundations. Yu Zhang. Acknowledgement: modified from Stanford CS242

Symbolic Programming. Dr. Zoran Duric () Symbolic Programming 1/ 89 August 28, / 89

CPS 506 Comparative Programming Languages. Programming Language Paradigm

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

Fall 2018 Discussion 8: October 24, 2018 Solutions. 1 Introduction. 2 Primitives

Principles of Programming Languages Topic: Scope and Memory Professor Louis Steinberg Fall 2004

Introduction to Functional Programming and basic Lisp

Lambda Calculus. Variables and Functions. cs3723 1

Programming Languages: Application and Interpretation

Continuations and Continuation-Passing Style

Compilers. Type checking. Yannis Smaragdakis, U. Athens (original slides by Sam

An Introduction to Scheme

Introduction to lambda calculus Part 3

CS 11 Haskell track: lecture 1

CSE413: Programming Languages and Implementation Racket structs Implementing languages with interpreters Implementing closures

CS 415 Midterm Exam Spring 2002

Intro. Scheme Basics. scm> 5 5. scm>

Chapter 11 :: Functional Languages

CS 415 Midterm Exam Spring SOLUTION

CS558 Programming Languages

Recursive Functions of Symbolic Expressions and Their Application, Part I

Lambda Calculus see notes on Lambda Calculus

CSC 533: Programming Languages. Spring 2015

CS 415 Midterm Exam Fall 2003

Introduction to Scheme

Functional Programming Lecture 1: Introduction

An Explicit-Continuation Metacircular Evaluator

Run-time Environments

Programming Languages Third Edition. Chapter 9 Control I Expressions and Statements

Chapter 15. Functional Programming Languages

Run-time Environments

Konzepte von Programmiersprachen

More Scheme CS 331. Quiz. 4. What is the length of the list (()()()())? Which element does (car (cdr (x y z))) extract from the list?

Programming Languages

CS 275 Name Final Exam Solutions December 16, 2016

The results for a few specific cases below are indicated. allequal ([1,1,1,1]) should return true allequal ([1,1,2,1]) should return false

Lecture 8: Recursion and Iteration. Exceptions. Declarative Programming.

References and Exceptions. CS 565 Lecture 14 4/1/08

Homework 5. Notes. Turn-In Instructions. Reading. Problems. Handout 19 CSCI 334: Spring (Required) Read Mitchell, Chapters 6 and 7.

Typical Runtime Layout. Tiger Runtime Environments. Example: Nested Functions. Activation Trees. code. Memory Layout

First-class continuations. call/cc, stack-passing CEK machines

Outline. Programming Languages 1/16/18 PROGRAMMING LANGUAGE FOUNDATIONS AND HISTORY. Current

cs242 Kathleen Fisher Reading: Concepts in Programming Languages, Chapter 6 Thanks to John Mitchell for some of these slides.

Programming Language Pragmatics

Symbolic Computation and Common Lisp

Transcription:

CS 242 2012 Control in Sequential Languages Reading: Chapter 8, Sections 8.1 8.3 (only) Section 7.3 of The Haskell 98 Report, Exception Handling in the I/O Monad, http://www.haskell.org/onlinelibrary/io-13.html (short) Chapter 3, Sections 3.3, 3.4.2, 3.4.3, 3.4.5, 3.4.8 (only)

Topics Structured Programming Go to considered harmful Exceptions structured jumps that may return a value dynamic scoping of exception handler Continuations Function representing the rest of the program Generalized form of tail recursion Heap memory management What is garbage? Standard ways of managing heap memory

Fortran Control Structure 10 IF (X.GT. 0.000001) GO TO 20 11 X = -X IF (X.LT. 0.000001) GO TO 50 20 IF (X*Y.LT. 0.00001) GO TO 30 X = X-Y-Y 30 X = X+Y... 50 CONTINUE X = A Y = B-A GO TO 11 Similar structure may occur in assembly code

Historical Debate Dijkstra, Go To Statement Considered Harmful Letter to Editor, C ACM, March 1968 Link on CS242 web site Knuth, Structured Prog. with go to Statements You can use goto, but please do so in structured way Continued discussion Welch, GOTO (Considered Harmful) n, n is Odd General questions Do syntactic rules force good programming style? Can they help?

Advance in Computer Science Standard constructs that structure jumps if then else end while do end for { } case Modern style Group code in logical blocks Avoid explicit jumps except for function return Cannot jump into middle of block or function body

Exceptions: Structured Exit Terminate part of computation Jump out of construct Pass data as part of jump Return to most recent site set up to handle exception Unnecessary activation records may be deallocated May need to free heap space, other resources Two main language constructs Establish exception handler to catch exception Statement or expression to raise or throw exception Often used for unusual or exceptional condition; other uses too

JavaScript Exceptions throw e //jump to catch, passing exception object try { //code to try } catch (e if e == ) { //catch if first condition true } catch (e if e == ) { //catch if second condition true } catch (e if e == ) { //catch if third condition true } catch (e){ // catch any exception } finally { //code to execute after everything else } http://developer.mozilla.org/en/core_javascript_1.5_guide/ Exception_Handling_Statements

JavaScript Example function invert(matrix) { if throw Determinant ; }; try { invert(mymatrix); } catch (e) { // recover from error }

C++ Example Matrix invert(matrix m) { if throw Determinant; }; try { invert(mymatrix); } catch (Determinant) { // recover from error }

Where is an exception caught? Dynamic scoping of handlers Throw to most recent catch on run-time stack Recall: stacks and activation records Which activation record link is used? Access link? Control link? Dynamic scoping is not an accident User knows how to handler error Author of library function does not

ML Exceptions (cover briefly so book is useful to you) Declaration exception name of type gives name of exception and type of data passed when raised Raise raise name parameters expression form to raise and exception and pass data Handler exp1 handle pattern => exp2 evaluate first expression if exception that matches pattern is raised, then evaluate second expression instead General form allows multiple patterns.

Exception for Error Condition - datatype a tree = LF of a ND of ( a tree)*( a tree) - exception No_Subtree; - fun lsub (LF x) = raise No_Subtree lsub (ND(x,y)) = x; > val lsub = fn : a tree -> a tree This function raises an exception when there is no reasonable value to return We ll look at typing later.

Exception for Efficiency Function to multiply values of tree leaves fun prod(lf x) = x prod(nd(x,y)) = prod(x) * prod(y); Optimize using exception fun prod(tree) = let exception Zero fun p(lf x) = if x=0 then (raise Zero) else x p(nd(x,y)) = p(x) * p(y) in p(tree) handle Zero=>0 end;

Dynamic Scope of Handler JavaScript version scope try{ function f(y) { throw exn }; function g(h){ try {h(1)} catch(e){return 2} }; try { g(f) } catch(e){4}; } catch(e){6}; handler Which catch catches the throw?

Dynamic Scope of Handler Book version (ML) scope exception X; (let fun f(y) = raise X and g(h) = h(1) handle X => 2 in g(f) handle X => 4 end) handle X => 6; handler Which handler is used?

Dynamic Scope of Handler JavaScript version try{ function f(y) { throw exn }; function g(h){ try {h(1)} }; try { catch(e){return 2} g(f) } catch(e){4}; } catch(e){6}; Dynamic scope: find first handler, going up the dynamic call chain g(f) f(1) catch(e) 6 access link fun f access link fun g access link catch(e) 4 access link formal h catch(e) 2 access link formal y 1

Dynamic Scope of Handler Book version (ML) exception X; (let fun f(y) = raise X in and g(h) = h(1) handle X => 2 g(f) handle X => 4 end) handle X => 6; Dynamic scope: find first X handler, going up the dynamic call chain leading to raise X. g(f) f(1) handler X 6 access link fun f access link fun g access link handler X 4 access link formal h handler X 2 access link formal y 1

JavaScript version Compare to static scope of variables declaration try{ function f(y) { throw exn }; function g(h){ try {h(1)} catch(e){return 2} }; try { g(f) } catch(e){4}; } catch(e){6}; declaration var x=6; function f(y) { return x}; function g(h){ var x=2; return h(1) }; (function (y) { var x=4; g(f) })(0);

Book version (ML) Compare to static scope of variables exception X; (let fun f(y) = raise X and g(h) = h(1) handle X => 2 in g(f) handle X => 4 end) handle X => 6; val x=6; (let fun f(y) = x and g(h) = let val x=2 in h(1) in let val x=4 in g(f) end);

JavaScript version Static Scope of Declarations var x=6; function f(y) { return x}; function g(h){ var x=2; return h(1) }; (function (y) { var x=4; g(f) })(0); Static scope: find first x, following access links from the reference to X. g(f) f(1) var x 6 access link function f access link function g access link var x 4 access link formal h var x 2 access link formal y 1

Book version (ML) Static Scope of Declarations val x=6; (let fun f(y) = x in end); and g(h) = let val x=2 in h(1) let val x=4 in g(f) Static scope: find first x, following access links from the reference to X. g(f) f(1) val x 6 access link fun f access link fun g access link val x 4 access link formal h val x 2 access link formal y 1

Typing of Exceptions (Haskell) Special type IOError of exception usererror :: String -> IOError Exceptions are raised and caught using ioerror :: IOError -> IO a catch :: IO a -> (IOError -> IO a) -> IO a Questions Why is ioerror(usererror x) any type? Consider catch x (\e -> y) - types must match Limitations Propagate by re-raising any unwanted exceptions Only strings are passed (implementation dependent)

ML Typing of Exceptions Typing of raise exn Definition of ML typing Expression e has type t if normal termination of e produces value of type t Raising exception is not normal termination Example: 1 + raise X Typing of handle exn => value Converts exception to normal termination Need type agreement Examples 1 + ((raise X) handle X => e) Type of e must be int 1 + (e 1 handle X => e 2 ) Type of e 1, e 2 must be int

Exceptions and Resource Allocation Resources may be allocated inside try block May be garbage after exception Examples Memory (problem in C/C++) Lock on database Threads General problem: no obvious solution

Continuations Idea: The continuation of an expression is the remaining work to be done after evaluating the expression Continuation of e is a function normally applied to e General programming technique Capture the continuation at some point in a program Use it later: jump or exit by function call Useful in Compiler optimization: make control flow explicit Operating system scheduling, multiprogramming Web site design, other applications

JavaScript version Example of Continuation Concept Expression 2*x + 3*y + 1/x + 2/y What is continuation of 1/x? Remaining computation after division var before = 2*x + 3*y; function cont(d) {return (before + d + 2/y)}; cont (1/x);

Book version (ML) Example of Continuation Concept Expression 2*x + 3*y + 1/x + 2/y What is continuation of 1/x? Remaining computation after division let val before = 2*x + 3*y fun continue(d) = before + d + 2/y in continue (1/x) end

Example: Tail Recursive Factorial Standard recursive function fact(n) = if n=0 then 1 else n*fact(n-1) Tail recursive f(n,k) = if n=0 then k else f(n-1, n*k) fact(n) = f(n,1) How could we derive this? Transform to continuation-passing form Optimize continuation function to single integer

Continuation view of factorial fact(n) = if n=0 then 1 else n*fact(n-1) fact(9) fact(8) fact(7) return n 9... return n 8... return n 7... This invocation multiplies by 9 and returns Continuation of fact(8) is x. 9*x Multiplies by 8 and returns Continuation of fact(7) is y. ( x. 9*x) (8*y) Multiplies by 7 and returns Continuation of fact(6) is z. ( y. ( x. 9*x) (8*y)) (7*z)

Derivation of tail recursive form Standard function fact(n) = if n=0 then 1 else n*fact(n-1) Continuation form fact(n, k) = if n=0 then k(1) fact(n, x.x) computes n! Example computation continuation else fact(n-1, x.k (n*x) ) fact(3, x.x) = fact(2, y.(( x.x) (3*y))) = fact(1, x.(( y.3*y)(2*x))) = x.(( y.3*y)(2*x)) 1 = 6

Tail Recursive Form Optimization of continuations fact(n,a) = if n=0 then a else fact(n-1, n*a ) Each continuation is effectively x.(a*x) for some a Example computation fact(3,1) = fact(2, 3) was fact(2, y.3*y) = fact(1, 6) was fact(1, x.6*x) = 6

Other uses for continuations Explicit control Normal termination -- call continuation Abnormal termination -- do something else Compilation techniques Call to continuation is functional form of go to Continuation-passing style makes control flow explicit MacQueen: Callcc is the closest thing to a come-from statement I ve ever seen.

Continuations in Mach OS OS kernel schedules multiple threads Each thread may have a separate stack Stack of blocked thread is stored within the kernel Mach continuation approach Blocked thread represented as Pointer to a continuation function, list of arguments Stack is discarded when thread blocks Programming implications Sys call such as msg_recv can block Kernel code calls msg_recv with continuation passed as arg Advantage/Disadvantage Saves a lot of space, need to write continuation functions

Continuations in compilation SML continuation-based compiler [Appel, Steele] 1) Lexical analysis, parsing, type checking 2) Translation to -calculus form 3) Conversion to continuation-passing style (CPS) 4) Optimization of CPS 5) Closure conversion eliminate free variables 6) Elimination of nested scopes 7) Register spilling no expression with >n free vars 8) Generation of target assembly language program 9) Assembly to produce target-machine program

Summary Structured Programming Go to considered harmful Exceptions structured jumps that may return a value dynamic scoping of exception handler Continuations Function representing the rest of the program Generalized form of tail recursion Used in Lisp/Scheme compilation, some OS projects, web application development, Heap memory management What is garbage? Standard ways of managing heap memory

Lisp: John McCarthy Pioneer in AI Formalize common-sense reasoning Also Proposed timesharing Mathematical theory. Lisp stems from interest in symbolic computation (math, logic)

Lisp summary Many different dialects Lisp 1.5, Maclisp,, Scheme,... CommonLisp has many additional features This course: a fragment of Lisp 1.5, approximately But ignore static/dynamic scope until later in course Simple syntax (+ 1 2 3) (+ (* 2 3) (* 4 5)) (f x y) Easy to parse (Looking ahead: programs as data)

Atoms and Pairs Atoms include numbers, indivisible strings <atom> ::= <smbl> <number> <smbl> ::= <char> <smbl><char> <smbl><digit> <num> ::= <digit> <num><digit> Dotted pairs Write (A. B) for pair Symbolic expressions, called S-expressions: <sexp> ::= <atom> (<sexp>. <sexp>) Note on syntax Book uses some kind of pidgin Lisp In Scheme, a pair prints as (A. B), but (A. B) is not an expression

Basic Functions Functions on atoms and pairs: cons car cdr eq atom Declarations and control: cond lambda define eval quote Example (lambda (x) (cond ((atom x) x) (T (cons A x)))) function f(x) = if atom(x) then x else cons( A,x) Functions with side-effects rplaca rplacd

Evaluation of Expressions Read-eval-print loop Function call (function arg 1... arg n ) evaluate each of the arguments pass list of argument values to function Special forms do not eval all arguments Example (cond (p 1 e 1 )... (p n e n ) ) proceed from left to right find the first p i with value true, eval this e i Example (quote A) does not evaluate A

Examples (+ 4 5) expression with value 9 (+ (+ 1 2) (+ 4 5)) evaluate 1+2, then 4+5, then 3+9 to get value (cons (quote A) (quote B)) pair of atoms A and B (quote (+ 1 2)) evaluates to list (+ 1 2) '(+ 1 2) same as (quote (+ 1 2))

Conditional Expressions in Lisp Generalized if-then-else (cond (p 1 e 1 ) (p 2 e 2 ) (p n e n ) ) Evaluate conditions p 1 p n left to right If p i is first condition true, then evaluate e i Value of e i is value of expression No value for the expression if no p i true, or p 1 p i false and p i+1 has no value, or relevant p i true and e i has no value

Examples (cond ((< 2 1) 2) ((< 1 2) 1)) (cond ((< 2 1 ) 2) ((< 3 2) 3)) (cond (diverge 1) (true 0)) has value 1 has no value (cond (true 0) (diverge 1)) no value, if expression diverge loops forever has value 0

Function Expressions Form (lambda ( parameters ) ( function_body ) ) Syntax comes from lambda calculus: f. x. f (f x) (lambda (f) (lambda (x) (f (f x)))) Defines a function but does not give it a name ( (lambda (f) (lambda (x) (f (f x)))) (lambda (x) (+ 1 x))) )

Example (define twice ) (lambda (f) (lambda (x) (f (f x)))) (define inc (lambda (x) (+ 1 x))) ((twice inc) 2) 4

Lisp Memory Model Cons cells Address Decrement Atoms and lists represented by cells Atom A Atom B 0 Atom C

Sharing (a) (b) A B A B A B Both structures could be printed as ((A.B). (A.B)) Which is result of evaluating (cons (cons 'A 'B) (cons 'A 'B))? Note: Scheme actually prints using combination of list and dotted pairs

Garbage Collection Garbage: At a given point in the execution of a program P, a memory location m is garbage if no continued execution of P from this point can access location m. Garbage Collection: Detect garbage during program execution GC invoked when more memory is needed Decision made by run-time system, not program

Examples (car (cons ( e 1 ) ( e 2 ) )) Cells created in evaluation of e 2 may be garbage, unless shared by e 1 or other parts of program ((lambda (x) (car (cons ( x ) (... x...))) '(Big Mess)) The car and cdr of this cons cell may point to overlapping structures.

Mark-and-Sweep Algorithm Assume tag bits associated with data Need list of heap locations named by program Algorithm: Set all tag bits to 0. Start from each location used directly in the program. Follow all links, changing tag bit to 1 Place all cells with tag = 0 on free list

Why Garbage Collection in Lisp? McCarthy's paper says this is more convenient for the programmer than a system in which he has to keep track of and erase unwanted lists." Does this reasoning apply equally well to C? Is garbage collection "more appropriate" for Lisp than C? Why?

Summary Structured Programming Go to considered harmful Exceptions structured jumps that may return a value dynamic scoping of exception handler Continuations Function representing the rest of the program Generalized form of tail recursion Used in Lisp/Scheme compilation, some OS projects, web application development, Heap memory management Definition of garbage Mark-and-sweep garbage collection algorithm