lecture 2 from java to c -...

49
Lecture 2 From Java to C COMP26120 Giles Reger Have you picked up the handouts at the back? Do you have a bit of paper and pen? October 2018 Giles Reger Lecture 2 October 2018 1 / 27

Upload: others

Post on 14-Jul-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Lecture 2From Java to C

COMP26120

Giles Reger

Have you picked up the handouts at the back? Do you have a bit of paper and pen?

October 2018

Giles Reger Lecture 2 October 2018 1 / 27

Page 2: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Aim and Learning Outcomes

The aim of this lecture is to:

Highlight the key differences between Java and C and challenge yourmental model of how programs run to allow you to ask the right questions

when learning C

Learning Outcomes

By the end of this lecture you will be able to:

1 Recall major differences between Java and C

2 Explain how C programs are compiled and run

3 Sketch the big picture of what happens in the computer (e.g. inmemory) when running a program

4 Write a C program performing simple input/output

Giles Reger Lecture 2 October 2018 2 / 27

Page 3: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Learning a new language

We assume that you are competent Java programmers.

We introduce C as a second language. We don’t cover all of C.

How do you learn a new programming language?

What’s the same? Usually if then else, while, for etc

What’s the paradigm?

What’s the tool ecosystem?

Where do I go to find more? Standard reference/libraries?

Try writing some code!

Giles Reger Lecture 2 October 2018 3 / 27

Page 4: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Learning a new language

We assume that you are competent Java programmers.

We introduce C as a second language. We don’t cover all of C.

How do you learn a new programming language?

What’s the same? Usually if then else, while, for etc

What’s the paradigm?

What’s the tool ecosystem?

Where do I go to find more? Standard reference/libraries?

Try writing some code!

Giles Reger Lecture 2 October 2018 3 / 27

Page 5: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Spot the Difference

You should have picked up two bits of source code:

SalaryAnalysis.java and SalaryAnalysis.c

In pairs or threes:

1 mark the differences between the two

2 write a list of the concepts that these differences relate to

What did we find?

Giles Reger Lecture 2 October 2018 4 / 27

Page 6: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Spot the Difference

You should have picked up two bits of source code:

SalaryAnalysis.java and SalaryAnalysis.c

In pairs or threes:

1 mark the differences between the two

2 write a list of the concepts that these differences relate to

What did we find?

Giles Reger Lecture 2 October 2018 4 / 27

Page 7: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Outline

In this lecture I briefly cover:

Comparative History

From Source to Execution

Dealing with Memory (the big one)

Input/Output

Coping without Classes

Some Gotchas

I am not teaching you how to program in C. I am pointing out the thingsyou should be aware of when learning C after learning Java.

Giles Reger Lecture 2 October 2018 5 / 27

Page 8: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Brief Comparative History

Giles Reger Lecture 2 October 2018 6 / 27

Page 9: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Comparative History

History of C

1970s: BCLP to B to C1983: C++ emerges1989: ANSI/ISO Standard (C89)1998: ISO Standard C++981999: ISO Standard (C99)2011: ISO Standard (C11) makeslots of changes2018: ISO Standard (C18) makesvery few changes

History of Java

1991: Project started1996: Sun released Java 1.01997: Sun gave up onstandardising the language2004: Java 5 added generics2006/7: Java went open-source2014: Java 8 added lambdas2017: Java 9 added G1

Giles Reger Lecture 2 October 2018 7 / 27

Page 10: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

From Source to Execution

This is one of the first stumbling blocks when going from Java to C

In Java things are warm and fluffy, whereas C is a bit spiky. In Java youjust need to run javac then java and it ‘works’ and (importantly) ifsomething goes wrong you (usually) get a nice error message and a stacktrace. . .

. . . but in C there’s these headers and link errors and SEGFAULTS!

So what’s the difference?

Giles Reger Lecture 2 October 2018 8 / 27

Page 11: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Name the Thing

Giles Reger Lecture 2 October 2018 9 / 27

Page 12: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Name the Thing

Giles Reger Lecture 2 October 2018 10 / 27

Page 13: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What does a Compiler (and Linker) do?

At a (very) high level

(Preprocessing)

Parsing to produce an AST and then intermediate code

Optimisation

Machine code generation

Putting together (linking) the bits of machine code (including libraries)

Try disassembling your executables and relate it back to your codeAlso see https://godbolt.org/ for exploring compilers

Giles Reger Lecture 2 October 2018 11 / 27

