Top Banner
CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann
31

CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Dec 20, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

CS 330Programming Languages

09 / 18 / 2007

Instructor: Michael Eckmann

Page 2: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

Today’s Topics• Questions/comments?• Question from last time re: Context-sensitive

grammars• Syntax & Semantics

– Attribute grammars continued– Operational semantics– Axiomatic semantics– Denotational semantics

Page 3: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

CFG• A Context Free Grammar is a four-tuple

(T, N, S, P) where– T is the set of terminal symbols– N is the set of non-terminal symbols– S is the start symbol (which is one of the non-

terminals)– P is the set of productions of the form:

• A -> X1 . . . XM where– A element of N

– Xi element of N U T, 1 <= i <= m, m>=0

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

Page 4: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Syntax• The nonterminals are abstractions of language constructs

• The terminals are tokens and lexemes

• The productions are used to describe programs, individual statements, expressions etc.

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

Page 5: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Context-sensitive Grammar• A Context-sensitive Grammar is a four-tuple

(T, N, S, P) where– T is the set of terminal symbols– N is the set of non-terminal symbols– S is the start symbol (which is one of the non-

terminals)– P is the set of productions of the form:– xAy -> xby where

• A element of N

• x, b, y element of (N U T)* = 0 or more terminals and non-terminals

– another rule with empty stringMichael Eckmann - Skidmore College - CS 330 - Fall 2007

Page 6: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Syntax• While it is true that CFG cannot fully describe

programming languages in general, CSG's are generally not useful for program language definitions because

– inappropriate– too complicated

• The other two kinds of formal grammars in the Chomsky hierarchy are– regular grammars (we will learn about these when we

learn regular expressions)– unrestricted (any language accepted by a Turing

Machine)Michael Eckmann - Skidmore College - CS 330 - Fall 2007

Page 7: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Syntax• Recognizers and generators are used to define languages.

• Generators generate valid programs in a language.

• Recognizers determine whether or not a program is in the language (valid syntactically.)

• Generators are studied in Chapter 3 (stuff coming up next in this lecture) and recognizers (parsers) in Chapter 4.

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

Page 8: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Attribute Grammars

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• The example on page 138 shows the use of an attribute grammar to enhance the BNF of an assignment statement with rules that specify the allowable types that can be assigned to each other.

• e.g. A float (real) cannot be assigned to a variable whose type is int. But the opposite is allowed.

• Also, the example shows how one can determine the resulting type of an expression.

Page 9: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Attribute Grammars

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• I'm not concerned with us knowing all the ins and outs of attribute grammars, but what I feel is important is the general concepts involved and the intended purpose of them.

• Attribute grammars are generally not used in practice for a few reasons. Can you guess them?

Page 10: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Attribute Grammars

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Attribute grammars are generally not used in practice for a few reasons. Can you guess them?

– Size and complexity of the grammar will be high for a typical modern programming language

– The many attributes and rules that need to be added cause the grammar to be difficult to read and write, formally

– The attribute values during parsing would be costly to evaluate (the way it is described in the text.)

• So, in practice less formal ways are used to check for “static semantics” at compile-time but the ideas are the same.

Page 11: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Practice Problems

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Before moving on to our discussion of formally describing the Semantics of a language, let's take a look at problem 8, 10 and 11 on pages 163-164.

Page 12: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Now that we know how to specify the syntax of a language, we move to specifying the semantics of a language.

• The text uses the phrase “dynamic semantics” and semantics interchangeably.

• Semantics is harder to describe than syntax.• Programmers need to know the semantics of the

syntax and so do compiler writers.

Page 13: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Both programmers and compiler writers often rely on English descriptions of the language.

• Why might you think? • Are there any problems with this?

Page 14: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Our text describes 3 different ways to formally describe the semantics of a programming language.– Operational semantics– Axiomatic semantics– Denotational semantics

• We will cover these superficially --- just enough to give you an idea of how they work and how they differ from each other.

Page 15: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Operational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• First create a converter from the language you wish to describe semantically to some lower level language (e.g. assembly). Then, execute the statements of the lower level language on a real or simulated machine. Examine the behaviour of the statements by looking at the state of the machine before and after.

• The state of a machine includes the values of CPU registers, values of memory locations, etc.

• The changes of the state determine the meaning of the language statements.

Page 16: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Operational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• The conversions that the converter from the language to a lower level language uses can be used to describe the semantics of the different language constructs to a programmer as is often done in manuals.

