0% found this document useful (0 votes)
36 views61 pages

E6998-3: Advanced Topics in Programming Languages and Compilers

The document summarizes Professor Alfred Aho's introduction to his advanced programming languages and compilers course. It outlines the course objectives which include computational thinking in language design, understanding modern language and compiler techniques, and a semester-long individual project. It also briefly discusses computational thinking, issues in language design, the evolution of programming languages, and different computational models and target languages for compilers.

Uploaded by

Vishnu Goudar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
36 views61 pages

E6998-3: Advanced Topics in Programming Languages and Compilers

The document summarizes Professor Alfred Aho's introduction to his advanced programming languages and compilers course. It outlines the course objectives which include computational thinking in language design, understanding modern language and compiler techniques, and a semester-long individual project. It also briefly discusses computational thinking, issues in language design, the evolution of programming languages, and different computational models and target languages for compilers.

Uploaded by

Vishnu Goudar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 61

Alfred V.

Aho
[email protected]

E6998-3: Advanced Topics in


Programming Languages and Compilers

Lecture 1 – Introduction to Course


September 4, 2012
1 Al Aho
Introduction
Professor Alfred V. Aho
http://www.cs.columbia.edu/~aho
[email protected]
Lectures: Tuesdays, 4:10-6:00pm, 233 Mudd
Office hours: Tuesdays 2:00-3:00pm,
513 Computer Science Building
Course webpage:
http://www.cs.columbia.edu/~aho/cs6998

2 Al Aho
Outline
• Course objectives
• Course requirements
• Computational thinking
• Issues in language design and specification
• Overview of a compiler
• Overview of lambda calculus

3 Al Aho
Course Objectives
• Computational thinking in language design
• Understanding how modern language and compiler
technology can be used to make software reliably,
securely, and efficiently
• Motivation for new programming languages such as GO
and Clojure
• Understanding modern program translation techniques
and tools
• Awareness of language and compiler issues in dealing
with parallelism and concurrency
• A highlight of this course is a semester-long project in
which you can explore in some depth an advanced topic in
programming languages and compilers of your own
choosing.

4 Al Aho
Potential Project Topics
• Lambda calculus and functional languages
• Concurrency and parallelism
• Program analysis techniques
• New programming languages such as GO and Clojure
• New program translation tools such as KPEG and PLY
• Model checking
• Satisfiability modulo theory solvers
• Abstract interpretation
• Report on a “most influential PLDI paper”
– http://www.sigplan.org/Awards/Conferences/PLDI/Main

5 Al Aho
Recent Most Influential PLDI Papers
• Extended Static Checking for Java
• Automatic predicate abstraction of C programs
• Dynamo: A Transparent Dynamic Optimization System
• A Fast Fourier Transform Compiler
• The Implementation of the Cilk-5 Multithreaded Language
• Exploiting Hardware Performance Counters with Flow and Context Sensitive
Profiling
• TIL: A Type-Directed Optimizing Compiler for ML
• Selective Specialization for Object-Oriented Languages
• ATOM: a system for building customized program analysis tools
• Space Efficient Conservative Garbage Collection
• Lazy Code Motion
• A data locality optimizing algorithm