Page 14: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 15: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 16: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 17: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 18: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 19: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 20: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 21: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 22: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 23: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

C Source: Anatomy of a C program

name.h

// F i l e c o n t a i n i n g my name

#def ine NAME ‘ ‘ G i l e s ’ ’

hello.h

// Dec l a r e h e l l o f u n c t i o n svoid s a y H e l l o ( char ∗ ) ;

command line

gcc h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ name . h ’ ’#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){

s a y H e l l o (NAME) ;return 0 ;}void s a y H e l l o ( char∗ name ){

p r i n t f ( ” H e l l o %s !\ n” , name ) ;}

Giles Reger Lecture 2 October 2018 12 / 27

Page 24: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

A bit more on the preprocessor

Show output of preprocessor

gcc −E h e l l o . c

Compile-time macro definitions

gcc −DWORLD h e l l o . c −o h e l l o

hello.c

#inc lude <s t d i o . h>#inc lude ‘ ‘ h e l l o . h ’ ’

// P r i n t s my namei n t main ( ){#i f d e f WORLD

s a y H e l l o ( ” World ” ) ;#e l i f d e f i n e d (NAME)

s a y H e l l o (NAME) ;#el se

s a y H e l l o ( ”Nobody” ) ;#end i freturn 0 ;}. . .

Giles Reger Lecture 2 October 2018 13 / 27

Page 25: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Exercise 0

Optional but very useful Exercise

Edit the previous files to say some more interesting things. Use yourprogramming knowledge from Java to see, for example, how iteration,conditions, and recursion work in C.

Process for submitting and marking (do this with Ex0 to see how it works)

Complete task in the correct directory

Run submit on school machine

Go to https://marking.cs.manchester.ac.uk/

Log in with your University details

Click on exercise to see feedback and request marking

Giles Reger Lecture 2 October 2018 14 / 27

Page 26: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Dealing with Memory

C has explicit memory management

You will explore this a lot more in the next few lectures but I try and laythe groundwork for this here

The labs will help you explore these ideas. It is important you understandthem. Use Valgrind

Exercise: A Cross-Section of Running a Program

Try drawing a cross-section (e.g. across multiple physical/conceptuallayers) of what happens when running a program.

Giles Reger Lecture 2 October 2018 15 / 27

Page 27: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Low-level memory

Remember: Indirect Addressing from COMP15111

In COMP15111 you met the ADR and LDR ARM instructions for indirectaddressing. The register storing an address can be seen as a pointer tothat address. You also saw address arithmetic e.g. calculating newaddresses from old ones.

Remember: Data Representation from COMP15111

In COMP15111 you discussed different concepts about how data isrepresented in memory e.g. endianness and alignment. Recall that datatypes tell us how much memory we need for different data items.

Both these topics are relevant for C programming.

Giles Reger Lecture 2 October 2018 16 / 27

Page 28: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings

Stack frames and local variables

Call new Thing()

Allocate on heap, store address, object header

Evaluate lastThing.otherThing

putfield takes objectref

Call System.out.println(thing)

call-by-value

Return from makeThings

reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 29: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings Stack frames and local variables

Call new Thing()

Allocate on heap, store address, object header

Evaluate lastThing.otherThing

putfield takes objectref

Call System.out.println(thing)

call-by-value

Return from makeThings

reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 30: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings Stack frames and local variables

Call new Thing() Allocate on heap, store address, object header

Evaluate lastThing.otherThing

putfield takes objectref

Call System.out.println(thing)

call-by-value

Return from makeThings

reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 31: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings Stack frames and local variables

Call new Thing() Allocate on heap, store address, object header

Evaluate lastThing.otherThing putfield takes objectref

Call System.out.println(thing)

call-by-value

Return from makeThings

reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 32: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings Stack frames and local variables

Call new Thing() Allocate on heap, store address, object header

Evaluate lastThing.otherThing putfield takes objectref

Call System.out.println(thing) call-by-value

Return from makeThings

reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 33: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

High-level memory... Java

c l a s s Thing{Thing othe rTh ing ;pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ){ makeThings ( 5 ) ; }pub l i c s t a t i c vo id makeThings ( i n t number ){

Thing t h i n g = new Thing ( ) ;Thing l a s tTh i n g = th i n g ;wh i l e ( number - - > 0){ l a s tTh i n g . o the rTh ing = new Thing ( ) ; }l a s tTh i n g . o the rTh ing = th i n g ;System . out . p r i n t l n ( t h i n g ) ;

}}

