L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Java and C II, Course Wrap-Up CSE 351 Summer 2019

Instructor: Teaching Assistants: Sam Wolfson Rehaan Bhimani Corbin Modica Daniel Hsu

https://xkcd.com/1760/ L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Administrivia v Lab 5 due Friday (8/23) § Hard deadline on Sunday (8/25) – one late day § Watch linked videos & experiment with the heap simulator v Course evaluations are out! § https://uw.iasystem.org/survey/211929 § Separate evaluations for lecture and section (check email) v Final Exam: Friday, August 23rd, 10:50-11:50am § You are allowed one double-sided handwritten note sheet § Practice finals available on website (summer not cumulative) § Review Session: Wednesday, August 21st, 4-6pm • Location TBD

2 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Today v Finish Java & C v End-to-end Review § What happens after you write your source code? • How code becomes a program • How your computer executes your code v Victory lap: high-level concepts & course themes § More useful for “5 years from now” than “Friday’s final”

3 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Java Object Definitions

class Point { double x; fields double y;

Point() { constructor x = 0; y = 0; }

boolean samePlace(Point p) { return (x == p.x) && (y == p.y); method(s) } } ... Point p = new Point(); creation ...

4 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Java Objects and Method Dispatch

Point object p header vtable ptr x y

vtable for class Point:

code for Point() code for samePlace() Point object q header vtable ptr x y

v Virtual method table (vtable) § Like a jump table for instance (“virtual”) methods plus other class info § One table per class

v Object header : GC info, hashing info, lock info, etc. § Why no size?

5 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Java Constructors

v When we call new: allocate space for object (data fields and references), initialize to zero/null, and run constructor method Java: C pseudo-translation: Point p = new Point(); Point* p = calloc(1,sizeof(Point)); p->header = ...; p->vtable = &Point_vtable; p->vtable[0](p);

Point object p header vtable ptr x y vtable for class Point:

code for Point() code for samePlace()

6 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Java Methods v Static methods are just like functions v Instance methods: § Can refer to this; § Have an implicit first parameter for this; and § Can be overridden in subclasses v The code to run when calling an instance method is chosen at runtime by lookup in the vtable Java: C pseudo-translation: p.samePlace(q); p->vtable[1](p, q);

Point object p header vtable ptr x y

vtable for class Point:

code for Point() code for samePlace() 7 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Subclassing class ThreeDPoint extends Point { double z; @Override boolean samePlace(Point p2) { return false; } void sayHi() { System.out.println("hello"); } } v Where does “z” go? At end of fields of Point § Point fields are always in the same place, so Point code can run on ThreeDPoint objects without modification v Where does pointer to code for two new methods go? § No constructor, so use default Point constructor § To override “samePlace”, use same vtable position § Add new pointer at end of vtable for new method “sayHi”

8 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Subclassing

class ThreeDPoint extends Point { double z; boolean samePlace(Point p2) { return false; } void sayHi() { System.out.println("hello"); } } z tacked on at end ThreeDPoint object header vtable ptr x y z sayHi tacked on at end Code for vtable for sayHi constructor samePlace sayHi ThreeDPoint: (not Point)

Old code for New code for samePlace constructor Same index as Point’s samePlace function! 9 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Dynamic Dispatch

Point object header vtable ptr x y

Point vtable: code for Point’s samePlace() p ??? code for Point() ThreeDPoint object header vtable ptr x y z

code for sayHi() ThreeDPoint vtable:

code for ThreeDPoint’s samePlace() Java: C pseudo-translation: Point p = ???; // works regardless of what p is return p.samePlace(q); return p->vtable[1](p, q); 10 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Ta-da! v In CSE143, it may have seemed “magic” that an inherited method could call an overridden method § You were tested on this endlessly v The “trick” in the implementation is this part: p->vtable[i](p,q) § In the body of the pointed-to code, any calls to (other) methods of this will use p->vtable § Dispatch determined by p, not the class that defined a method

