Download presentation
Presentation is loading. Please wait.
Published byHerbert Hawkins Modified over 9 years ago
1
Principles of Programming Languages Lecture 1 Slides by Yaron Gonen, based on slides by Daniel Deutch and lecture notes by Prof. Mira Balaban
2
4 ٤ IV100
3
4 + 5 4 + “hello” +
4
So What have We Seen? Syntax Values Types Operators
5
Introduction We will study Computational Processes Design Principles – Modularity, abstraction, contracts… Programming Languages Paradigms – Functional Programming E.g. Racket, Scheme, ML, JavaScript (partially), Java (Since Java 8) Functions are first-class objects – Logic Programming E.g. Prolog “Declarative Programming” – Imperative Programming E.g. C, Java Focuses on change of state – Not always a crisp distinction – for instance scheme can be used for imperative programming.
6
More topics Types – Type Inference and Type Checking – Static and Dynamic Typing Different Semantics (e.g. Operational) Interpreters vs. Compilers – Lazy and applicative evaluation
7
Languages that will be studied Racket (dialect of Scheme) – Dynamically Typed – Functions are first-class citizens – Simple (though LOTS of parenthesis ) – Allows to show different programming styles Prolog – Declarative, Logic programming language Languages are important, but we will focus on the principles
8
Administrative Issues Websites prefix http://www.cs.bgu.ac.il/http://www.cs.bgu.ac.il/ – Course: /~ppl152 – My (for presentations): /~yarongon Weeks: 14 Exercises: 6 Mid-term Exam Grade
9
Use of Slides Slides are teaching-aids, i.e. by nature incomplete Compulsory material: – Lecture notes (see course website) – Everything taught in class and practical sessions – Compulsory reading if mentioned Will be on my site (I’ll try as early as possible)
10
“Wax on, wax off”
11
Functional Programming What is a non-functional (imperative) programming? – Imperative computation is a sequence of states (remember automata?) – Statements or side effects can modify the state (e.g. changing value of variable, display output)
12
Functional Programming Expressions (no statements) No State (no mutable data) No side-effects Has variables, but denote values (no location) We learn as we go This is not a course in functional programming!! (for that you have APL)
13
Why Functional Programming? Small paradigm (but powerful) Excellent for learning PPL Is making a comeback in recent years (Java 8, Javascript, NodeJS, MapReduce…) There’s FUN in Functional Programming…
14
The Power of Abstraction
15
15 Racket (Scheme) LISP = LISt Processing – Invented in 1959 by John McCarthy – Scheme is a dialect of LISP – invented by Gerry Sussman and Guy Steele – Racket is a dialect of Scheme – Small and powerful – Technical stuff in PS and in course website (how to install etc.)
16
A Word about Values Value is an abstract concept – User typed “4” get the value 4 – Computer calculated the value 4 need to display to user (toString)
17
17 The Racket Interpreter The Read/Evaluate/Print Loop – Read an expression – Compute its value – Print the result – Repeat the above The Global Environment – Function from names to values score23 total25 percentage92 Name Value
18
18 Expressions: Language Elements Means of Abstraction (define score 23) Associates score with 23 in environment table Syntax Semantics Means of Combination (composites) (+ 3 17 5) Application of proc to arguments Result = 25 Primitives 23 + * #t, #f 23 Primitive Proc (add) Primitive Proc (mult) Boolean
19
19 Computing in Scheme > 23 23 > (+ 3 17 5) 25 > (+ 3 (* 5 6) 8 2) 43 > (define score 23) Name Value Environment Table 23score Opening parenthesis Expression whose value is a procedure Other expressions Closing parenthesis
20
20 Computing in Scheme > score 23 > (define total 25) > (* 100 (/ score total)) 92 > (define percentage (* 100 (/ score total)) Name Value Environment 23score 25total 92percentage Atomic (can’t decompose) but not primitive A name-value pair in the env. is called binding
21
21 Evaluation of Expressions The value of a numeral: number The value of a boolean: true or false The value of a built-in operator (primitive procedure): machine instructions to execute The value of any name: the associated value in the environment
22
22 Evaluation of Expressions To Evaluate a combination: (as opposed to special form) – Evaluate all of the sub-expressions in some order – Apply the procedure that is the value of the leftmost sub-expression to the arguments (the values of the other sub-expressions)
23
23 Using Evaluation Rules > (define score 23) > (* (+ 5 6 ) (- score (* 2 3 2 ))) Special Form (second sub- expression is not evaluated) *+56 11 -23*322 12 11 121
24
24 Abstraction – Compound Procedures How does one describe procedures? (lambda (x) (* x x)) To process something multiply it by itself formal parametersbody Internal representation Special form – creates a “procedure object” (also called closure) and returns it as a “value” Proc (x) (* x x)
25
25 More on lambdas The use of the word “lambda” is taken from lambda calculus. A lambda body can consist of a sequence of expressions The value returned is the value of the last one So why have multiple expressions at all?
26
26 Syntactic Sugar for naming procedures (define square (lambda (x) (* x x)) (define (square x) (* x x)) Instead of writing: We can write:
27
27 Evaluation of An Expression To Apply a compound procedure: (to a list of arguments) Evaluate the body of the procedure with the formal parameters replaced by the corresponding actual values ==> ((lambda(x)(* x x)) 5) Proc(x)(* x x) 5 (* 5 5) 25
28
Evaluation of An Expression To Apply a compound procedure: (to a list of arguments) – Evaluate the body of the procedure with the formal parameters replaced by the corresponding actual values 28
29
29 Using Abstractions > (square 3) 9 > (+ (square 3) (square 4)) > (define square (lambda(x)(* x x))) (* 3 3) (* 4 4) 916+ 25 Environment Table NameValue squareProc (x)(* x x)
30
30 Yet More Abstractions > (define f (lambda(a) (sum-of-two-squares (+ a 3) (* a 3)))) > (sum-of-two-squares 3 4) 25 > (define sum-of-two-squares (lambda(x y)(+ (square x) (square y)))) Try it out…compute (f 3) on your own
31
31 Lets not forget The Environment > (define x 8) > (+ x 1) 9 > (define x 5) > (+ x 1) 6 The value of (+ x 1) depends on the environment!
32
32 Using the substitution model (define square (lambda (x) (* x x))) (define average (lambda (x y) (/ (+ x y) 2))) (average 5 (square 3)) (average 5 (* 3 3)) (average 5 9)first evaluate operands, then substitute (/ (+ 5 9) 2) (/ 14 2)if operator is a primitive procedure, 7replace by result of operation
33
33 Booleans Two distinguished values denoted by the constants #t and #f The type of these values is boolean > (< 2 3) #t > (< 4 3) #f
34
34 Values and types Values have types. For example: In scheme almost every expression has a value Examples: 1)The value of 23 is 23 2)The value of + is a primitive procedure for addition 3)The value of (lambda (x) (* x x)) is the compound procedure proc(x) (* x x) (also denoted 1)The type of 23 is numeral 2)The type of + is a primitive procedure 3)The type of proc (x) (* x x) is a compound procedure 4)The type of (> x 1) is a boolean (or logical)
35
Atomic and Compound Types Atomic types – Numbers, Booleans, Symbols (TBD) Composite types – Types composed of other types – So far: only procedures – We will see others later
36
36 No Value? In scheme most expressions have values Not all! Those that don’t usually have side effects Example : what is the value of the expression (define x 8) And of (display x) [ display is a primitive function that prints the value of its argument to the screen] In scheme, the value of a define, display expression is “undefined”. Never write code that relies on such value!
37
Dynamic Typing Note that we never specify explicitly types of variables However primitive functions expect values of a certain type! – E.g. “+” expects numeral values So will our procedures (To be discussed soon) The Scheme interpreter checks type correctness at run-time: dynamic typing – [As opposed to static typing verified by a compiler ]
38
38 More examples > (define x 8) Name Value Environment Table 8x > (define x (* x 2)) > x 16 > (define x y) reference to undefined identifier: y > (define + -) # + > (+ 2 2) 0 Bad practice, disalowed by some interpreters
39
39 The IF special form ERROR2 (if ) If the value of is #t, Evaluate and return it Otherwise Evaluate and return it (if ( 2 (if (
40
40 IF is a special form In a general form, we first evaluate all arguments and then apply the function (if ) is different: determines whether we evaluate or. We evaluate only one of them !
41
Condition (lambda (a b) (cond ( (> a b) a) ( (< a b) b) (else -1 )))
42
cond is a Special Form (cond (... )... (else... ))
43
Expressions: Summary Atomic Primitives – Numbers – Booleans – Procedures Non-primitives – Variables – Special operators symbols Composite Specials forms – define, lambda, if, cond Forms
44
Evaluation: Summary Atomic Number Boolean Built-in Primitive Variable Composite Primitive operator Operator is a procedure (value of lambda) Special form (define, if, lambda, cond)
45
Symbol Type > (quote a) a > ’a a > (define a ’a) > a a > (define b a) > b a > (eq? a b) #t > (symbol? a) #t > (define c 1) > (symbol? c) #f > (number? c) #t Symbols are atomic types, their values unbreakable: ‘abc is just a symbol Primitive procedure that compares two values Primitive procedure that checks if the value is of type symbol
46
More on Types A procedure type is a composite type, as it is composed of the types of its inputs (domain) and output (range) In fact, the procedure type can be instantiated with any type for domain and range, resulting in a different type for the procedure (=data) Such types are called polymorphic – Another polymorphic type: arrays of values of type X (e.g. STL vectors in C++)
47
Type constructor Defines a composite type out of other types The type constructor for functions is denoted “->” Example: [Number X Number –> Number] is the type of all procedures that get as input two numbers, and return a number Note: there is nothing in the syntax for defining types! This is a convention we manually enforce (for now..).
48
Scheme Type Grammar Type --> ’Unit’ | Non-Unit [Unit=Void] Non-unit -> Atomic | Composite | Type-variable Atomic --> ’Number’ | ’Boolean’ | ’Symbol’ Composite --> Procedure | Union Procedure --> ’Unit ’->’ Type | ’[’ (Non-Unit ’*’)* Non-Unit ’->’ Type ’]’ Union --> Type ’union’ Type Type-variable -> A symbol starting with an upper case letter
49
Value constructor Means of defining an instance of a particular type. The value constructors for procedures is lambda – Each lambda expression generates a new procedure
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.