• This way is good if used informally as for programming manuals. However, it is extremely complex, formally.

Page 17: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Operational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Example:– To describe a while loop in Java using operational

semantics one might do the following:

while (expr)

{

// statements

}

So, assuming the programmer can understand all the code in the “lower level” language in the operational semantics description of the code, then he/she can understand how the while loop construct works.

Operational semantics for a while loop:

label: if (expr)

{

// statements

goto label;

}

Page 18: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Operational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Operational semantics can be summed up as:• The statements in one language (the one you're trying to

describe semantically) are described in terms of a lower-level programming language. (page 141 in Sebesta).

• Operational semantics uses lower level programming languages not mathematics.

• The other two methods (which are about to be described) are more formal and based on logic and mathematics.

Page 19: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Based on formal logic (predicate calculus)– Original purpose was for formal program verification

--- that is, to prove the correctness of programs– We define axioms or inference rules for each

statement type in the language (to allow transformations of expressions to other expressions)

– The expressions are called assertions (aka predicates)

Page 20: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• An assertion before a statement is a precondition and states the relationships and constraints among variables that are true at that point in execution

• An assertion following a statement is a postcondition

• A weakest precondition is the least restrictive precondition that will guarantee the postcondition

Page 21: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Notation for specifying the Axiomatic semantics of a statement: {P} statement {Q}

• {P} is precondition, {Q} is postcondition• Example: a = b + 1 {a > 1}

– Read this as a must be greater than one after this statement executes. So,

– One possible precondition: {b > 4}– What's the weakest precondition here? In other

words “what's the least restrictive precondition that will guarantee that a is > 1 after the statement?”

Page 22: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• For: a = b + 1 {a > 1}– The weakest precondition is: {b > 0}– Because a > 1 implies that b + 1 has to be > 1 which

implies that b must be > 0.

Page 23: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Looking at the big picture, we might be able to gleam from the example that to prove program correctness, one might have a post condition for the entire program and then work backwards through the program until we get to the beginning and generate a weakest precondition for the entire program. If that is within the program specifications, then it is correct.

• What does that mean?• What would we do as we went backwards through the

program?

Page 24: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• When multiple statements or more complex structures are involved, we need what are called inference rules.

• For a sequence of statements S1;S2:• {P1} S1 {P2}• {P2} S2 {P3}• The inference rule is:

• And it is read like: If {P1}S1 {P2} is true and {P2} S2 {P3} is true, then we infer that {P1} S1,S2 {P3} is true.

P1 S1 P2 , P2 S2 P3P1 S1; S2 P3

Page 25: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• It gets more complex to determine the precondition for while loops and other structures that might iterate different numbers of times depending on values of variables.

Page 26: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Developing axioms or inference rules for all of the statements in a language is difficult

• It is a good tool for correctness proofs, but there are limits to this (or any) approach that tries to prove correctness of an arbitrary program.

• It is an excellent framework for reasoning about programs

• It is not very useful for language users and compiler writers

Page 27: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Axiomatic Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Before moving on to Denotational Semantics let's try problem 20 a) on page 165

Page 28: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Denotational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• This is the most widely known and rigorous method for describing the semantics (meaning) of programs.

• The book only touches on how it works and we will do the same.

Page 29: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Denotational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• The process of building a denotational specification for a language (not necessarily easy):– Define a mathematical object for each language

entity– Define a function that maps instances of the

language entities onto instances of the corresponding mathematical objects

Page 30: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Denotational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

• Example:– The following (next slide) denotational semantics

description maps decimal numbers as strings of symbols into numeric values

– Mdec is the semantic function and it is used to map the syntactic objects to the decimal numbers (their meaning)

Page 31: CS 330 Programming Languages 09 / 18 / 2007 Instructor: Michael Eckmann.

Denotational Semantics

Michael Eckmann - Skidmore College - CS 330 - Fall 2007

<dec_num> '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | <dec_num> ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')Mdec- a function that maps from the syntactic elements to their meaning

Mdec('0') = 0, Mdec ('1') = 1, …, Mdec ('9') = 9

Mdec (<dec_num> '0') = 10 * Mdec (<dec_num>)

Mdec (<dec_num> '1’) = 10 * Mdec (<dec_num>) + 1…

Mdec (<dec_num> '9') = 10 * Mdec (<dec_num>) + 9