Formal Syntax and Semantics of Programming Languages

Similar documents
Formal Syntax and Semantics of Programming Languages

Formal Semantics of Programming Languages

Formal Semantics of Programming Languages

Formal Semantics of Programming Languages

Semantics with Applications 3. More on Operational Semantics

Program Analysis: Lecture 02 Page 1 of 32

Application: Programming Language Semantics

Exercises on Semantics of Programming Languages

PROGRAM ANALYSIS & SYNTHESIS

Pierce Ch. 3, 8, 11, 15. Type Systems

Lecture 5 - Axiomatic semantics

Big-step Operational Semantics (aka Natural Semantics)

More Untyped Lambda Calculus & Simply Typed Lambda Calculus

Fall Compiler Principles Lecture 5: Intermediate Representation. Roman Manevich Ben-Gurion University of the Negev

COS 320. Compiling Techniques

Semantics via Syntax. f (4) = if define f (x) =2 x + 55.

Handout 9: Imperative Programs and State

The exercises and answer for programming language class

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

Formal semantics of loosely typed languages. Joep Verkoelen Vincent Driessen

Programming Languages Third Edition

Induction and Semantics in Dafny

More on Operational Semantics

2 Introduction to operational semantics

CONVENTIONAL EXECUTABLE SEMANTICS. Grigore Rosu CS522 Programming Language Semantics

Equivalence of NTMs and TMs

Data Flow Analysis using Program Graphs

Fall Compiler Principles Lecture 6: Intermediate Representation. Roman Manevich Ben-Gurion University of the Negev

Intro to semantics; Small-step semantics Lecture 1 Tuesday, January 29, 2013

Programming Languages and Compilers Qualifying Examination. Answer 4 of 6 questions.

Programming Languages Fall 2014

CONVENTIONAL EXECUTABLE SEMANTICS. Grigore Rosu CS422 Programming Language Design

Lambda Calculus. Concepts in Programming Languages Recitation 6:

CIS 500 Software Foundations Fall October 2

Mutable References. Chapter 1

CONVENTIONAL EXECUTABLE SEMANTICS. Grigore Rosu CS422 Programming Language Semantics

Principles of Programming Languages

1. Abstract syntax: deep structure and binding. 2. Static semantics: typing rules. 3. Dynamic semantics: execution rules.

COMP 507: Computer-Aided Program Design

COSC252: Programming Languages: Semantic Specification. Jeremy Bolton, PhD Adjunct Professor

CS 6110 S14 Lecture 38 Abstract Interpretation 30 April 2014

Module 27 Switch-case statements and Run-time storage management

Control Structures. Outline. In Text: Chapter 8. Control structures Selection. Iteration. Gotos Guarded statements. One-way Two-way Multi-way

Big-step Operational Semantics Revisited

Modal Logic: Implications for Design of a Language for Distributed Computation p.1/53

Semantics of COW. July Alex van Oostenrijk and Martijn van Beek

COMP 382: Reasoning about algorithms

Chapter 3. The While programming language

Principles of Programming Languages

Static Program Analysis

Compiler Construction

Type Safety. Java and ML are type safe, or strongly typed, languages. C and C++ are often described as weakly typed languages.

Compiler Construction

Static Program Analysis

02157 Functional Programming Interpreters for two simple languages including exercises

Overview. Probabilistic Programming. Dijkstra s guarded command language: Syntax. Elementary pgcl ingredients. Lecture #4: Probabilistic GCL

Compiler Construction

The PCAT Programming Language Reference Manual

Checks and Balances - Constraint Solving without Surprises in Object-Constraint Programming Languages: Full Formal Development

Part II. Hoare Logic and Program Verification. Why specify programs? Specification and Verification. Code Verification. Why verify programs?

The Rule of Constancy(Derived Frame Rule)

Mosig M1 - PLSCD Written exam

Formal Specification and Verification

CSE 504: Compiler Design. Runtime Environments

Compiler Construction

Compiler Construction

Formal Systems and their Applications

6. Hoare Logic and Weakest Preconditions

Compiler Construction

3.7 Denotational Semantics

Shared Variables and Interference

Verifying Safety Property of Lustre Programs: Temporal Induction

Software Engineering using Formal Methods

Programming Languages and Compilers Qualifying Examination. Answer 4 of 6 questions.1

Static analysis and all that

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

Shared Variables and Interference

From IMP to Java. Andreas Lochbihler. parts based on work by Gerwin Klein and Tobias Nipkow ETH Zurich

Self-stabilizing Spanning Tree

CSCC24 Functional Programming Scheme Part 2

A Structural Operational Semantics for JavaScript

Chapter 3. Describing Syntax and Semantics ISBN

