Title: Chapter 4 Fundamentals Semantics of Programming Languages
 1 Chapter 4Fundamentals (Semantics of 
Programming Languages) 
 2Outline
- Compilers A review 
 - Syntax specification 
 - BNF (EBNF) 
 - Semantics specification 
 - Static semantics 
 - Attribute grammar 
 - Dynamic semantics 
 - Operational semantics 
 - Denotational semantics 
 - Axiomatic semantics 
 - Lambda Calculus 
 
  3References
- Concepts in Programming Languages by J. Mitchel 
textbook Chapter 4  - Programming Languages Principles and Paradigms 
by Allan Tucker and R. Noonan, Chapter 3 
Handout  - Concepts of Programming Languages by R. 
Sebesta, 6th Edition, Chapter 3. 
  4Denotational Semantics
- Denotational semantics of a language defines the 
meanings of abstract language elements as a 
collection of environment- and state-transforming 
functions  -  M  Class ? ? ? ? 
 - ? Is the set of all program states ? 
 - Environment of a program is the set of objects 
and types that are active at each step during its 
execution  - State of a program is the set of all active 
objects and their current values. 
  5Denotational Semantics
- Denotational semantics defines the meaning of a 
program as a series of state transformations 
resulting from the application of a series of 
functions M  - State-transforming functions individually define 
the meaning of every class of element that can 
occur in the programs abstract syntax tree like 
program, block, assignment, expression, 
conditional, loop, and others  - State-transforming functions are necessarily 
partial functions 
  6Denotational Semantics
- Denotational semantics 
 -  The meaning or denotation is associated with 
each program or program phrase like expression, 
statement, declaration, etc.  - Describe meaning of programs by specifying the 
mathematical  - Function 
 - Function on functions 
 - Value, such as natural numbers or strings 
 -  defined for each construct
 
  7Motivation
- Precision 
 - Use mathematics instead of English 
 - Avoid details of specific machines 
 - Aim to capture pure meaning apart from 
implementation details  - Basis for program analysis 
 - Justify program proof methods 
 - Soundness of type system, control flow analysis 
 - Proof of compiler correctness 
 - Language comparisons
 
  8Basic Principle of Denotational Semantics
- Compositionality 
 -  The meaning of a compound program must be 
defined from the meanings of its parts (not the 
syntax of its parts).  - Example 
 - P Q 
 -  composition of two functions, state ? 
state  - Object language and metalanguage 
 
  9Trivial Example Binary Numbers
- Syntax 
 - b ? 0  1 
 - n ? b  nb 
 - e ? n  ee 
 - Semantics value function E  exp -gt numbers 
 - E  0   0 
 - E  1   1 
 - E  nb   2E n   E b  
 - E  e1e2   E e1   E e2  
 - Obvious, but different from compiler evaluation 
using registers, etc.  - This is a simple machine-independent 
characterization ... 
  10Second Example Expressions w/vars
- Syntax 
 - d ? 0  1  2    9 
 - n ? d  nd 
 - e ? x  n  e  e 
 - Semantics value E  exp ? state ? numbers 
 -  state s  vars ? 
numbers  - E  x  s  s(x) 
 - E  0  s  0 
 - E  1  s  1  
 - E  nd  s  10E n  s  E d  s 
 - E  e1  e2  s  E e1  s  E e2  s 
 -  
 
  11Semantics of Imperative Programs
- Syntax 
 - P  xe  if B then P else P  PP  
while B do P  - Semantics 
 - C  Programs  (State ? State) 
 -  State  (Variables ? Values) 
 -  would be locations ? values if we wanted to 
model aliasing 
Every imperative program can be translated into a 
functional program in a relatively simple, 
syntax-directed way.  
 12Semantics of Assignment
- C x e  
 - is a function states ? states 
 - C x e  s  s 
 - where s  variables ? values is identical to s 
except  - s(x)  E  e  s gives the value of e in 
state s  
  13Semantics of Conditional
- C if B then P else Q  
 - is a function states ? states 
 - C if B then P else Q  s  
 -   C P  s if E  B  s is true 
 -   C Q  s if E  B  s is false 
 -  Simplification assume B cannot diverge or have 
side effects 
  14Semantics of Iteration
