tutorial 3: code generation

Post on 12-Dec-2021

11 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Tutorial Code Generation

Compiler Construction1

S C I E N C E ■ P A S S I O N ■ T E C H N O L O G Y

u www.tugraz.at

Tutorial 3: Code Generation

Univ.-Prof. Dr. Franz Wotawa, DI Roxane Koitz,

Stephan Frühwirt, Christopher Liebmann, Martin

Zimmermann

Institute for Software Technology

Tutorial Code Generation

Compiler Construction2

Jova Input Program

Java Byte Code

Compiler Phases

Tutorial Code Generation

Compiler Construction3

Jova Input Program

Java Byte Code

Compiler Phases

Tutorial Code Generation

Compiler Construction4

Source Code

(*.jova file)Syntax tree

Grammar

(Jova.g4)

ANTLR

Lexer and Parser

Lexical and

syntactical errors

Symbol

table

ANTLR

visitor / listener

Type checking

errors

Debugging

output

Debugging

output

Workflow (1/2)

Tutorial Code Generation

Compiler Construction5

Syntax tree

Symbol

table

Workflow (2/2)

Jasmin code

(.j file)

Byte code

(.class file)

Jasmin

Tutorial Code Generation

Compiler Construction6

What is Jasmin?

• Assembler for Java bytecode

• Input: <filename>.j file

• contains assembly of the original code

• written in Jasmin assembler language

• Output: executable Java .class file

Tutorial Code Generation

Compiler Construction7

Pipeline

Create

Assembly

• Produce jasmin assembly

• Result: <filename>.j

Convert

• Invoke “java –jar jasmin.jar <filename>.j“

• Result: <filename>.class

Execute

• Invoke “java <filename>“

• Result: executes main method of class

Tutorial Code Generation

Compiler Construction8

• One class per .j file

• One statement per line

• Assembly setup:

• Required options

• Methods

• Statements (JVM instructions)

Jasmin syntax

Tutorial Code Generation

Compiler Construction9

File structure: Class options

▪ .source: Source of assembly▪ e.g.: .source MyClass.jova

▪ .class: Resulting java class description▪e.g.: .class public MyClass

▪ .super: Superclass of resulting java class▪always: .super java/lang/Object

▪ .field: Specify fields of class▪e.g.: .field public my_field I

Tutorial Code Generation

Compiler Construction10

.method <method signature>

e.g. .method public myMethod(I)V

.limit stack n

n: choose realistic number

.limit locals n

n = #parameters + #local_vars + #temp_var

<instructions>

return

requires matching type on top-of-stack for non-void returns

(e.g. ireturn)

.end method

File structure: Methods

Tutorial Code Generation

Compiler Construction11

Default Constructor

▪ needs to be defined for every class

▪ since Jova does not have Constructors you can

use the same definition for every class:

.method public <init>()V

.limit stack 1

.limit locals 1

aload_0

invokespecial java/lang/Object/<init>()V

return

.end method

Tutorial Code Generation

Compiler Construction12

Example: DoNix

File: DoNix.j

.source noSource

.class public DoNix

.super java/lang/Object

