csc321: programming languages5-1 csc321: programming languages chapter 5: types 5.1type errors...

Post on 20-Dec-2015

234 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

CSC321: Programming Languages 5-1

CSC321: Programming LanguagesCSC321: Programming LanguagesChapter 5: Types

5.1 Type Errors5.2 Static and Dynamic Typing5.3 Basic Types5.4 NonBasic Types5.5 Recursive Data Types5.6 Functions as Types5.7 Type Equivalence5.8 Subtypes5.9 Polymorphism and Generics5.10 Programmer-Defined Types

CSC321: Programming Languages 5-2

• A type is a collection of values and operations on those values.

• Example: Integer type has values ..., -2, -1, 0, 1, 2, ... and operations +, -, *, /, <, ...

• The Boolean type has values true and false and operations , , .

• Computer types have a finite number of values due to fixed size allocation; problematic for numeric types.

TypesTypes

CSC321: Programming Languages 5-3

• Exceptions:– Smalltalk uses unbounded fractions.– Haskell type Integer represents

unbounded integers.• Floating point problems?

– Even more problematic is fixed sized floating point numbers:

• 0.2 is not exact in binary.• So 0.2 * 5 is not exactly 1.0• Floating point is inconsistent with real numbers in

mathematics.

Type ProblemsType Problems

CSC321: Programming Languages 5-4

• In the early languages, Fortran, Algol, Cobol, all of the types were built in.

• If needed a type color, could use integers; but what does it mean to multiply two colors.

• Purpose of types in programming languages is to provide ways of effectively modeling a problem solution.

Purpose of TypesPurpose of Types

CSC321: Programming Languages 5-5

Data InterpretationData Interpretation

• Machine data carries no type information.

• Basically, just a sequence of bits.

• Example: 0100 0000 0101 1000 0000 0000 0000 0000

– The floating point number 3.375– The 32-bit integer 1,079,508,992– Two 16-bit integers 16472 and 0– Four ASCII characters: @ X NUL NUL

CSC321: Programming Languages 5-6

• A type error is any error that arises because an operation is attempted on a data type for which it is undefined.

• Type errors are common in assembly language programming.

• High level languages reduce the number of type errors.

• A type system provides a basis for detecting type errors.

Type ErrorsType Errors

CSC321: Programming Languages 5-7

Type CheckingType Checking

• A type system imposes constraints such as the values used in an addition must be numeric.

• Cannot be expressed syntactically in EBNF.

• Some languages perform type checking at compile time (e.g., C).

• Other languages (e.g., Perl) perform type checking at run time.

• Still others (e.g., Java) do both.

CSC321: Programming Languages 5-8

• A language is statically typed if the types of all variables are fixed when they are declared at compile time.

• A language is dynamically typed if the type of a variable can vary at run time depending on the value assigned.

• Can you give examples of each?

Static and Dynamic TypingStatic and Dynamic Typing

CSC321: Programming Languages 5-9

• A language is strongly typed if its type system allows all type errors in a program to be detected either at compile time or at run time.

• A strongly typed language can be either statically or dynamically typed.

• Union types are a hole in the type system of many languages.

• Most dynamically typed languages associate a type with each value.

Strongly TypingStrongly Typing

CSC321: Programming Languages 5-10

Basic TypesBasic Types• Terminology in use with current 32-bit computers:

– Nibble: 4 bits

– Byte: 8 bits

– Half-word: 16 bits

– Word: 32 bits

– Double word: 64 bits

– Quad word: 128 bits

• In most languages, the numeric types are finite in size. So a + b may overflow the finite range.– Unlike mathematics: a+(b+c)(a+b)+c

• Also in C-like languages, the equality and relational operators produce an int, not a Boolean

CSC321: Programming Languages 5-11

• An operator or function is overloaded when its meaning varies depending on the types of its operands or arguments or result.

• Java: a + b (ignoring size)– integer add

– floating point add

– string concatenation

• Mixed mode: one operand an int, the other floating point, or one string and the other int

OverloadingOverloading

CSC321: Programming Languages 5-12

• A type conversion is a narrowing conversion if the result type permits fewer bits, thus potentially losing information.

• Otherwise it is termed a widening conversion.

• Should languages ban implicit narrowing conversions? Why?

• C++/Java: – Explicit narrowing conversion– Implicit widening conversion– How?

Type ConversionType Conversion

CSC321: Programming Languages 5-13

Non-basic TypesNon-basic Types