Software Engineering using Formal Methods

Propositional Logic Formal Syntax and Semantics. Computability and Logic

Definition: A context-free grammar (CFG) is a 4- tuple. variables = nonterminals, terminals, rules = productions,,

HW/SW Codesign. WCET Analysis

Iterative Statements. Iterative Statements: Examples. Counter-Controlled Loops. ICOM 4036 Programming Languages Statement-Level Control Structure

CIS 1.5 Course Objectives. a. Understand the concept of a program (i.e., a computer following a series of instructions)

Well, you need to capture the notions of atomicity, non-determinism, fairness etc. These concepts are not built into languages like JAVA, C++ etc!

UNIT 3

CS152: Programming Languages. Lecture 2 Syntax. Dan Grossman Spring 2011

High-Level Language VMs

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages

Syntax vs. semantics. Detour: Natural deduction. Syntax vs. semantics (cont d) Syntax = grammatical structure Semantics = underlying meaning

Lambda Calculus: Implementation Techniques and a Proof. COS 441 Slides 15

Software Model Checking. From Programs to Kripke Structures

Semantics. There is no single widely acceptable notation or formalism for describing semantics Operational Semantics

CS4215 Programming Language Implementation. Martin Henz

JVM ByteCode Interpreter

Formal Methods. CITS5501 Software Testing and Quality Assurance

Transcription:

Formal Syntax and Semantics of Programming Languages Mooly Sagiv Reference: Semantics with Applications Chapter 2 H. Nielson and F. Nielson http://www.daimi.au.dk/~bra8130/wiley_book/wiley.html

The While Programming Language Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S Use parenthesizes for precedence Informal Semantics skip behaves like no-operation Import meaning of arithmetic and Boolean operations

axioms Natural Semantics for While [ass ns ] <x := a, s> s[x A a s] [skip ns ] <skip, s> s [while ff ns] <while b do S, s> s if B b s=ff rules [if tt ns] [comp ns ] <S 1, s> s, <S 2, s > s <S 1 ; S 2, s> s <S 1, s> s <if b then S 1 else S 2, s> s if B b s=tt [if ff ns] <S 2, s> s <if b then S 1 else S 2, s> s if B b s=ff [while tt ns] <S, s> s, <while b do S, s > s <while b do S, s> s if B b s=tt

An Example Derivation Tree <(x :=x+1; y :=x+1) ; z := y), s0> s0[x 1][y 2][z 2] compns <x :=x+1; y :=x+1, s0> s0[x 1][y 2] <z :=y,s0[x 1][y 2]> s0[x 1][y 2][z 2] compns assns <x :=x+1; s0> s0[x 1] <y :=x+1, s0[x 1]> s0[x 1][y 2] assns assns

Top Down Evaluation of Derivation Trees Given a program S and an input state s Find an output state s such that <S, s> s Start with the root and repeatedly apply rules until the axioms are reached Inspect different alternatives in order In While s and the derivation tree is unique

Semantic Equivalence S 1 and S 2 are semantically equivalent if for all s and s <S 1, s> s if and only if <S 2, s> s Simple example while b do S is semantically equivalent to: if b then (S ; while b do S) else skip

Deterministic Semantics for While If <S, s> s 1 and <S, s> s 2 then s 1 =s 2 The proof uses induction on the shape of derivation trees Prove that the property holds for all simple derivation trees by showing it holds for axioms Prove that the property holds for all composite trees: For each rule assume that the property holds for its premises (induction hypothesis) and prove it holds for the conclusion of the rule

The Semantic Function S ns The meaning of a statement S is defined as a partial function from State to State S ns : Stm (State State) S ns S s = s if <S, s> s and otherwise S ns S s is undefined Examples S ns skip s =s S ns x :=1 s = s [x 1] S ns while true do skip s = undefined

Structural Operational Semantics Emphasizes the individual execution steps <S, i> If the first step of executing the statement S on an input state i leads to Two possibilities for = <S, s > = o The execution of S is not completed, S is the remaining computation which need to be performed on s The execution of S has terminated with a final state o is a stuck configuration when there are no transitions The meaning of a program P on an input state s is the set of final states that can be executed in arbitrary finite steps

axioms Structural Semantics for While [ass sos ] <x := a, s> s[x A a s] [skip sos ] <skip, s> s rules [comp 1 sos] <S 1, s> <S 1, s > <S 1 ; S 2, s> < S 1 ; S 2, s > [comp 2 sos] <S 1, s> s <S 1 ; S 2, s> < S 2, s >

Structural Semantics for While if construct [if tt sos] <if b then S 1 else S 2, s> <S 1, s> if B b s=tt [if ff os] <if b then S 1 else S 2, s> <S 2, s> if B b s=ff