.method public static main([Ljava/lang/String;)V

.limit stack 0

.limit locals 1

;nothing to do here

return

.end method

Tutorial Code Generation

Compiler Construction13

• Two data structures per method (invocation/frame)

• Stack

• Local array

• Operations to manipulate both

• Build-in datatypes

• Primitive Types (int, float, byte, char,…)

• Reference Types (class types, array types,

interface types)

• Very limited support for boolean

Data Management

Tutorial Code Generation

Compiler Construction14

• Each method has its own operand stack

• Size is definable per method

(just assume a realistic number)

• LIFO

• Stack operations

• Push values onto stack

• Pop/Fetch values from stack

• Instructions which require one or multiple values

on stack (order does matter!)

Data Management: Stack

Tutorial Code Generation

Compiler Construction15

• Each method has its own local variable array

• Definable size for each method (0-based indices)

• Typing

• Can store arbitrary types

• Items need to be initialized before read access

• Contains

• Method parameters (stored in lowest indices)

• At index 0 the ‘this’ reference

Data Management: Local Variable Array

Tutorial Code Generation

Compiler Construction16

Data Managment: Types

▪ … a few primitives▪Integer indicated by letter I▪Void indicated by letter V▪Boolean indicated by letter Z

▪ Objects following the format “Lpackage/Classname;“▪e.g. Ljava/lang/String; String object

▪ Array indicated by a leading [▪e.g. [Ljava/lang/String; array of Strings

Tutorial Code Generation

Compiler Construction17

Instructions

▪ Can involve stack and local array

▪ Most instructions operate on expected types

▪ Instruction template: <T><instr>

where <T> = type letter

<instr> = operation▪ E.g.: iadd, fadd

▪ Instructions which do not operate on specific type▪ E.g.: swap, dup

Tutorial Code Generation

Compiler Construction18

Instructions: Stack - Locals interaction

▪ iload n pushes integer, stored in index n of

local array, onto stack▪ istore n pops integer from stack and stores it

into index n of local array▪ aload n pushes object, stored in index n of

local array, onto stack▪ astore n pops object from stack and stores it

into index n of local array

Tutorial Code Generation

Compiler Construction19

Instructions: Constants

▪ sipush n / bipush n

▪Pushes integer constant onto stack▪E.g. sipush 10

▪For m1 - 5 you can also use iconst_<n>

▪ ldc “<string>”

▪Pushes string constant <string> onto stack▪E.g. ldc “Hello World”

▪Note: Strings are Objects (variable access with

astore/aload)

Tutorial Code Generation

Compiler Construction20

Instructions: Arithmetic Operators

▪ iadd add two integers

▪ isub subtract two integers

▪ imul multiply two integers

▪ idiv divide two integers

▪ irem modulo division of two integers

▪ ineg toggles sign of int on top of stack

Tutorial Code Generation

Compiler Construction21

Example: BasicInstructions

File: BasicInstructions.j.source noSource

.class public BasicInstructions

.super java/lang/Object

.method public static main([Ljava/lang/String;)V

.limit stack 3

.limit locals 2

sipush 5 ;push integer 5 onto stack

istore 0 ;pop integer 5 and store in index 0

ldc "Hello i11" ;push string i11 onto stack

astore 1 ;store string in index 1

iload 0 ;load 5

dup ;duplicate stack entry 5

sipush 2 ;push integer 2 onto stack

isub ;pop 5 and 2 and store result 3 onto stack

iadd ;pop 5 and 3 and store result 8 onto stack

istore 0 ;store result 8 in index 0

return

.end method

Tutorial Code Generation

Compiler Construction22

Example: BasicInstructions

File: BasicInstructions.j

sipush 5 local array

args

stack

Tutorial Code Generation

Compiler Construction23

Example: BasicInstructions

File: BasicInstructions.j

istore 0

local array

args

stack

5

Tutorial Code Generation

Compiler Construction24

Example: BasicInstructions

File: BasicInstructions.j

ldc "Hello i11"

local array

5

stack

Tutorial Code Generation

Compiler Construction25

Example: BasicInstructions

File: BasicInstructions.j

astore 1

local array

5

stack

Hello i11

Tutorial Code Generation

Compiler Construction26

Example: BasicInstructions

File: BasicInstructions.j

iload 0

local array

5 Hello i11

stack

Tutorial Code Generation

Compiler Construction27

Example: BasicInstructions

File: BasicInstructions.j

dup

local array

5 Hello i11

stack

5

Tutorial Code Generation

Compiler Construction28

Example: BasicInstructions

File: BasicInstructions.j

sipush 2

local array

5 Hello i11

stack

5

5

Tutorial Code Generation

Compiler Construction29

Example: BasicInstructions

File: BasicInstructions.j

isub

local array

5 Hello i11

stack

5

5

2

Tutorial Code Generation

Compiler Construction30

Example: BasicInstructions

File: BasicInstructions.j

iadd

local array

5 Hello i11

stack

5

3

Tutorial Code Generation

Compiler Construction31

Example: BasicInstructions

File: BasicInstructions.j

istore 0

local array

5 Hello i11

stack

8

Tutorial Code Generation

Compiler Construction32

Example: BasicInstructions

File: BasicInstructions.j

return

local array

8 Hello i11

stack

Tutorial Code Generation

Compiler Construction33

Instructions: Logical Operators

▪ iand bitwise and of two integers

▪ ior bitwise or of two integers

▪ inot does not exist!

▪Note: Needs to be assembled using custom labels and

conditional jump operations

Tutorial Code Generation

Compiler Construction34

Instructions: Relational Operators

▪ Do not exist!

▪ Need to be assembled using custom labels and

conditional jump operations

Tutorial Code Generation

Compiler Construction35

Instructions: Labels and Jumps

▪ <labelname>:

▪sets a label in the assembly

▪ goto <labelname>

▪continues execution of current method at position of the

label <labelname>

▪ if_icmpXX <labelname>

▪pops two elements of the stack, relates them and jumps

to <labelname> if comparison computes to true

Tutorial Code Generation

Compiler Construction36

Instructions: if_icmp variations

▪ if_icmplt relation using <

▪ if_icmple relation using <=

▪ if_icmpge relation using >=

▪ if_icmpgt relation using >

▪ if_icmpeq relation using ==

▪ if_icmpne relation using !=

Tutorial Code Generation

Compiler Construction37

Example: LabelsAndJumpsFile: LabelsAndJumps.j

.source noSource

.class public LabelsAndJumps

.super java/lang/Object

.method public static main([Ljava/lang/String;)V

.limit stack 2

.limit locals 2

sipush 10

istore 0 ;store 10 in index 0

goto L_skip_redef

sipush 20

istore 0 ;store 20 to index 0 - skipped

L_skip_redef:

iload 0 ;push value of index 0: 10

sipush 15 ;push 15

if_icmplt L_is_lesser

ldc "greater" ;push string to stack - skipped

goto L_end

L_is_lesser:

ldc "lesser" ;push string to stack

L_end:

; result: string "lesser" on top of stack

return

.end method

Tutorial Code Generation

Compiler Construction38

Example: LabelsAndJumpsFile: LabelsAndJumps.j

sipush 10

local array

stack

args

Tutorial Code Generation

Compiler Construction39

Example: LabelsAndJumpsFile: LabelsAndJumps.j

istore 0 local array

stack

10

args

Tutorial Code Generation

Compiler Construction40

Example: LabelsAndJumpsFile: LabelsAndJumps.j

goto L_skip_redef

sipush 20

istore 0

L_skip_redef:

local array

stack

10

Tutorial Code Generation

Compiler Construction41

Example: LabelsAndJumpsFile: LabelsAndJumps.j

sipush 20

istore 0

L_skip_redef:

local array

stack

10

Tutorial Code Generation

Compiler Construction42

Example: LabelsAndJumpsFile: LabelsAndJumps.j

iload 0

local array

stack

10

Tutorial Code Generation

Compiler Construction43

Example: LabelsAndJumpsFile: LabelsAndJumps.j

sipush 15

local array

stack

10

10

Tutorial Code Generation

Compiler Construction44

Example: LabelsAndJumpsFile: LabelsAndJumps.j

if_icmplt L_is_lesser

ldc "greater"

goto L_end

L_is_lesser:

ldc "lesser"

L_end:

local array

stack

10

15

10

Tutorial Code Generation

Compiler Construction45

Example: LabelsAndJumpsFile: LabelsAndJumps.j

ldc "greater"

goto L_end

L_is_lesser:

local array

stack

10

Tutorial Code Generation

Compiler Construction46

Example: LabelsAndJumpsFile: LabelsAndJumps.j

ldc "lesser"

local array

stack

10

Tutorial Code Generation

Compiler Construction47

Example: LabelsAndJumpsFile: LabelsAndJumps.j

L_end:

local array

stack

lesser

10

Tutorial Code Generation

Compiler Construction48

Example: LabelsAndJumpsFile: LabelsAndJumps.j

return

local array

stack

lesser

10

Tutorial Code Generation

Compiler Construction49

Instructions: field access

▪ Call put-/getfield of object on stack

▪ Call usingputfield <class ID>/<field ID> <type>

getfield <class ID>/<field ID> <type>

▪ Requires value and object on stack

▪ Example▪Jova-field: public int my_field

▪Jasmin-signature: MyClass/my_field I

▪assembly: putfield MyClass/my_field I

Tutorial Code Generation

Compiler Construction50

Instructions: non-static method calls

▪ Call method of object on stack

▪ Call usinginvokevirtual <class ID>/<method signature>

▪ Requires parameters and object on stack (in correct

order!)

▪ Example▪method: public int myMethod(int a)

▪Jasmin- sig.: MyClass/myMethod(I)I

▪invokation: invokevirtual MyClass/myMethod(I)I

Tutorial Code Generation

Compiler Construction51

Instructions: print

▪ Based on virtual invokation

▪ How to:

1. Push PrintStream object onto stackgetstatic java/lang/System/out Ljava/io/PrintStream;

2. Push value onto stack (iload, aload, etc.)

3. Invoke matching PrintStream methodinvokevirtual java/io/PrintStream/print(I)V

invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V

invokevirtual java/io/PrintStream/print(Z)V

Tutorial Code Generation

Compiler Construction52

Hints

▪ Try and write some simple Jasmin code yourselves▪ Use aload_0 to get ‘this’ reference

▪ Number your labels

▪ Map Jova/internal variables to locals array indices▪ Instruction swap/dup may be useful in some cases

▪ Use the online documentation to find additional

instructions/explanations

▪ When in doubt: model a problem in Java - compile it -and use javap -c <Class> to decompile the .class

files

Tutorial Code Generation

Compiler Construction53

References:

▪ Jasmin User Guide:

http://jasmin.sourceforge.net/guide.html

▪ The Structure of the Java Virtual Machine:

https://docs.oracle.com/javase/specs/jvms/se8

/html/jvms-2.html

Tutorial Code Generation

Compiler Construction54

Questions?

top related