• Enumeration:– enum day {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

– enum day myDay = Wednesday;• In C/C++ the above values of this

type are 0, ..., 6.• More powerful in Java:

for (day d : day.values())

Sytem.out.println(d);

CSC321: Programming Languages 5-14

PointersPointers• C, C++, Ada, Pascal• Java???• Value is a memory address• Indirect referencing• Operator in C: *• Example: A Simple Linked List in C

struct Node {int key;struct Node* next;

};struct Node* head;

CSC321: Programming Languages 5-15

Pointer OperationsPointer Operations• If T is a type and ref T is a pointer:

& : T → ref T

* : ref T → T

• For an arbitrary variable x:*(&x) = x

• Increment/decrement

• String Copyvoid strcpy(char *p, char *q) {

while (*p++ = *q++) ;}

CSC321: Programming Languages 5-16

• Bane of reliable software development• Error-prone• Buffer overflow, memory leaks• Particularly troublesome in C

Problems with PointersProblems with Pointers

• float sum(float a[ ],int n) {int i;float s = 0.0;for (i = 0; i<n; i++) s += a[i];return s;

• }

• float sum(float *a,int n) {int i;float s = 0.0;for (i = 0; i<n; i++) s += *a++;

return s;• }

CSC321: Programming Languages 5-17

Dangling ReferencesDangling References

• A dangling reference is a pointer to storage that is being used for another purpose; typically, the storage has been deallocated

• Dangling reference may cause a program either crashing or giving the wrong results

• Dangling reference may be caused by– Deallocation operations: a storage that is being

pointed to by a pointer has been deallocated. – Procedure/function/method returns: the address of a

local variable in a procedure is returned as the return value. Consider the following situation (C/C++):

CSC321: Programming Languages 5-18

ArraysArrays• A set of elements, but different languages

have different ways to deal with arrays• Basically, an array has the following

attributes:• Data type – the type of all elements• Dimension – number of dimensions: 1-dim,

2-dim, 3-dim, etc• Range of dimensions – lower and upper

bound for each dimension• Subscripts – index. Most languages use

integer, but others such as Pascal/Ada allow any discrete types

CSC321: Programming Languages 5-19

Arrays LayoutArrays Layout

• 1-dim array: consecutive locations• High-dim array:

– Row-major layout: consecutive locations arranged row by rowe.g. a[3][3]: a[0,0], a[0,1], a[0,2], a[1,0], a[1,1], a[1,2], a[2,0], a[2,1], a[2,2]

– Column-major layout: arranged column by columne.g. a[3][3]: a[0,0], a[1,0], a[2,0], a[0,1], a[1,1], a[2,1], a[0,2], a[1,2], a[2,2]

CSC321: Programming Languages 5-20

Arrays Arrays Element Accessing Element Accessing

• Element notation:– C/C++, Java, Algol: a[i][j][k]– Pascal: a[i, j, k]– Fortran: a(i, j, k), same as a function.

Actually, Fortran treats accessing array elements as performing function evaluation

• Pointer accessing:– C/C++ can use pointers to access array

elements

CSC321: Programming Languages 5-21

• Equivalence between arrays and pointers: a = &a[0]

• If either e1 or e2 is type: ref T: e1[e2]=*((e1)+(e2))

• Example: a is float[ ] and i int: a[i] = *(a + i)– double a[16];– double *b;– b = &a[0]; // assign the base address of a to b– b++; // move b to the next location: a[1]– b + i; // move b to the next i-th location: a[i+1]

Arrays and PointersArrays and Pointers

CSC321: Programming Languages 5-22

• Index computation: Loc• Assume: base – the location of the first element

low – the lower boundupp – the upper boundw – the length of one element

• 1-dim: Loc(a[i]) = base + w*(i-low) = (base – low *w) + i*w = c + i*w, where c = base – low*w is a constant

• 2-dim: Loc(a[i,j]) = base + w*[ r*(i-low1) + (j-low2) ]= base - w*( r*low1 + low2) + w*(r*i + j)

where r = the number of rows above a[i,j], which is (upp2-low2 + 1)

3-dim: Loc(a[i,j,k]) = base + w*[r2*(r1*(i-low1) + (j-low2)) + (k-low3)]where r1 = (upp2-low2+1), r2 = (upp3-low3+1) ??

Arrays Arrays IndexingIndexing

CSC321: Programming Languages 5-23

• Name-size binding – bound evaluation: how many storage

cells should be allocated to an array

• Static binding – static evaluation: fixed size, determined at compile time, allocated at load time

– Advantages: easy; efficient

– Disadvantages: inflexible, waste storage

• Dynamic binding – dynamic evaluation: changeable size, determined at run time, allocated dynamically

– E.g. Java: Declare: double a[];

Create: a = new double[10];

a = new double[15];

• Extendable arrays: APL, SNOBOL, Perl

– Java also has a kind of extendable array: Vector v = new Vector(5);

Arrays Arrays BindingBinding

CSC321: Programming Languages 5-24

• Semi-dynamic binding – evaluation upon procedure entry: Ada, Pascal, C/C++, Java– The size (range of dimension) is a parameter.– Once the parameter is determined, the array size is fixed

E.g. C/C++: double fun(int n) { double a[n]; …}

Ada: declare

m, n: Integer;

begin

declare

type Matrix is array(Integer range<>,

Integer range<>) of Real;

a: Matrix(1..m, 1..n);

begin … end

…end

Arrays Arrays BindingBinding

CSC321: Programming Languages 5-25

• Some languages treat array as object/package, and maintain its attributes– E.g. Java: length --- a.length the size of a– Ada: range: a’range

Lower bound: a’first

Upper bound: a’last

• With these attributes, when an array is passed as a parameter, do not need to specify the number of elements in the array

• However, some languages have to specify the length as a parameter– E.g. in C, array is passed by reference (call-by-reference) and does

not have the length attribute.

Array AttributesArray Attributes

CSC321: Programming Languages 5-26

StringsStrings

• A special kind of array Now so fundamental, directly supported.

• In C, a string is a 1D array with the string value terminated by a NUL character (value = 0).

• In Java, Perl, Python, a string variable can hold an unbounded number of characters.

• Libraries of string operations and functions.– Comparison, selection of substring, searching, matching

(Most languages)– Replacement, appending, substring deletion (SNOBOL) – Concatenation: produce a new string– Java: String (static) and StringBuffer (dynamic)

CSC321: Programming Languages 5-27

Structures/RecordsStructures/Records• Composed from simpler data items

• Each data item (field) has a name

• Data items may have different types (recall array, all elements must be in the same type)

• Access to fields mostly uses .(dot) expression

C/C++:

struct Date {

int day;

int month;

int year;

}

C: struct Date adate;

C++: Date adate;

Access: adate.day

Pascal:

type Date =

record

day: Integer;

month: Integer;

year: Integer;

end

var adate: Date;

Access: adate.day

CSC321: Programming Languages 5-28

Structures/RecordsStructures/Records• The order of fields in the record has no effect

on the meaning

• When a variable of record is declared, it is allocated storage

• Record assignment is to assign all fields in a record

• Collection of elements of different types

• Used first in Cobol, PL/I

• Absent from Fortran, Algol 60

• Common to Pascal-like, C-like languages

• Omitted from Java as redundant

CSC321: Programming Languages 5-29

Comparison of Arrays and RecordsComparison of Arrays and Records

• Component: all elements in an array have the same type, while components (fields) of a record may be different

• Access: array elements are accessed by subscripts and element locations are determine at run time, while record components are accessed by dot expression and component names are determined at compile time

• Assignment: array assignment is to assign the base location, while record assignment is to assign all components

CSC321: Programming Languages 5-30

UnionsUnions• C: union

• Pascal: case-variant record

• Logically: multiple views of same storage

• Useful in some systems applications

type union =record

case b : boolean oftrue : (i :

integer);false : (r : real);

end;var tagged : union;begin tagged :=

(b => false, r => 3.375);put(tagged.i); -- error

end

CSC321: Programming Languages 5-31

class Value extends Expression { // Value = int intValue | boolean

boolValue Type type; int intValue; boolean boolValue; Value(int i) { intValue = i; type = new Type(Type.INTEGER);

}Value(boolean b) { boolValue = b;

type = new Type(Type.BOOLEAN); }}

Simulated union typeSimulated union type

CSC321: Programming Languages 5-32

Recursive Data TypeRecursive Data Type

• Type definition refers to another type that refers to the current type definition

• E.g. type link = cell; // refer to cell

type cell = record

data: integer;

next: link; // refer to link

end;

CSC321: Programming Languages 5-33

Dynamic Data TypeDynamic Data Type

• With dynamic data structures, you can not only operate on the data items in the structure, but also change the structure

• Usually constructed with static data structures (such as arrays and records) and pointers

• E.g. Linked lists, Trees• The basic components of these structures are

records that contain pointers: nodes. Usually, each node has two parts: data items, and links (pointers/references)

CSC321: Programming Languages 5-34

Functions as TypesFunctions as Types• Pascal example:

– function newton(a, b: real; function f: real): real;

– Know that f returns a real value, but the arguments to f are unspecified.

• Java example• public interface RootSolvable {• double valueAt(double x);• }• public double Newton(double a, double b, RootSolvable f);

CSC321: Programming Languages 5-35

Type Names and EquivalenceType Names and Equivalence

• Type names – Each type may or may not have a name,

such as int, Integer, Char, etc. are type names; while array [0..9] of integer is an anonymous type.Name equivalence

• Type equivalence– Name equivalence– Structural equivalence

CSC321: Programming Languages 5-36

Type Name EquivalenceType Name Equivalence

• Name equivalence: have the same name type• Pure name equivalence: exactly same name• Transitive name equivalence:

– if S is equivalent to T which is equivalent to U, then S is equivalent to U

• Type expression equivalence: – A type name is equivalent to itself. – Two type expressions are equivalent if they are

formed by applying the same constructor to equivalent expressions.

CSC321: Programming Languages 5-37

Type Structural EquivalenceType Structural Equivalence• Two type expressions are structurally equivalent if and

only if they are equivalent under the following three rules– A type name is structurally equivalent to itself– Two types are structurally equivalent if they are formed by

applying the same type constructor to structurally equivalent types

– After a type declaration, type n = T, the type name n is structurally equivalent to T

• Examples– integer is structurally equivalent to integer– Types S and T are structurally equivalent if they are declared as

• type S = array [0..9] of integer;• type T = array [0..9] of integer;

– Types S and integer are structurally equivalent if S is declared as: type S = integer;

CSC321: Programming Languages 5-38

struct complex { float re, im; };struct polar { float x, y; };struct { float re, im;} a, b;

struct complex c, d; struct polar e;int f[5], g[10];which are equivalent types: a, b, c, d, e, f, g?

Type EquivalenceType Equivalence

CSC321: Programming Languages 5-39

• Pascal uses name equivalence, but ambiguous.

• Modula-2 (the successor of Pascal) defines two types S and T to be compatible if– S and T are the same name, or– S = T is a type declaration: type S = T; or type T

= S; or– One is a subrange of the other; or– Both are subranges of the same basic types

• C uses structural equivalence for all types except records (struct)

Type Equivalence ImplementationsType Equivalence Implementations

CSC321: Programming Languages 5-40

SubtypesSubtypes• A subtype is a type that has certain constraints

placed on its values or operations.• In Ada subtypes can be directly specified.subtype one_to_ten is Integer range 1 .. 10;type Day is (Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday);subtype Weekend is Day range Saturday .. Sunday;type Salary is delta 0.01 digits 9 range 0.00 .. 9_999_999.99;subtype Author_Salary is Salary digits 5 range 0.0 .. 999.99;Integer i = new Integer(3);...Number v = i;...Integer x = (Integer) v;//Integer is a subclass of Number,// and therefore a subtype

CSC321: Programming Languages 5-41

Polymorphism and GenericsPolymorphism and Generics

• A function or operation is polymorphic if it can be applied to any one of several related types and achieve the same result.

• An advantage of polymorphism is that it enables code reuse.

CSC321: Programming Languages 5-42

PolymorphismPolymorphism

• Comes from Greek, and means having many forms

• Example: overloaded built-in operators and functions+ - * / == != ...

– Ada, C++: define + - ... for new types

– Java overloaded methods: number or type of parameters

• Example: class PrintStream

print, println defined for:

boolean, char, int, long, float, double, char[ ]

String, Object

– Java: + also used for string concatenation

– Java: instance variable, method: e.g., name, name( )

CSC321: Programming Languages 5-43

GenericsGenerics

• Ada generics: generic sort (Figs. 5.10 and 5.11)– parametric polymorphism– type binding delayed from code

implementation to compile time– procedure sort is new generic_sort(integer);

• Java generic classes

• C/C++ templates

CSC321: Programming Languages 5-44

Programmer-defined TypesProgrammer-defined Types

• Recall the definition of a type:– A set of values and a set of operations on

those values.

• Structures allow a definition of a representation

• Problems:– Representation is not hidden– Type operations cannot be defined

• Solutions: ADT – Abstract Data Types

top related