11 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Practice Question

v Assume: 64-bit pointers and that a Java object header is 8 B v What are the sizes of the things being pointed at by ptr_c and ptr_j? Assume 4B alignment for Java implementation struct c { class jobj { int i; int i; char s[3]; String s = "hi"; int a[3]; int[] a = new int[3]; struct c *p; jobj p; }; } struct c* ptr_c; jobj ptr_j = new jobj();

12 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Implementing Programming Languages v Many choices in how to implement programming models v We’ve talked about compilation, can also interpret v Interpreting languages has a long history § Lisp, an early , was interpreted v Interpreters are still in common use: § Python, Javascript, Ruby, Matlab, PHP, Perl, … Interpreter Your source code implementation

Your source code

Binary executable Interpreter binary

Hardware Hardware 13 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 An Interpreter is a Program v Execute (something close to) the source code directly v Simpler/no compiler – less translation v More transparent to debug – less translation v Easier to run on different architectures – runs in a simulated environment that exists only inside the interpreter process § Just port the interpreter (program), not the program-being-interpreted v Slower and harder to optimize Interpreter implementation

Your source code

Interpreter binary

14 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Interpreter vs. Compiler v An aspect of a language implementation § A language can have multiple implementations § Some might be compilers and other interpreters v “Compiled languages” vs. “Interpreted languages” a misuse of terminology § But very common to hear this § And has some validation in the real world (e.g. JavaScript vs. C) v Also, as about to see, modern language implementations are often a mix of the two. E.g. : § Compiling to a bytecode language, then interpreting § Doing just-in-time compilation of parts to assembly for performance

15 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Note: The JVM is different than the CSE VM running “The JVM” on VMWare. Yet another use of the word “virtual”! v Java programs are usually run by a Java virtual machine (JVM) § JVMs interpret an intermediate language called Java bytecode § Many JVMs compile bytecode to native • Just-in-time (JIT) compilation • http://en.wikipedia.org/wiki/Just-in-time_compilation § Java is sometimes compiled ahead of time (AOT) like C

16 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Compiling and Running Java

1. Save your Java code in a .java file

2. To run the Java compiler: § javac Foo.java § The Java compiler converts Java into Java bytecode • Stored in a .class file

3. To execute the program stored in the bytecode, Java bytecode can be interpreted by a program (an interpreter) § For Java, this interpreter is called the Java Virtual Machine (the JVM) § To run the virtual machine: § java Foo § This Loads the contents of Foo.class and interprets the bytecode

17 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Virtual Machine Model

High-Level Language Program (e.g. Java, C) Bytecode compiler Ahead-of-time (e.g. javac Foo.java) compiler

Virtual Machine Language run time (e.g. Java bytecode) Virtual machine (interpreter) JIT (e.g. java Foo) compiler

Native Machine Language (e.g. x86, ARM, MIPS)

18 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Java Bytecode Holds pointer this v Like assembly code for JVM, Other arguments to method but works on all JVMs Other local variables § Hardware-independent!

v Typed (unlike x86 assembly) 0 1 2 3 4 n v Strong JVM protections variable table

operand stack

constant pool

19 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Holds pointer this JVM Operand Stack Other arguments to method Other local variables

JVM: 0 1 2 3 4 n variable table operand stack ‘i’ = integer, ‘a’ = reference, ‘b’ for byte, ‘c’ for char, ‘’ for double, ... constant pool

Bytecode: iload 1 // push 1st argument from table onto stack iload 2 // push 2nd argument from table onto stack iadd // pop top 2 elements from stack, add together, and // push result back onto stack istore 3 // pop result and put it into third slot in table

Compiled mov 8(%ebp), %eax No registers or stack locations! to (IA32) x86: mov 12(%ebp), %edx All operations use operand stack add %edx, %eax mov %eax, -8(%ebp) 20 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 A Simple Java Method

Method java.lang.String getEmployeeName()

0 aload 0 // "this" object is stored at 0 in the var table