- C while B do P  
 - is a function states ? states 
 - C while B do P   
 -  the function f such that 
 -  f(s)  s if E  B  s 
 is false  -  f(s)  f( C P (s) ) if E  B  s 
is true  -  
 
  15Denotational Semantics
- Using denotational semantics, the meaning of a 
program can be defined as  -  M  Program ? ? 
 - M (Program p) M (P.body, ltv1, undefgt, ltv2, 
undef gt,  ltvn, undef gt  - Normally abstract definition of a program 
consists of two parts declaration and body  -  Denotational semantics is straight forward to 
implement 
  16Denotational Semantics
- State M (Program p)  
 -  return M (p.body,initialState(p.decpart)) 
 -  
 - State initialState (Declarations d)  
 -  State sigma  new State() 
 -  Value undef  new Value() 
 -  for (int i  0 i lt d.size() i) 
 -  sigma.put(((Declaration)(d.elementAt(i))).v, 
undef)  -  return sigma 
 
  17Denotational Semantics
- Some state-transforming functions 
 - Expression 
 -  M expression ? state ? value 
 -  M (expression e, state ?) 
 -   e if e is a value 
 -   ?(e) if e is a variable 
 -   ApplyBinary (e.op, M(e.term1, ?), M(e.term2, 
?) ) if e is a binary 
  18Denotational Semantics
- Some state-transforming functions 
 - Conditional 
 -  M conditional ? state ? state 
 -  M (conditional c, state ?) 
 -   M (c.thenpart, ?) if M (c.test, ?) is true 
 -   M (c.elsepart, ?) if M (c.test, ?) is false 
 
  19Operational vs Denotational Semantics
- The difference between denotational and 
operational semantics  - In operational semantics, the state changes are 
defined by coded algorithms  - In denotational semantics, they are defined by 
rigorous mathematical functions 
  20Denotational Semantics of Expressions
- Me(ltexprgt, s) ? 
 -  case ltexprgt of 
 -  ltdec_numgt gt Mdec(ltdec_numgt, s) 
 -  ltvargt gt 
 -  if VARMAP(ltvargt, s)  undef 
 -  then error 
 -  else VARMAP(ltvargt, s) 
 -  ltbinary_exprgt gt 
 -  if (Me(ltbinary_exprgt.ltleft_exprgt, s)  
undef  -  OR Me(ltbinary_exprgt.ltright_exprgt, 
s)   -  undef) 
 -  then error 
 - else 
 -  if (ltbinary_exprgt.ltoperatorgt   then 
 -  Me(ltbinary_exprgt.ltleft_exprgt, s)  
 -  Me(ltbinary_exprgt.ltright_exprgt, s) 
 -  else Me(ltbinary_exprgt.ltleft_exprgt, s)  
 -  Me(ltbinary_exprgt.ltright_exprgt, s) 
 - ...
 
  21Denotational Semantics of Assignment Statement
- Assignment Statements 
 - Maps state sets to state sets 
 - Ma(x  E, s) ? 
 -  if Me(E, s)  error 
 -  then error 
 -  else s  lti1,v1gt,lti2,v2gt,...,ltin,vn
gt,  -  where for j  1, 2, ..., n, 
 -  vj  VARMAP(ij, s) if ij ltgt x 
 -   Me(E, s) if ij  x
 
  22Denotational Semantics of Loops
-  Logical Pretest Loops 
 - Maps state sets to state sets 
 - Ml(while B do L, s) ? 
 -  if Mb(B, s)  undef 
 -  then error 
 -  else if Mb(B, s)  false 
 -  then s 
 -  else if Msl(L, s)  error 
 -  then error 
 -  else Ml(while B do L, Msl(L, s))
 
  23Denotational Semantics of Loops
- The meaning of the loop is the value of the 
program variables after the statements in the 
loop have been executed the prescribed number of 
times, assuming there have been no errors  - In essence, the loop has been converted from 
iteration to recursion, where the recursive 
control is mathematically defined by other 
recursive state mapping functions  - Recursion, when compared to iteration, is easier 
to describe with mathematical rigor 
  24Evaluation of Denotational Semantics
- Evaluation of denotational semantics 
 - Can be used to prove the correctness of programs 
 - Provides a rigorous way to think about programs 
 - Can be an aid to language design 
 - Has been used in compiler generation systems 
 - Because of its complexity, they are of little use 
to language users