CS 242 The Algol Family and ML John Mitchell Reading: Chapter 5.

Slides:



Advertisements
Similar presentations
Kathleen Fisher cs242 Reading: “Concepts in Programming Languages”, Chapter 6.
Advertisements

The Algol Family and ML John Mitchell CS 242. Language Sequence Algol 60 Algol 68 Pascal MLModula Lisp Many other languages: Algol 58, Algol W, Euclid,
Semantics Static semantics Dynamic semantics attribute grammars
ML Lists.1 Standard ML Lists. ML Lists.2 Lists  A list is a finite sequence of elements. [3,5,9] ["a", "list" ] []  ML lists are immutable.  Elements.
Programming Languages and Paradigms
CSE 3341/655; Part 4 55 A functional program: Collection of functions A function just computes and returns a value No side-effects In fact: No program.
Getting started with ML ML is a functional programming language. ML is statically typed: The types of literals, values, expressions and functions in a.
Kathleen Fisher cs242 Reading: “Concepts in Programming Languages” Chapter 5 except “Real World Haskell”, Chapter 0 and Chapter 1 (
Functional Programming. Pure Functional Programming Computation is largely performed by applying functions to values. The value of an expression depends.
Lambda Calculus and Lisp PZ03J. Lambda Calculus The lambda calculus is a model for functional programming like Turing machines are models for imperative.
ML: a quasi-functional language with strong typing Conventional syntax: - val x = 5; (*user input *) val x = 5: int (*system response*) - fun len lis =
INF 212 ANALYSIS OF PROG. LANGS Type Systems Instructors: Crista Lopes Copyright © Instructors.
ALGOL 60 Design by committee of computer scientists: Naur, Backus, Bauer, McCarthy, van Wijngaarden, Landin, etc. Design by committee of computer scientists:
CS 312 Spring 2004 Lecture 18 Environment Model. Substitution Model Represents computation as doing substitutions for bound variables at reduction of.
ML: a quasi-functional language with strong typing Conventional syntax: - val x = 5; (*user input *) val x = 5: int (*system response*) - fun len lis =
Introduction to ML - Part 2 Kenny Zhu. What is next? ML has a rich set of structured values Tuples: (17, true, “stuff”) Records: {name = “george”, age.
CS 312 Spring 2002 Lecture 16 The Environment Model.
Functional programming: LISP Originally developed for symbolic computing First interactive, interpreted language Dynamic typing: values have types, variables.
1 Functional Programming and ML. 2 What’s wrong with Imperative Languages? State State Introduces context sensitivity Introduces context sensitivity Harder.
CSCE 330 Project Algol 68 Joe PuzioWael AL-Fayez Gaurav ShahRonak Patel.
The Algol Family and ML John Mitchell CS 242 Reading: Chapter 5.
Kathleen Fisher cs242 Reading: “Concepts in Programming Languages” Chapter 5 except “Real World Haskell”, Chapter 0 and Chapter 1 (
Imperative Programming
PrasadCS7761 Haskell Data Types/ADT/Modules Type/Class Hierarchy Lazy Functional Language.
Dr. Muhammed Al-MulhemICS Chapter 5 The Algol Family and Haskell.
1 Programming Language History and Evolution In Text: Chapter 2.
Chapter 9: Functional Programming in a Typed Language.
Functional Programming With examples in F#. Pure Functional Programming Functional programming involves evaluating expressions rather than executing commands.
Ch. 5 Ch. 51 jcmt CSE 3302 Programming Languages CSE3302 Programming Languages (more notes) Dr. Carter Tiernan.
COMP313A Functional Programming (1)
12/9/20151 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Ch. 5 Ch. 51 jcmt Summer 2003Programming Languages CSE3302 Programming Languages (more notes) Summer 2003 Dr. Carter Tiernan.
1 FP Foundations, Scheme In Text: Chapter Chapter 14: FP Foundations, Scheme Mathematical Functions Def: A mathematical function is a mapping of.
Slide 1 Vitaly Shmatikov CS 345 Introduction to ML.
Types John Mitchell CS 242. Type A type is a collection of computable values that share some structural property. uExamples Integers Strings int  bool.
Chapter 1: Preliminaries Lecture # 2. Chapter 1: Preliminaries Reasons for Studying Concepts of Programming Languages Programming Domains Language Evaluation.
Ch Ch jcmt CSE 3302 Programming Languages CSE3302 Programming Languages (n-n-n-notes) Summer 2003 Dr. Carter Tiernan.
Language Paradigms CS655.
Artificial Intelligence and Lisp Lecture 6 LiU Course TDDC65 Autumn Semester,
CS314 – Section 5 Recitation 9
Programming Language History and Evolution
Functional Programming
Data Types In Text: Chapter 6.
Programming Languages and Compilers (CS 421)
Functional Programming
Zuse’s Plankalkül – 1945 Never implemented Problems Zuse Solved
Functional Programming
Principles of programming languages 12: Functional programming
Type Checking Generalizes the concept of operands and operators to include subprograms and assignments Type checking is the activity of ensuring that the.
ML: a quasi-functional language with strong typing
CS 326 Programming Languages, Concepts and Implementation
Introduction to Scheme
CS 326 Programming Languages, Concepts and Implementation
A lightening tour in 45 minutes
Subprograms The basic abstraction mechanism.
FORTRAN 04 February 1999; CS655.
Programming Language History and Evolution
Programming Languages and Compilers (CS 421)
Functional Programming
Objective caml Daniel Jackson MIT Lab for Computer Science 6898: Advanced Topics in Software Design March 18, 2002.
FP Foundations, Scheme In Text: Chapter 14.
Closure Closure binds a first-class function and a lexical environment together This is a complex topic, so we will build up our understanding of it we.
CSE 341 Section 5 Winter 2018.
Case Study: ML John Mitchell Reading: Chapter 5.
CSE-321 Programming Languages Introduction to Functional Programming
CSE-321 Programming Languages Introduction to Functional Programming
Course Overview PART I: overview material PART II: inside a compiler
CS 242 Types John Mitchell.
CS 242 Types John Mitchell Reading: Chapter 6.
Scope, Function Calls and Storage Management
Presentation transcript:

CS 242 The Algol Family and ML John Mitchell Reading: Chapter 5

Language Sequence Lisp Algol 60 Algol 68 Pascal ML Modula Many other languages: Algol 58, Algol W, Euclid, EL1, Mesa (PARC), … Modula-2, Oberon, Modula-3 (DEC)

Algol 60 Basic Language of 1960 Simple imperative language + functions Successful syntax, BNF -- used by many successors statement oriented Begin … End blocks (like C { … } ) if … then … else Recursive functions and stack storage allocation Fewer ad hoc restrictions than Fortran General array references: A[ x + B[3]*y] Type discipline was improved by later languages Very influential but not widely used in US

Algol 60 Sample real procedure average(A,n); real array A; integer n; begin real sum; sum := 0; for i = 1 step 1 until n do sum := sum + A[i]; average := sum/n end; no array bounds no ; here set procedure return value by assignment

Algol Joke Question Interesting answer in Algol Is x := x equivalent to doing nothing? Interesting answer in Algol integer procedure p; begin …. p := p end; Assignment here is actually a recursive call

Some trouble spots in Algol 60 Type discipline improved by later languages parameter types can be array no array bounds parameter type can be procedure no argument or return types for procedure parameter Parameter passing methods Pass-by-name had various anomalies “Copy rule” based on substitution, interacts with side effects Pass-by-value expensive for arrays Some awkward control issues goto out of block requires memory management

Is this what you expected? Algol 60 Pass-by-name Substitute text of actual parameter Unpredictable with side effects! Example procedure inc2(i, j); integer i, j; begin i := i+1; j := j+1 end; inc2 (k, A[k]); begin k := k+1; A[k] := A[k] +1 end; Is this what you expected?

Algol 68 Considered difficult to understand Idiosyncratic terminology types were called “modes” arrays were called “multiple values” vW grammars instead of BNF context-sensitive grammar invented by A. van Wijngaarden Elaborate type system Complicated type conversions Fixed some problems of Algol 60 Eliminated pass-by-name Not widely adopted

Algol 68 Modes Primitive modes Compound modes int real char bool string compl (complex) bits bytes sema (semaphore) format (I/O) file Compound modes arrays structures procedures sets pointers Rich and structured type system is a major contribution of Algol 68

Other features of Algol 68 Storage management Local storage on stack Heap storage, explicit alloc and garbage collection Parameter passing Pass-by-value Use pointer types to obtain Pass-by-reference Assignable procedure variables Follow “orthogonality” principle rigorously Source: Tanenbaum, Computing Surveys

Pascal Revised type system of Algol Popular teaching language Good data-structuring concepts records, variants, subranges More restrictive than Algol 60/68 Procedure parameters cannot have procedure parameters Popular teaching language Simple one-pass compiler

Limitations of Pascal Array bounds part of type procedure p(a : array [1..10] of integer) procedure p(n: integer, a : array [1..n] of integer) illegal Attempt at orthogonal design backfires parameter must be given a type type cannot contain variables How could this have happened? Emphasis on teaching Not successful for “industrial-strength” projects Kernighan -- Why Pascal is not my favorite language Left niche for C; niche has expanded!!

C Programming Language Designed for writing Unix by Dennis Ritchie Evolved from B, which was based on BCPL B was an untyped language; C adds some checking Relation between arrays and pointers An array is treated as a pointer to first element E1[E2] is equivalent to ptr dereference *((E1)+(E2)) Pointer arithmetic is not common in other languages Ritchie quote “C is quirky, flawed, and a tremendous success.”

ML Typed programming language Intended for interactive use Combination of Lisp and Algol-like features Expression-oriented Higher-order functions Garbage collection Abstract data types Module system Exceptions General purpose non-C-like, not OO language Related languages: Haskell, OCAML, …

Why study ML ? Learn an important language that’s different Discuss general programming languages issues Types and type checking General issues in static/dynamic typing Type inference Polymorphism and Generic Programming Memory management Static scope and block structure Function activation records, higher-order functions Control Force and delay Exceptions Tail recursion and continuations

History of ML Robin Milner Logic for Computable Functions Stanford 1970-71 Edinburgh 1972-1995 Meta-Language of the LCF system Theorem proving Type system Higher-order functions

Logic for Computable Functions Dana Scott, 1969 Formulate logic for proving properties of typed functional programs Milner Project to automate logic Notation for programs Notation for assertions and proofs Need to write programs that find proofs Too much work to construct full formal proof by hand Make sure proofs are correct

LCF proof search Tactic: function that tries to find proof succeed and return proof tactic(formula) = search forever fail Express tactics in the Meta-Language (ML) Use type system to facilitate correctness

Tactics in ML type system Tactic has a functional type tactic : formula  proof Type system must allow “failure” succeed and return proof tactic(formula) = search forever fail and raise exception

Function types in ML f : A  B means for every x  A, some element y=f(x)  B f(x) = run forever terminate by raising an exception In words, “if f(x) terminates normally, then f(x) B.” Addition never occurs in f(x)+3 if f(x) raises exception. This form of function type arises directly from motivating application for ML. Integration of type system and exception mechanism mentioned in Milner’s 1991 Turing Award.

Higher-Order Functions Tactic is a function Method for combining tactics is a function on functions Example: f(tactic1, tactic2) =  formula. try tactic1(formula) else tactic2 (formula)

Basic Overview of ML Interactive compiler: read-eval-print Examples Compiler infers type before compiling or executing Type system does not allow casts or other loopholes. Examples - (5+3)-2; > val it = 6 : int - if 5>3 then “Bob” else “Fido”; > val it = “Bob” : string - 5=4; > val it = false : bool

Overview by Type Booleans Integers Strings Reals true, false : bool if … then … else … (types must match) Integers 0, 1, 2, … : int +, * , … : int * int  int and so on … Strings “Austin Powers” Reals 1.0, 2.2, 3.14159, … decimal point used to disambiguate

Compound Types Tuples Lists Records (4, 5, “noxious”) : int * int * string Lists nil 1 :: [2, 3, 4] infix cons notation Records {name = “Fido”, hungry=true} : {name : string, hungry : bool}

Patterns and Declarations Patterns can be used in place of variables <pat> ::= <var> | <tuple> | <cons> | <record> … Value declarations General form val <pat> = <exp> Examples val myTuple = (“Conrad”, “Lorenz”); val (x,y) = myTuple; val myList = [1, 2, 3, 4]; val x::rest = myList; Local declarations let val x = 2+3 in x*4 end;

Functions and Pattern Matching Anonymous function fn x => x+1; like Lisp lambda Declaration form fun <name> <pat1> = <exp1> | <name> <pat2> = <exp2> … | <name> <patn> = <expn> … Examples fun f (x,y) = x+y; actual par must match pattern (x,y) fun length nil = 0 | length (x::s) = 1 + length(s);

Map function on lists Apply function to every element of list fun map (f, nil) = nil | map (f, x::xs) = f(x) :: map (f,xs); map (fn x => x+1, [1,2,3]); [2,3,4] Compare to Lisp (define map (lambda (f xs) (if (eq? xs ()) () (cons (f (car xs)) (map f (cdr xs))) )))

More functions on lists Reverse a list fun reverse nil = nil | reverse (x::xs) = append ((reverse xs), [x]); Append lists fun append(nil, ys) = ys | append(x::xs, ys) = x :: append(xs, ys); Questions How efficient is reverse? Can you do this with only one pass through list?

More efficient reverse function fun reverse xs = let fun rev (nil, z) = (nil, z) | rev(y::ys, z) = rev(ys, y::z) val (u,v) = rev(xs,nil) in v end; 1 2 3 1 2 3 1 2 3 1 2 3

Datatype Declarations General form datatype <name> = <clause> | … | <clause> <clause> ::= <constructor> |<contructor> of <type> Examples datatype color = red | yellow | blue elements are red, yellow, blue datatype atom = atm of string | nmbr of int elements are atm(“A”), atm(“B”), …, nmbr(0), nmbr(1), ... datatype list = nil | cons of atom*list elements are nil, cons(atm(“A”), nil), … cons(nmbr(2), cons(atm(“ugh”), nil)), ...

Datatype and pattern matching Recursively defined data structure datatype tree = leaf of int | node of int*tree*tree node(4, node(3,leaf(1), leaf(2)), node(5,leaf(6), leaf(7)) ) Recursive function fun sum (leaf n) = n | sum (node(n,t1,t2)) = n + sum(t1) + sum(t2) 4 5 7 6 3 2 1

Example: Evaluating Expressions Define datatype of expressions datatype exp = Var of int | Const of int | Plus of exp*exp; Write (x+3)+y as Plus(Plus(Var(1),Const(3)), Var(2)) Evaluation function fun ev(Var(n)) = Var(n) | ev(Const(n)) = Const(n) | ev(Plus(e1,e2)) = … Examples ev(Plus(Const(3),Const(2))) Const(5) ev(Plus(Var(1),Plus(Const(2),Const(3)))) ev(Plus(Var(1), Const(5))

Case expression Datatype Case expression datatype exp = Var of int | Const of int | Plus of exp*exp; Case expression case e of Var(n) => … | Const(n) => …. | Plus(e1,e2) => …

Evaluation by cases datatype exp = Var of int | Const of int | Plus of exp*exp; fun ev(Var(n)) = Var(n) | ev(Const(n)) = Const(n) | ev(Plus(e1,e2)) = (case ev(e1) of Var(n) => Plus(Var(n),ev(e2)) | Const(n) => (case ev(e2) of Var(m) => Plus(Const(n),Var(m)) | Const(m) => Const(n+m) | Plus(e3,e4) => Plus(Const(n),Plus(e3,e4)) ) | Plus(e3,e4) => Plus(Plus(e3,e4),ev(e2)) );

Core ML Basic Types Patterns Declarations Functions Polymorphism Unit Booleans Integers Strings Reals Tuples Lists Records Patterns Declarations Functions Polymorphism Overloading Type declarations Exceptions Reference Cells

Variables and assignment General terminology: L-values and R-values Assignment y := x+3 Identifier on left refers to a memory location, called L-value Identifier on right refers to contents, called R-value Variables Most languages A variable names a storage location Contents of location can be read, can be changed ML reference cell A mutable cell is another type of value Explicit operations to read contents or change contents Separates naming (declaration of identifiers) from “variables”

ML imperative constructs ML reference cells Different types for location and contents x : int non-assignable integer value y : int ref location whose contents must be integer !y the contents of location y ref x expression creating new cell initialized to x ML assignment operator := applied to memory cell and new contents Examples y := x+3 place value of x+3 in cell y; requires x:int y := !y + 3 add 3 to contents of y and store in location y

ML examples Create cell and change contents Create cell and increment val x = ref “Bob”; x := “Bill”; Create cell and increment val y = ref 0; y := !y + 1; While loop val i = ref 0; while !i < 10 do i := !i +1; !i; x Bill Bob y 1

Core ML Basic Types Patterns Declarations Functions Polymorphism Unit Booleans Integers Strings Reals Tuples Lists Records Patterns Declarations Functions Polymorphism Overloading Type declarations Exceptions Reference Cells