1 getfield #5 // getfield instruction has a 3-byte encoding // Pop an element from top of stack, retrieve its // specified instance field and push it onto stack // "name" field is the fifth field of the object

4 areturn // Returns object at top of stack

Byte number: 0 1 4 aload_0 getfield 00 05 areturn

As stored in the .class file: 2A B4 00 05 B0

http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

21 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Class File Format

v Every class in Java source code is compiled to its own class file v 10 sections in the Java class file structure: § Magic number: 0xCAFEBABE (legible hex from James Gosling – Java’s inventor) § Version of class file format: The minor and major versions of the class file § Constant pool: Set of constant values for the class § Access flags: For example whether the class is abstract, static, final, etc. § This class: The name of the current class § Super class: The name of the super class § Interfaces: Any interfaces in the class § Fields: Any fields in the class § Methods: Any methods in the class § Attributes: Any attributes of the class (for example, name of source file, etc.) v A .jar file collects together all of the class files needed for the program, plus any additional resources (e.g. images)

22 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019

Compiled from Employee.java class Employee extends java.lang.Object { Disassembled public Employee(java.lang.String,int); public java.lang.String getEmployeeName(); public int getEmployeeNumber(); Java Bytecode } Method Employee(java.lang.String,int) 0 aload_0 1 invokespecial #3 4 aload_0 5 aload_1 6 putfield #5 9 aload_0 10 iload_2 11 putfield #4 14 aload_0 > javac Employee.java 15 aload_1 > javap -c Employee 16 iload_2 17 invokespecial #6 20 return

Method java.lang.String getEmployeeName() 0 aload_0 1 getfield #5 4 areturn

Method int getEmployeeNumber() 0 aload_0 1 getfield #4 http://en.wikipedia.org/wiki/Java 4 ireturn _bytecode_instruction_listings Method void storeData(java.lang.String, int) … 23 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Other languages for JVMs v JVMs run on so many computers that compilers have been built to translate many other languages to Java bytecode: § AspectJ, an aspect-oriented extension of Java § ColdFusion, a scripting language compiled to Java § Clojure, a functional Lisp dialect § Groovy, a scripting language § JavaFX Script, a scripting language for web apps § JRuby, an implementation of Ruby § Jython, an implementation of Python § Rhino, an implementation of JavaScript § Scala, an object-oriented and functional programming language § And many others, even including C! v Originally, JVMs were designed and built for Java (still the major use) but JVMs are also viewed as a safe, GC’ed platform 24 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 Microsoft’s C# and .NET Framework

v C# has similar motivations as Java § Virtual machine is called the Common Language Runtime § Common Intermediate Language is the bytecode for C# and other languages in the .NET framework

1996 - James Gosling invents Java. Java is a relatively verbose, garbage collected, class based, statically typed, single dispatch, object oriented language with single implementation inheritance and multiple interface inheritance. Sun loudly heralds Java's novelty.

2001 - Anders Hejlsberg invents C#. C# is a relatively verbose, garbage collected, class based, statically typed, single dispatch, object oriented language with single implementation inheritance and multiple interface inheritance. Microsoft loudly heralds C#'s novelty. http://james-iry.blogspot.com/2009/05/brief-incomplete- and-mostly-wrong.html 25 L24: Java and C II, Course Wrap-Up CSE 351, Summer 2019 We made it! � � C: Java: Memory & data car *c = malloc(sizeof(car)); Car c = new Car(); Integers & floats c->miles = 100; c.setMiles(100); x86 assembly c->gals = 17; c.setGals(17); Procedures & stacks float mpg = get_mpg(c); float mpg = Executables free(c); c.getMPG(); Arrays & structs Memory & caches Assembly get_mpg: Processes pushq %rbp language: movq %rsp, %rbp Virtual memory ... Memory allocation popq %rbp Java vs. C ret OS: Machine 0111010000011000 100011010000010000000010 code: 1000100111000010 110000011111101000011111

Computer system:

26