Structural Semantics for While while construct [while sos ] <while b do S, s> <if b then (S; while b do S) else skip, s>

Structural Semantics for While (Summary) axioms rules [ass sos ] <x := a, s> s[x A a s] [skip sos ] <skip, s> s [if tt sos] <if b then S 1 else S 2, s> <S 1, s> [if ff sos] <if b then S 1 else S 2, s> <S 2, s> if B b s=tt if B b s=ff [while sos ] <while b do S, s> <if b then (S; while b do S) else skip, s> [comp 1 sos] <S 1, s> <S 1, s > <S 1 ; S 2, s> < S 1 ; S 2, s > [comp 2 sos] <S 1, s> s <S 1 ; S 2, s> < S 2, s >

S=[x 5, y 7] S = (z:=x; x := y); y := z Example (z:=x; x := y); y := z, [x 5, y 7] => x := y ; y := z, [x 5, y 7, z 5] comp 1 sos comp 2 sos ass sos z:= x; x := y, [x 5, y 7] => x := y ; y := z, [x 5, y 7, z 5] z:= x, [x 5, y 7] => [x 5, y 7, z 5]

S=[x 5, y 7] S = (z:=x; x := y); y := z Example (2 nd step) x := y; y := z, [x 5, y 7, z 5] => y := z, [x 7, y 7, z 5] comp 2 sos x := y, [x 5, y 7, z 5] => x := y ; y := z, [x 7, y 7, z 5] ass sos

S=[x 5, y 7] S = (z:=x; x := y); y := z Example (3 rd step) y := z [x 7, y 7, z 5] => y := z, [x 7, y 5, z 5] ass sos

Factorial Program Input state s such that s x = 3 y := 1; while (x=1) do (y := y * x; x := x - 1) <y :=1 ; W, s> <W, s[y 1]> <if (x =1) then (y := y * x ; x := x 1 else skip); W), s[y 1]> < ((y := y * x ; x := x 1); W), s[y 1]> <(x := x 1 ; W), s[y 3]> < W, s[y 3][x 2]> <if (x =1) then ((y := y * x ; x := x 1); W) else skip, s[y 3][x 2]> < ((y := y * x ; x := x 1); W), s[y 3] [x 2] > <(x := x 1 ; W), s[y 6] [x 2] > < W, s[y 6][x 1]> <if (x =1) then (y := y * x ; x := x 1); W) else skip, s[y 6][x 1]> <skip, s[y 6][x 1]> s[y 6][x 1]

Finite Derivation Sequences finite derivation sequence starting at <S, i> 0, 1, 2, k such that 0 =<S, i> i i+1 k is either stuck configuration or a final state For each step there is a derivation tree 0 k k in k steps 0 * in finite number of steps

Infinite Derivation Sequences An infinite derivation sequence starting at <S, i> 0, 1, 2 such that 0 =<S, i> i i+1 Example S = while true do skip s 0 x = 0

Program Termination Given a statement S and input s S terminates on s if there exists a finite derivation sequence starting at <S, s> S terminates successfully on s if there exists a finite derivation sequence starting at <S, s> leading to a final state S loops on s if there exists an infinite derivation sequence starting at <S, s>

Properties of the Semantics S 1 and S 2 are semantically equivalent if: for all s and which is either final or stuck <S 1, s> * if and only if <S 2, s> * there is an infinite derivation sequence starting at <S 1, s> if and only if there is an infinite derivation sequence starting at <S 2, s> Deterministic If <S, s> * s 1 and <S, s> * s 2 then s 1 =s 2 The execution of S 1 ; S 2 on an input can be split into two parts: execute S 1 on s yielding a state s execute S 2 on s

Sequential Composition If <S 1 ; S 2, s> k s then there exists a state s and numbers k 1 and k 2 such that <S 1, s> k1 s <S 2, s > k2 s and k = k 1 + k 2 The proof uses induction on the length of derivation sequences Prove that the property holds for all derivation sequences of length 0 Prove that the property holds for all other derivation sequences: Show that the property holds for sequences of length k+1 using the fact it holds on all sequences of length k (induction hypothesis)

The Semantic Function S sos The meaning of a statement S is defined as a partial function from State to State S sos : Stm (State State) S sos S s = s if <S, s> * s and otherwise S sos S s is undefined

An Equivalence Result For every statement S of the While language S nat S = S sos S

Extensions to While Abort statement (like C exit w/o return value) Non determinism Parallelism Local Variables Procedures Static Scope Dynamic scope

The While Programming Language with Abort Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S abort Abort terminates the execution No new rules are needed in natural and structural operational semantics Statements if x = 0 then abort else y := y / x skip abort while true do skip