What happens under the hood when we

Call makeThings Stack frames and local variables

Call new Thing() Allocate on heap, store address, object header

Evaluate lastThing.otherThing putfield takes objectref

Call System.out.println(thing) call-by-value

Return from makeThings reachability-based garbage collection

Giles Reger Lecture 2 October 2018 17 / 27

Page 34: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What can we do in C?

In C we can see memory and talk about it very explicitly

Refer to the addresses of things, store those in variables, and access them

i n t a = 10 ; i n t b = 20 ;i n t ∗ p t r = &a ;∗ p t r = b ;

Without any explanation... guess what happens?Given our previous mental model, where does a live?

We can allocate bits of memory and use them

i n t ∗ t h i n g = ma l l o c (3∗ s i z e o f ( i n t ) ) ;// do s t u f ff r e e ( t h i n g )

Function pointers!

Giles Reger Lecture 2 October 2018 18 / 27

Page 35: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What can we do in C?

In C we can see memory and talk about it very explicitly

Refer to the addresses of things, store those in variables, and access them

i n t a = 10 ; i n t b = 20 ;i n t ∗ p t r = &a ;∗ p t r = b ;

Without any explanation... guess what happens?Given our previous mental model, where does a live?

We can allocate bits of memory and use them

i n t ∗ t h i n g = ma l l o c (3∗ s i z e o f ( i n t ) ) ;// do s t u f ff r e e ( t h i n g )

Function pointers!

Giles Reger Lecture 2 October 2018 18 / 27

Page 36: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What can we do in C?

In C we can see memory and talk about it very explicitly

Refer to the addresses of things, store those in variables, and access them

i n t a = 10 ; i n t b = 20 ;i n t ∗ p t r = &a ;∗ p t r = b ;

Without any explanation... guess what happens?Given our previous mental model, where does a live?

We can allocate bits of memory and use them

i n t ∗ t h i n g = ma l l o c (3∗ s i z e o f ( i n t ) ) ;// do s t u f ff r e e ( t h i n g )

Function pointers!

Giles Reger Lecture 2 October 2018 18 / 27

Page 37: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What can we do in C?

In C we can see memory and talk about it very explicitly

Refer to the addresses of things, store those in variables, and access them

i n t a = 10 ; i n t b = 20 ;i n t ∗ p t r = &a ;∗ p t r = b ;

Without any explanation... guess what happens?Given our previous mental model, where does a live?

We can allocate bits of memory and use them

i n t ∗ t h i n g = ma l l o c (3∗ s i z e o f ( i n t ) ) ;// do s t u f ff r e e ( t h i n g )

Function pointers!

Giles Reger Lecture 2 October 2018 18 / 27

Page 38: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What can we do in C?

In C we can see memory and talk about it very explicitly

Refer to the addresses of things, store those in variables, and access them

i n t a = 10 ; i n t b = 20 ;i n t ∗ p t r = &a ;∗ p t r = b ;

Without any explanation... guess what happens?Given our previous mental model, where does a live?

We can allocate bits of memory and use them

i n t ∗ t h i n g = ma l l o c (3∗ s i z e o f ( i n t ) ) ;// do s t u f ff r e e ( t h i n g )

Function pointers!

Giles Reger Lecture 2 October 2018 18 / 27

Page 39: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

What is a SEGFAULT?

What would in Java when doing something like this?

i n t main ( vo id ){i n t a [ 1 0 ] ;f o r ( i n t i =0; i <20; i ++){

a [ i ] = i ;}r e t u r n 0 ;

}

In C we get

g i l e s $ . / segSegmentat ion f a u l t : 11

You will see this kind of thing (a lot)Google Segmentation fault and find out what it means

Giles Reger Lecture 2 October 2018 20 / 27

Page 40: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Important: There are no arrays or strings in C

Arrays are syntactic sugar for pointers e.g. we have a pointer to the startof the array and we can use pointer arithmetic to access elements

a[i ] ≡ ∗ (a + i)

Creating an array gives a pointer to a continuous bit of memory

Strings are null-terminated arrays of characters – we need the nullterminator to know when the string is finished.

#inc lude <s t d i o . h>void main ( ){

char∗ s t r i n g = ” H e l l o World ” ;p r i n t f ( ”%d,%d\n” , s t r i n g [ 0 ] , s t r i n g [ 1 1 ] ) ;

}

Giles Reger Lecture 2 October 2018 21 / 27

Page 41: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Input/Output