[http://www.sigplan.org/Awards/Conferences/PLDI/Main]

6 Al Aho
Additional Project Topics
• Garbage collection
• Data-flow analysis schemas
• Instruction-level parallelism
• Optimizing for parallelism and locality
• Interprocedural analysis
• Intermediate representations
– Functional IRs
• New compiler development tools
• Compiler collections
– GCC
– LLVM
– .NET

7 Al Aho
Prerequisites and Background Text

• Fluency in at least one major programming language such


as C, C++, C#, Java, or OCaml

• COMS W4115: Programming Languages and Translators,


or equivalent

• Text: Compilers, Techniques, and Tools


(Second Edition), Aho, Lam, Sethi, and
Ullman, Addison-Wesley, 2007.

8 Al Aho
Course Project and Grade

• Each student should select a programming language or


compiler topic to pursue in more depth.

• Students will regularly discuss their projects with the class


and, at the end of the semester, will present their project
and hand in a final project report summarizing their
findings.

• The project and classroom discussions will determine the


final grade.

9 Al Aho
The Age of Computational Thinking
Computational advertising
Computational biology
Computational chemistry
Computational linguistics
Computational neuroscience
Computational physics
Computational science
Computational thinking in programming
language design
10 Al Aho
Computational Thinking – Jeannette Wing

Computational thinking is a fundamental skill


for everyone, not just for computer scientists.
To reading, writing, and arithmetic, we should
add computational thinking to every child’s
analytical ability. Just as the printing press
facilitated the spread of the three Rs, what is
appropriately incestuous about this vision is
that computing and computers facilitate the
spread of computational thinking.

Computational thinking involves solving


[Jeannette Wing,
Computational problems, designing systems, and
Thinking, CACM, understanding human behavior, by drawing
March, 2006] on the concepts fundamental to computer
science. Computational thinking includes a
range of mental tools that reflect the breadth
of the field of computer science.
11 Al Aho
Computational Thinking

The thought processes involved in formulating


problems so their solutions can be represented
as computation steps and algorithms.

A. V. Aho
Computation and Computational Thinking
The Computer Journal 55:12, pp. 832-835, 2012

12 Al Aho
A Good Way to Learn Computational Thinking

Design and implement your own programming


language!

13 Al Aho
Computational Thinking in Language Design

Problem
Domain

Computational
Model

Algorithms

Programming
Language

14 Al Aho
Computational Model of AWK
AWK is a simple language designed to perform routine
data-processing tasks on strings and numbers

Problem: given a list of name-value pairs, print the total value


associated with each name.
alice 10 An AWK program
eve 20 is a sequence of
bob 15 pattern-action statements
alice 30

{ total[$1] += $2 }
END { for (x in total) print x, total[x] }

eve 20
bob 15
alice 40
15 Al Aho
Theory in Practice: Regular Expression Pattern
Matching in Perl, Python, Ruby vs. AWK
Time to check whether a?nan matches an

regular expression and text size n

Russ Cox, Regular expression matching can be simple and fast (but is slow in Java,
Perl, PHP, Python, Ruby, ...) [http://swtch.com/~rsc/regexp/regexp1.html, 2007]
16 Al Aho
Evolution of Programming Languages

1970 2012
Fortran C
Lisp Java
Cobol Objective-C
Algol 60 C++
APL C#
Snobol 4 PHP
Simula 67 Basic
Basic Python
PL/1 Perl
Pascal Ruby

[http://www.tiobe.com, September 2012]

17 Al Aho
Issues in Language Design
• Domain of application
– exploit domain restrictions for expressiveness, performance

• Computational model
– simplicity, ease of expression

• Abstraction mechanisms
– reuse, suggestivity

• Type system
– reliability, security

• Usability
– readability, writability, efficiency

18 Al Aho
Computational Models in Languages

Underlying every programming language is a model of


computation:

C, C++, C#, Java: Von Neumann

SQL: Relational algebra

Prolog: Logic

Haskell, ML: Lambda calculus

19 Al Aho
Evolutionary Forces

Increasing diversity of applications

Stress on increasing productivity

Need to improve software reliability,


security and maintainability

Target machines more diverse

Parallel machine architectures

Massive compiler collections

20 Al Aho
Target Languages

Another programming language

CISCs
RISCs
Parallel machines
Multicores
GPUs
Quantum computers

21 Al Aho
Programming Languages Today

Today there are thousands of programming languages.

The website http://www.99-bottles-of-beer.net


has programs in 1,500 different programming
languages and variations to print the lyrics to
the song “99 Bottles of Beer.”

22 Al Aho
“99 Bottles of Beer”
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.


Take one down and pass it around, 97 bottles of beer on the wall.
.
.
.
2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer.


Take one down and pass it around, no more bottles of beer on the wall.

No more bottles of beer on the wall, no more bottles of beer.


Go to the store and buy some more, 99 bottles of beer on the wall.
[Traditional]
23 Al Aho
“99 Bottles of Beer” in AWK
BEGIN {
for(i = 99; i >= 0; i--) {
print ubottle(i), "on the wall,", lbottle(i) "."
print action(i), lbottle(inext(i)), "on the wall."
print
}
}
function ubottle(n) {
return sprintf("%s bottle%s of beer", n ? n : "No more", n - 1 ? "s" : "")
}
function lbottle(n) {
return sprintf("%s bottle%s of beer", n ? n : "no more", n - 1 ? "s" : "")
}
function action(n) {
return sprintf("%s", n ? "Take one down and pass it around," : \
"Go to the store and buy some more,")
}
function inext(n) {
return n ? n - 1 : 99
}
[Osamu Aoki, http://people.debian.org/~osamu]

24 Al Aho
“99 Bottles of Beer” in Perl
''=~( '(?{' .('`' |'%') .('[' ^'-')
.('`' |'!') .('`' |',') .'"'. '\\$'
.'==' .('[' ^'+') .('`' |'/') .('['
^'+') .'||' .(';' &'=') .(';' &'=')
.';-' .'-'. '\\$' .'=;' .('[' ^'(')
.('[' ^'.') .('`' |'"') .('!' ^'+')
.'_\\{' .'(\\$' .';=('. '\\$=|' ."\|".( '`'^'.'
).(('`')| '/').').' .'\\"'.+( '{'^'['). ('`'|'"') .('`'|'/'
).('['^'/') .('['^'/'). ('`'|',').( '`'|('%')). '\\".\\"'.( '['^('(')).
'\\"'.('['^ '#').'!!--' .'\\$=.\\"' .('{'^'['). ('`'|'/').( '`'|"\&").(
'{'^"\[").( '`'|"\"").( '`'|"\%").( '`'|"\%").( '['^(')')). '\\").\\"'.
('{'^'[').( '`'|"\/").( '`'|"\.").( '{'^"\[").( '['^"\/").( '`'|"\(").(
'`'|"\%").( '{'^"\[").( '['^"\,").( '`'|"\!").( '`'|"\,").( '`'|(',')).
'\\"\\}'.+( '['^"\+").( '['^"\)").( '`'|"\)").( '`'|"\.").( '['^('/')).
'+_,\\",'.( '{'^('[')). ('\\$;!').( '!'^"\+").( '{'^"\/").( '`'|"\!").(
'`'|"\+").( '`'|"\%").( '{'^"\[").( '`'|"\/").( '`'|"\.").( '`'|"\%").(
'{'^"\[").( '`'|"\$").( '`'|"\/").( '['^"\,").( '`'|('.')). ','.(('{')^
'[').("\["^ '+').("\`"| '!').("\["^ '(').("\["^ '(').("\{"^ '[').("\`"|
')').("\["^ '/').("\{"^ '[').("\`"| '!').("\["^ ')').("\`"| '/').("\["^
'.').("\`"| '.').("\`"| '$')."\,".( '!'^('+')). '\\",_,\\"' .'!'.("\!"^
'+').("\!"^ '+').'\\"'. ('['^',').( '`'|"\(").( '`'|"\)").( '`'|"\,").(
'`'|('%')). '++\\$="})' );$:=('.')^ '~';$~='@'| '(';$^=')'^ '[';$/='`';

[Andrew Savage, http://search.cpan.org/dist/Acme-EyeDrops/lib/Acme/EyeDrops.pm]


25 Al Aho
“99 Bottles of Beer” in the
Whitespace Language

[Andrew Kemp, http://compsoc.dur.ac.uk/whitespace/]

26 Al Aho
Grammars are Used for Specifying Syntax
The grammar S → aSbS | bSaS | ε generates all strings of
a’s and b’s with the same number of a’s as b’s.
This grammar is ambiguous: abab has two parse trees.
S S

a S b S a S b S

b S a S ε ε a S b S

ε ε ε ε

1  2n 
(ab)n has   parse trees
n 1  n 
27 Al Aho
Natural Languages are Inherently Ambiguous

I made her duck.


[5 meanings: D. Jurafsky and J. Martin, 2000]

One morning I shot an elephant in my pajamas. How he got


into my pajamas I don’t know.
[Groucho Marx, Animal Crackers, 1930]

List the sales of the products produced in 1973 with the


products produced in 1972.
[455 parses: W. Martin, K. Church, R. Patil, 1987]

28 Al Aho
Programming Languages are not
Inherently Ambiguous
This grammar G generates the same language

S → aAbS | bBaS | ε
A → aAbA | ε S
B → bBaB | ε
a A b S
G is unambiguous and has
only one parse tree for ε a A b S
every sentence in L(G).
ε ε

29 Al Aho
Methods for Specifying the Semantics of
Programming Languages

Operational semantics
Program constructs are translated to an understood language.

Axiomatic semantics
Assertions called preconditions and postconditions specify
the properties of statements.

Denotational semantics
Semantic functions map syntactic objects to semantic values.

30 Al Aho
Phases of a Compiler

source target
program program

Interm.
Lexical Syntax Semantic Code Code
Code
Analyzer Analyzer Analyzer Optimizer Gen.
Gen.

annotated
token syntax interm. interm.
syntax
stream tree rep. rep.
tree

Symbol Table

[A. V. Aho, M. S. Lam, R. Sethi, J. D. Ullman, Compilers: Principles, Techniques, & Tools, 2007]
31 Al Aho
Compiler Component Generators

lex yacc
specification specification

Lexical Syntax
Analyzer Analyzer
Generator Generator
(lex) (yacc)

source Lexical token Syntax syntax


program Analyzer stream Analyzer tree

32 Al Aho
Lex Specification for a Desk Calculator

number [0-9]+\.?|[0-9]*\.[0-9]+
%%
[ ] { /* skip blanks */ }
{number} { sscanf(yytext, "%lf", &yylval);
return NUMBER; }
\n|. { return yytext[0]; }

[M. E. Lesk and E. Schmidt, Lex – A Lexical Analyzer Generator]

33 Al Aho
Yacc Specification for a Desk Calculator
%token NUMBER
%left '+'
%left '*'
%%
lines : lines expr '\n' { printf("%g\n", $2); }
| /* empty */
;
expr : expr '+' expr { $$ = $1 + $3; }
| expr '*' expr { $$ = $1 * $3; }
| '(' expr ')' { $$ = $2; }
| NUMBER
;
%%
#include "lex.yy.c"
[Stephen C. Johnson, Yacc: Yet Another Compiler-Compiler ]
34 Al Aho
Creating the Desk Calculator

Invoke the commands


lex desk.l
yacc desk.y
cc y.tab.c –ly –ll

Result

Desk
1.2 * (3.4 + 5.6) 10.8
Calculator

35 Al Aho
Some Computational Thinking Lessons
Learned in COMS W4115
• “Designing a language is hard and designing a simple
language is extremely hard!”

• “During this course we realized how naïve and


overambitious we were, and we all gained a newfound
respect for the work and good decisions that went into
languages like C and Java which we’ve taken for
granted for years.”

36 Al Aho
Lambda Calculus − A Quick Overview

• Lambda calculus was introduced in the 1930s by Alonzo Church


as a mathematical system for defining computable functions.
• Lambda calculus is equivalent in definitional power to that of
Turing machines.
• Lambda calculus serves as the computational model underlying
functional programming languages.
• Lisp was developed by John McCarthy in 1956 around lambda
calculus.
• ML, a general purpose functional programming language, was
developed by Robin Milner in the late 1970s.
• Haskell, considered by many as one of the purest functional
programming languages, was developed by Simon Peyton Jones,
Paul Houdak, Phil Wadler and others in the late 1980s and early
90s.

37 Al Aho
Grammar for Lambda Calculus

• The central concept in lambda calculus is an expression which can


denote a function definition (called a function abstraction) or a
function application.

expr → abstraction | application | (expr) | var |


constant
abstraction → λ var . expr
application → expr expr

• We can think of a lambda-calculus expression as a program which


when evaluated returns a result consisting of another lambda-
calculus expression.
• For notational convenience, we have included constants that can
be numbers and built-in functions. These are unnecessary – they
can be simulated in pure lambda calculus.
38 Al Aho
Function Abstraction

• A function abstraction, often called a lambda abstraction, is an


expression defining a function.
• It consists of a lambda followed by a variable, a period, and then
an expression: λ var . expr
• In the function λ var . expr, var is the formal parameter and
expr the body.
• We say λ var . expr binds var in expr.
• Example
–λx.y is a function abstraction.
– The variable x after the λ is the formal parameter of the function.
– The expression y after the period is the body of the function.

39 Al Aho
Function Application and Currying

• A function application, often called a lambda application, consists


of an expression followed by an expression: expr expr.

• If f is a function and x an expression, then fx is a function


application denoting the application of the function f to the
argument x. All functions in lambda calculus are prefix.

• If we want to apply a function to more than one argument, we can


use a technique called currying. To express the sum of 1 and 2 we
write ((+ 1) 2). The expression (+ 1) denotes the function that
adds 1 to its argument. Thus ((+ 1) 2) means the function + is
applied to the argument 1 and the result is a function that is
applied to 2.

40 Al Aho
Lambda Calculus Conventions

• As in ordinary mathematics, we can omit redundant


parentheses to avoid cluttering up expressions so we
often write ((+ 1) 2) as (+ 1 2) or even + 1 2.

• Function application is left associative and application


binds tighter than period.
–Example: λx.fgx = (λx.(fg)x)
–Example: (λx.λy.xy)λz.z = (λx.(λy.(xy)))λz.z

• The body in a function abstraction extends as far to the


right as possible.
–Example: λx.+ x 1 = λx.(+ x 1)
41 Al Aho
Evaluating an Expression

• A lambda calculus expression can be thought of as a


program which can be executed by evaluating it.
Evaluation is done by repeatedly finding a reducible
expression (called a redex) and reducing it using a
technique called beta reduction.
• For example the lambda calculus expression
(+ (* 1 2) (* 3 4)) has two redexes:
(* 1 2) and (* 3 4)
If we choose to reduce the first redex and then the
second and then the result, we get the following
sequence of reductions:
(+ (* 1 2) (* 3 4)) → (+ 2 (* 3 4))
→ (+ 2 12) → 14
42 Al Aho
Free and Bound Variables

• In lambda calculus all variables are local to function


definitions.

• In the function λx.x the variable x in the body of the


definition (the second x) is bound because its first
occurrence in the definition is λx.

• In the expression (λx.xy), the variable x in the body of


the function is bound and the variable y is free.

43 Al Aho
Examples of Free and Bound Variables

• In the expression (λx.x)(λy.yx)


– The variable x in the body of the leftmost expression is bound to
the first lambda.
– The variable y in the body of the second expression is bound to
the second lambda.
– The variable x in the body of the second expression is free (and
independent of the x in the first expression).

• In the expression (λx.xy)(λy.y)


– The variable y in the body of the leftmost expression is free.
– The variable y in the body of the second expression is bound to
the second lambda.

44 Al Aho
The Set of Free Variables

• Given an expression e, the following rules define FV(e),


the set of free variables in e:
–If e is a variable x, then FV(e) = {x}.
–If e is of the form λx.y, then FV(e) = FV(y) − {x}.
–If e is of the form xy, then FV(e) = FV(x) ∪ FV(y).

• An expression with no free variables is said to be


closed.

45 Al Aho
Renaming Bound Variables by
Alpha Conversion
• The name of a formal parameter in a function definition
is arbitrary. We can use any variable to name a
parameter, so that the function λx.x is equivalent to
λy.y and λz.z. This kind of renaming is called alpha
conversion.
• Note that we cannot rename free variables in
expressions.
• Also note that we cannot change the name of a bound
variable in an expression to conflict with the name of a
free variable in that expression.

46 Al Aho
Substitution

• The notation [y/x]e is used to indicate that y is to be


substituted for all occurrences of x in the expression e.
• The rules for substitution are as follows. We assume x
and y are distinct variables.
• For variables
–[e/x]x = e
–[e/x]y = y
• For function applications
–[e/x](f g) = ([e/x]f)([e/x]g)
• For function abstractions
–[e/x](λx.f)= λx.f
–[e/x](λy.f)= λy.[e/x]f, provided y is not a free variable in e.

47 Al Aho
Evaluation of Function Applications by
Beta Reductions
• A function application fg is evaluated by substituting
the argument g for the formal parameter in the body of
the function definition f.
• Example: (λx.x)y → [y/x]x = y
• This substitution in a function application is called a
beta reduction and we use a right arrow to indicate a
beta reduction.

48 Al Aho
Function Application by Beta Reductions

• If expr1 → expr2, we say expr1 reduces to expr2 in


one step.
• In general, (λx.e)g → [g/x]e means that applying the
function (λx.e) to the argument expression g reduces
to the function body [g/x]e after substituting the
argument expression g for the function's formal
parameter x in the function body e.
• We use →* to denote the reflexive and transitive closure
of →.

49 Al Aho
Eta Conversion and Beta Abstraction

• The two lambda expressions (λx.+ 1 x) and (+ 1)


are equivalent in the sense that these expressions
behave in exactly the same way when they are applied
to an argument − they add 1 to it. Eta conversion is a
rule that expresses this equivalence.

• In general, if x does not occur free in the function F,


then (λx.F x) is eta convertible to F.
–Example: (λx.+ 1 x) is eta convertible to (+ 1)

• We will sometimes say + 1 y is a beta abstraction of


(λx.+ x y)1. This is analogous to running beta
reduction in reverse.

50 Al Aho
Evaluating Expressions using Renaming

• When performing substitutions, we should be careful


to avoid mixing up free occurrences of a variable with
bound ones.

• When we apply the function λx.e to an expression g,


we substitute all occurrences of x in e with g. If there
is a free variable in g named x, we rename the bound
variable x to avoid any conflicts before doing the
substitution.

51 Al Aho
Examples of Evaluating Expressions
using Renaming
• The expression (λx.(λy.xy))y) contains a bound y
in the middle and a free y at the right. We can rename
the bound variable y to a new variable, say z, to
evaluate the expression with no name conflicts:
(λx.(λy.xy))y) = (λx.(λz.xz))y) →
[y/x](λz.xz) = (λz.yz)

• The body of the leftmost expression in


(λx.(λy.(x(λx.xy))))y is (λy.(x(λx.xy))). In
this body only the first x is free. Before substituting,
we rename the bound variable y to z, say, to avoid
confusing it with its free occurrence. Therefore we get
the evaluation: (λx.(λy.(x(λx.xy))))y =
(λx.(λz.(x(λx.xz))))y →
[y/x](λz.(x(λx.xz))) = (λz.(y(λx.xz)))
52 Al Aho
Normal Forms

• An expression containing no possible beta reductions


is called a normal form.
• A normal form expression has no redexes in it.
• Examples of normal form expressions:
– x where x is a variable
– xe where x is a variable and e is a normal form
expression
– λx.e where x is a variable and e is a normal form
expression

53 Al Aho
Remarkable Properties of Lambda Calculus

• The expression (λz.z z)(λz.z z) does not have a


normal form because it repeatedly evaluates to itself.
We can think of this expression as a representation
for an infinite loop.
• A remarkable property of lambda calculus is that
every expression has a unique normal form if one
exists.
• Lambda calculus is also Church-Rosser, meaning that
reductions can be applied in any order. More formally,
if w →* x and w →* y, then there always exists an
expression z such that x →* z and y →* z.

54 Al Aho
Evaluation Strategies

• An expression may contain more than one redex so there can be


several reduction sequences. For example, the expression
(+ (* 1 2) (* 3 4)) can be reduced to normal form with the
reduction sequence
(+ (* 1 2) (* 3 4))
→ (+ 2 (* 3 4))
→ (+ 2 12)
→ 14
or the sequence
(+ (* 1 2) (* 3 4))
→ (+ (* 1 2) 12)
→ (+ 2 12)
→ 14
• As we pointed out above, the expression (λx.x x)(λx.x x)
does not have a terminating sequence of reductions.
55 Al Aho
Reduction Order Can Matter

• The expression (λy.λz.z)((λx.x x)(λx.x x)) can


be reduced to the normal form λz.z by first applying
the function (λy.λz.z) to the argument
((λx.x x)(λx.x x)). This reduction order, reducing
the leftmost outermost redex, corresponds to normal
form evaluation.

• On the other hand, if we first try to reduce the leftmost


innermost redex ((λx.x x)(λx.x x)), we discover it
always reduces to itself. It does not have a terminating
sequence of reductions. This reduction order
corresponds to applicative order evaluation.

56 Al Aho
Normal Form Evaluation

• In normal form evaluation we always reduce the


leftmost redex of the outermost redex at each step.
• This corresponds to call by name as in Algol 60.
• If an expression has a normal form, then normal order
evaluation will always find it.
• Normal order evaluation is sometimes known as lazy
evaluation and is the usual order of evaluation.

57 Al Aho
Applicative Order Evaluation

• In applicative order evaluation we always reduce the


leftmost outermost redex whose argument is in
normal form.
• This corresponds to call by value as in the
programming language C.
• Actual parameters are evaluated before being passed
to a function. Both the function and the argument are
reduced before the argument is substituted into the
body of the function.
• Even though an expression may have a normal form,
applicative order evaluation may fail to find it.
• Applicative order is sometimes called eager
evaluation.
58 Al Aho
Properties of Lambda Calculus

• We can construct pure lambda calculus expressions


(with no constants) to represent
– integers (Church numerals)
• 0 = λf.λx.x
• 1 = λf.λx.f x
• 2 = λf.λx.f(f x)
– arithmetic
• succ = λn.λf.λx.f(n f x)
• plus = λm.λn.λf.λx.m f(n f x)
– booleans
• true = λx.λy.x
• false = λx.λy.y
– logic
– recursion
– …
59 Al Aho
Recursion with the Y Combinator

• The fixed-point Y combinator is a function that takes a


function G as an argument and returns G(Y G).
• With repeated applications we can get G(G(Y G)),
G(G(G(Y G))),... .
• We can implement recursive functions by defining the
Y combinator:
Y = λf.(λx.f(xx))(λx.f(xx))
• Note that
YG = (λf.(λx.f(xx))(λx.f(xx)))G
→ (λx.G(xx))(λx.G(xx))
→ G((λx.G(xx))(λx.G(xx)))
= G(Y G)
60 Al Aho
The last line follows from Y G = (λx.G(xx))(λx.G(xx))
Summary

• Lambda calculus is Turing complete

• Lambda calculus is the model of computation


underlying functional programming languages

• References
– Simon Peyton Jones, The Implementation of Functional
Languages, Prentice-Hall, 1987
– Stephen Edwards, The Lambda Calculus
http://www.cs.columbia.edu/~sedwards/classes/2012/w4115-fall/index.html

61 Al Aho

You might also like