Examples <if x = 0 then abort else y := y / x, s> s if s x = 0 then undefined else s [y s y / sx] <skip, s> s For no s: <abort, s> s For no s: <while b do skip, s> s

Undefined semantics in C Pointer dereferences x = *p; if (p!=null) x = *p; else abort; Pointer arithmetic x = a[i]; if (i <alloc(a)) x = *(a+i); else abort; Structure boundaries

Undefined semantics in Java? What about exceptions?

Pros and Cons of PLs with Undefined Semantics Benefits Performance Expressive power Simplicity of the programming language Disadvantages Security Portability Predictability Programmer productivity

Formulating Undefined semantics A programming language is type safe if correct programs cannot go wrong No undefined semantics But runtime exceptions are fine For every program P For every input state s one of the following holds: <P, s> * s for some final state s <P, s> i for all i While is type safe and while+abort is not

Conclusion The natural semantics cannot distinguish between looping and abnormal termination (unless the states are modified) In the structural operational semantics looping is reflected by infinite derivations and abnormal termination is reflected by stuck configuration

The While Programming Language with Non-Determinism Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S S 1 or S 2 Either S 1 or S 2 is executed Example x := 1 or (x :=2 ; x := x+2)

The While Programming Language with Non-Determinism Natural Semantics [or 1 ns] <S 1, s> s <S 1 or S 2, s> s [or 2 ns] <S 2, s> s <S 1 or S 2, s> s

The While Programming Language with Non-Determinism Structural Semantics

The While Programming Language with Non-Determinism Examples x := 1 or (x :=2 ; x := x+2) (while true do skip) or (x :=2 ; x := x+2)

Conclusion In the natural semantics non-determinism will suppress looping if possible (mnemonic) In the structural operational semantics nondeterminism does not suppress not termination configuration

The While Programming Language with Parallel Constructs Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S S 1 par S 2 All the interleaving of S 1 or S 2 are executed Examples x := 1 par (x :=2 ; x := x+2) (x := 1; a :=y) par (y := 1; b :=x)

The While Programming Language with Parallel Constructs Structural Semantics [par 1 sos] <S 1, s> <S 1, s > <S 1 par S 2, s> < S 1 par S 2, s > [par 2 sos] <S 1, s> s <S 1 par S 2, s> < S 2, s > [par 3 sos] <S 2, s> <S 2, s > <S 1 par S 2, s> < S 1 par S 2, s > [par 4 sos] <S 2, s> s <S 1 par S 2, s> < S 1, s >

The While Programming Language with Parallel Constructs Natural Semantics

Conclusion In the natural semantics immediate constituent is an atomic entity so we cannot express interleaving of computations In the structural operational semantics we concentrate on small steps so interleaving of computations can be easily expressed

The While Programming Language with local variables Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S { L S } L ::= var x := a ; L

Simple Example { var y := 1; (var x := 2 ; { var x := 3 ; y := x + y // 4 } x := y + x // 6 ) }

Another Example while (y > 0) ( { var x := y ; y := x + y; y : = y -1 } x := y + x

Natural Semantics LHS : L 2 Var LHS( ) = LHS(var x := a ; L) = {x} LHS(L) s[x s ] = s x if x X s' x if x X [var ns ] [block ns ] [none ns ] <, s> s <L, s[x A a s]> s <var x := a; L, s> s <L, s> s, <S, s > s <{ L S }, s> s [LHS(L) s]

if (y > 0) then { } var x := y +1; y := x + y else skip ; y := y +x Simple Example <if (y > 0) ; y := y +x), [x 8, y 5] > [y 17, x 6] <if (y>0), [x 8, y 5] > [y 11, x 6] <var x := y +1;, [x 8, y 5] > [var ns ] <var x := y +1;, [x 8, y 5] > [y 5, x 6] compns <y := y +x, [y 11, x 6] <{ var x := y +1; y := x+ y }, [x 8, y 5]< [y 11, x 6] [none ns ] [y 5, x 6] [block ns ] [y 17, x 6] [if tt ns] <y := x+y, [y 5, x 6] > [y 11, x 6]

Structural Semantics? [block sos ] <begin D v S end, s> s

Conclusions Local Variables The natural semantics can remember local states Need to introduce stack or heap into state of the structural semantics

The While Programming Language with local variables and procedures Abstract syntax S::= x := a skip S 1 ; S 2 if b then S 1 else S 2 while b do S { L P S } call p L ::= var x := a ; L P ::= proc p is S ; P

Summary SOS is powerful enough to describe imperative programs Can define the set of traces Can represent program counter implicitly Handle gotos Natural operational semantics is an abstraction Different semantics may be used to justify different behaviors Thinking in concrete semantics is essential for language designer/compiler writer/