Many similar ideas to Java but

See ‘no such thing as strings’

More low-level functions for input/output

Character: putchar, getcharLine: gets, putsFormatted: printf, scanf - further reading needed

Concept of streams (sequences of bytes of data) more apparent

Familiar predefined streams (stdin, stdout, stderr)Some functions use these (e.g. getchar) others use an explicit stream

Giles Reger Lecture 2 October 2018 22 / 27

Page 42: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Example

#i fnde f LINE#def ine LINE 20#end i f#inc lude <s t d i o . h>i n t main ( ){

long l ; double d ;p u t s ( ” E n t e r an i n t e g e r and a f l o a t i n g p o i n t number . ” ) ;s c a n f ( ”%l d %l f ” , &l , &d ) ;

p u t s ( ”Type some t e x t . ” ) ;i n t ch ; char l i n e [ LINE +1] ; i n t l e n = 0 ;whi le ( ( ch = g e t c h a r ( ) ) != ’ \n ’ ){

l i n e [ l e n ++] = ch ;i f ( l e n==LINE ){

l i n e [ l e n ]=0; p u t s ( l i n e ) ; l e n =0;}

}return 0 ;

}Giles Reger Lecture 2 October 2018 23 / 27

Page 43: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Coping without Classes

A major difference between C and Java is the lack of classes.

What do classes give us?

Encapsulation of data

Encapsulation of functionality (co-located with data)

Separation of concerns (e.g. data hiding)

Object composition

Subtype polymorphism

What does C have instead? structs

Giles Reger Lecture 2 October 2018 24 / 27

Page 44: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Coping without Classes

A major difference between C and Java is the lack of classes.

What do classes give us?

Encapsulation of data

Encapsulation of functionality (co-located with data)

Separation of concerns (e.g. data hiding)

Object composition

Subtype polymorphism

What does C have instead? structs

Giles Reger Lecture 2 October 2018 24 / 27

Page 45: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Coping without Classes

A major difference between C and Java is the lack of classes.

What do classes give us?

Encapsulation of data

Encapsulation of functionality (co-located with data)

Separation of concerns (e.g. data hiding)

Object composition

Subtype polymorphism

What does C have instead? structs

Giles Reger Lecture 2 October 2018 24 / 27

Page 46: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Coping without Classes

A major difference between C and Java is the lack of classes.

What do classes give us?

Encapsulation of data

Encapsulation of functionality (co-located with data) 7

Separation of concerns (e.g. data hiding)

Object composition

Subtype polymorphism 7

What does C have instead? structs

Giles Reger Lecture 2 October 2018 24 / 27

Page 47: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Structs

s t r u c t A {char x ;char y ;i n t z ;

} sA ;

typede f s t r u c t {char x ;i n t z ;char y ;

} B;

i n t main ( ){sA . x = ’ a ’ ;s t r u c t A sC = sA ;s t r u c t { i n t a , b ;} sD = {1 ,2} ;B∗ sE = ma l l o c ( s i z e o f (B ) ) ;p r i n t f ( ”%c %d %d\n” ,

sC . x , sD . b , sE−>z ) ;p r i n t f ( ”%d %d\n” ,

s i z e o f ( sA ) , s i z e o f (B ) ) ;}

Key features:

Continuous memory (modulo packing)

Access variables using . if local and −> if pointer

Can tag or name to reuse same structure again

No inheritance, no local functions

See bit fields for memory hacking

Giles Reger Lecture 2 October 2018 25 / 27

Page 48: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Gotchas

There are a few areas where C is different from Java. If in doubt, look itup. Here are some obvious ones (for memory things see later lectures):

No boolean type, use int

Implicit type conversions

Difference between * and &

Pass by value, need to pass by reference explicitly

x++ vs ++x

No automatic garbage collection

No bounds checking (ArrayIndexOutOfBoundsException) of arrays

Giles Reger Lecture 2 October 2018 26 / 27

Page 49: Lecture 2 From Java to C - COMP26120syllabus.cs.manchester.ac.uk/ugt/2018/COMP26120/2018slides/lecture2.pdf1983: C++ emerges 1989: ANSI/ISO Standard (C89) 1998: ISO Standard C++98

Further Resources

Further reading:

Online Standard C book (Plauger and Brodie)

The C Programming Language (Kernighan and Ritchie)

C: A Reference Manual (Harbison and Steele)

Expert C Programming (van der Linden)

Giles Reger Lecture 2 October 2018 27 / 27