summer term 2011 prof. dr. arnd poetzsch-heffter · object creation !allocation of dynamic...

60
Compilers and Language Processing Tools Summer Term 2011 Prof. Dr. Arnd Poetzsch-Heffter Software Technology Group TU Kaiserslautern c Prof. Dr. Arnd Poetzsch-Heffter 1

Upload: others

Post on 27-Sep-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

Compilers and Language Processing ToolsSummer Term 2011

Prof. Dr. Arnd Poetzsch-Heffter

Software Technology GroupTU Kaiserslautern

c© Prof. Dr. Arnd Poetzsch-Heffter 1

Content of Lecture

1. Introduction2. Syntax and Type Analysis

2.1 Lexical Analysis2.2 Context-Free Syntax Analysis2.3 Context-Dependent Analysis

3. Translation to Target Language3.1 Translation of Imperative Language Constructs3.2 Translation of Object-Oriented Language Constructs

4. Selected Aspects of Compilers4.1 Intermediate Languages4.2 Optimization4.3 Data Flow Analysis4.4 Register Allocation4.5 Code Generation

5. Garbage Collection6. XML Processing (DOM, SAX, XSLT)

c© Prof. Dr. Arnd Poetzsch-Heffter 2

Translation of Object-Oriented Language Constructs

3.2 Translation of Object-OrientedLanguage Constructs

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 3

Translation of Object-Oriented Language Constructs

Section Outline

3.2 Translation of Object-Oriented Language Constructs3.2.1 Concepts of Object-Oriented Programming Languages3.2.2 Translation into Procedural Languages3.2.3 Translation of Classes3.2.4 Problems of Multiple Inheritance3.2.5 Further Aspects of Object-Oriented Languages

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 4

Translation of Object-Oriented Language Constructs Concepts of Object-Oriented Programming Languages

3.2.1 Concepts of Object-Oriented ProgrammingLanguages

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 5

Translation of Object-Oriented Language Constructs Concepts of Object-Oriented Programming Languages

Concepts of Object-Oriented Programming Languages

We consider a class-based language and use Java as an example.

Important Concepts:• Classes and Object Creation• Encapsulation• Subtyping and Inheritance• Dynamic Method Binding

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 6

Translation of Object-Oriented Language Constructs Concepts of Object-Oriented Programming Languages

Example: Object-Oriented Language ConceptsBeispiel: (objektorientierte Sprachkonzepte)

class Person {

String name;String name;

int gebdatum; /* in der Form JJJJMMTT */

Person( String n, int gd ) {

name = n;

gebdatum = gd;gebdatum gd;

}

public void drucken() {

System.out.println("Name:"+ this.name);

System.out.println("Geb:"+ this.gebdatum);

}

boolean hat_geburtstag ( int datum ) {

return (this.gebdatum%10000) ==

(datum%10000);

}}

}

class Student extends Person {

int matrikelnr;

int semester;int semester;

Student(String n,int gd,int mnr,int sem) {

super( n, gd );

matrikelnr = mnr;

semester = sem;semester sem;

}

public void drucken() {

super.drucken();

System.out.println( "Mnr:"+ matrikelnr);

i

26.06.2007 254© A. Poetzsch-Heffter, TU Kaiserslautern

System.out.println( "Sem:" + semester);

}

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 7

Translation of Object-Oriented Language Constructs Concepts of Object-Oriented Programming Languages

Example: Object-Oriented Language Concepts (2)

Beispiel: (objektorientierte Sprachkonzepte)

class Person {

String name;String name;

int gebdatum; /* in der Form JJJJMMTT */

Person( String n, int gd ) {

name = n;

gebdatum = gd;gebdatum gd;

}

public void drucken() {

System.out.println("Name:"+ this.name);

System.out.println("Geb:"+ this.gebdatum);

}

boolean hat_geburtstag ( int datum ) {

return (this.gebdatum%10000) ==

(datum%10000);

}}

}

class Student extends Person {

int matrikelnr;

int semester;int semester;

Student(String n,int gd,int mnr,int sem) {

super( n, gd );

matrikelnr = mnr;

semester = sem;semester sem;

}

public void drucken() {

super.drucken();

System.out.println( "Mnr:"+ matrikelnr);

i

26.06.2007 254© A. Poetzsch-Heffter, TU Kaiserslautern

System.out.println( "Sem:" + semester);

}

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 8

Translation of Object-Oriented Language Constructs Concepts of Object-Oriented Programming Languages

Example: Object-Oriented Language Concepts (3)

class Test {

public static void main( String[] argv ) {

int i;

Person[] pf = new Person[3];Person[] pf new Person[3];

pf[0] = new Person( "Meyer", 19631007 );

pf[1] = new Student("M\"uller",19641223,758475,5);

pf[2] = new Student("Planck",18580423,3454545,47);

for( i = 0; i<3; i = i+1 ) {

pf[i].drucken();pf[i].drucken();

}

} }

Das Beispiel zeigt Klassen, Objekterzeugung, Vererbung (mit Subtyping und Spezialisierung) sowieVererbung (mit Subtyping und Spezialisierung) sowie dynamisches Binden von Methoden.

Anhand des obigen Beispiels erläutern wir die

3.2.2 Umsetzung mitprozeduralen Sprachen

Anhand des obigen Beispiels erläutern wir die grundlegenden Übersetzungsschemata:

Klassen, Klassentypen ! Verbundtypen, Zeigertypen

Objekterzeugung ! Allokation dyn. Variablen/ObjekteObjekterzeugung ! Allokation dyn. Variablen/Objekte

Methoden, Konstruktoren ! Prozeduren

dyn. Bindung ! Verwendung von Prozedurzeigern

mit Selektion von Verbundkomponenten

26.06.2007 255© A. Poetzsch-Heffter, TU Kaiserslautern

mit Selektion von Verbundkomponenten

Als Zielsprache verwenden wir hier C.

The example demonstrates classes, object creation, inheritance (withsubtyping and specialization) and dynamic method binding.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 9

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

3.2.2 Translation into Procedural Languages

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 10

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation into Procedural Languages

Translation Schemes:

• Classes, class types→ record types, pointer types• Object creation→ Allocation of dynamic variables/objects• Methods, constructors→ procedures• Dynamic binding→ Use of procedure pointers with selection of

record components

We illustrate these schemes at the above example. The consideredtarget language is C.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 11

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Types and Methods

• Basis data types of Java→ basis data types of C, for example:I int→ intI boolean→ int

(typedef int boolean;)• Reference types of Java→ pointer types of C, for example:

I String→ String*I Person→ Person*

where String and Person are record types in C.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 12

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Implementation of Example in C

Fields are realized by record types:

Übersetzung der Typen und Methoden:

Basisdatentypen von Java ! Basisdatentypen von

z.B. int nach int boolean nach int

R f t J ! Z i t C

( typedef int boolean; )

Referenztypen von Java ! Zeigertypen von C

z.B. String nach String*Person nach Person*

wobei String und Person in C geeignete Verbundtypeni d Wi b t ht di I l ti

typedef struct sPerson Person;

struct sPerson {

String* name;

sind. Wir betrachten die Implementierung von Person:

g ;

int gebdatum; /* in der Form JJJJMMTT */

void (*drucken)( Person* );

boolean (*hat_geburtstag)( Person*, int );

};

Methoden werden als Prozeduren realisiert:

void Person_drucken( Person* this ) {

printf("Name:%s\n", this->name );printf( Name:%s\n , this >name );

printf("Geb:%d\n",this->gebdatum);

}

boolean Person_hat_geburtstag

(Person* this,int datum){

26.06.2007 256© A. Poetzsch-Heffter, TU Kaiserslautern

(Person this,int datum){

return (this->gebdatum%10000)==(datum%10000);

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 13

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Implementation of Example in C (2)

Methods are realized by procedures:

Übersetzung der Typen und Methoden:

Basisdatentypen von Java ! Basisdatentypen von

z.B. int nach int boolean nach int

R f t J ! Z i t C

( typedef int boolean; )

Referenztypen von Java ! Zeigertypen von C

z.B. String nach String*Person nach Person*

wobei String und Person in C geeignete Verbundtypeni d Wi b t ht di I l ti

typedef struct sPerson Person;

struct sPerson {

String* name;

sind. Wir betrachten die Implementierung von Person:

g ;

int gebdatum; /* in der Form JJJJMMTT */

void (*drucken)( Person* );

boolean (*hat_geburtstag)( Person*, int );

};

Methoden werden als Prozeduren realisiert:

void Person_drucken( Person* this ) {

printf("Name:%s\n", this->name );printf( Name:%s\n , this >name );

printf("Geb:%d\n",this->gebdatum);

}

boolean Person_hat_geburtstag

(Person* this,int datum){

26.06.2007 256© A. Poetzsch-Heffter, TU Kaiserslautern

(Person this,int datum){

return (this->gebdatum%10000)==(datum%10000);

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 14

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Implementation of Example in C (3)

Constructors are realized as procedures:

Person* PersonK( String* n, int gd ) {

Konstruktoren werden als Prozeduren realisiert:

Person PersonK( String n, int gd ) {

Person* this =

(Person*) malloc( sizeof(Person) );

this->name = n;

this->gebdatum = gd;

hi d k d kthis->drucken = Person_drucken;

this->hat_geburtstag = Person_hat_geburtstag;

return this;

}

Übersetzung von Vererbung/Spezialisierung:

Bzgl. der Verbundkomponenten wird Vererbung g p gim Wesentlichen durch Duplikation realisiert:

typedef struct sStudent Student;

struct sStudent {

String* name;

int gebdatum; /* in der Form JJJJMMTT */

void (*drucken)( Student* );

boolean (*hat_geburtstag)( Student*, int );

int matrikelnr;int matrikelnr;

int semester;

};

Zu beachten ist die notwendige Typanpassung beimi li it A t i d U t kl “

26.06.2007 257© A. Poetzsch-Heffter, TU Kaiserslautern

impliziten Argument in der „Unterklasse“.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 15

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Inheritance and Specialization

Inheritance with respect to record components is realized byduplication:

Person* PersonK( String* n, int gd ) {

Konstruktoren werden als Prozeduren realisiert:

Person PersonK( String n, int gd ) {

Person* this =

(Person*) malloc( sizeof(Person) );

this->name = n;

this->gebdatum = gd;

hi d k d kthis->drucken = Person_drucken;

this->hat_geburtstag = Person_hat_geburtstag;

return this;

}

Übersetzung von Vererbung/Spezialisierung:

Bzgl. der Verbundkomponenten wird Vererbung g p gim Wesentlichen durch Duplikation realisiert:

typedef struct sStudent Student;

struct sStudent {

String* name;

int gebdatum; /* in der Form JJJJMMTT */

void (*drucken)( Student* );

boolean (*hat_geburtstag)( Student*, int );

int matrikelnr;int matrikelnr;

int semester;

};

Zu beachten ist die notwendige Typanpassung beimi li it A t i d U t kl “

26.06.2007 257© A. Poetzsch-Heffter, TU Kaiserslautern

impliziten Argument in der „Unterklasse“.Type conversions for implicit arguments of subclass are necessary.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 16

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Inheritance and Specialization (2)Inheritance with respect to methods can be realized without codeduplication. Methods of superclass can be reused after appropriatetype conversion.

Bzgl. der Methoden lässt sich Vererbung ohne

Codeduplikation umsetzen; die Methoden der

Oberklasse lassen sich nach geeigneter

Student* StudentK

(String* n int gd int mnr int sem ) {

Oberklasse lassen sich nach geeigneter

Typkonvertierung unverändert verwenden:

(String* n,int gd,int mnr,int sem ) {

Student* this =

(Student*) malloc(sizeof(Student));

this->name = n;

this->gebdatum = gd;

this->matrikelnr = mnr;

this->semester = sem;

this->drucken = Student_drucken;

this->hat_geburtstag =

(boolean(*)(Student* int))(boolean(*)(Student*,int))

Person_hat_geburtstag;

return this;

}

Spezialisierung wird durch zusätzliche Attribute (s.o.)

und neue Prozeduren realisiert, die ggf. die

überschriebenen Methoden aufrufen:

void Student_drucken( Student* this ) {

Person_drucken( (Person*)this );

printf("Mnr:%d\n", this->matrikelnr );

printf("Sem:%d\n", this->semester );

26.06.2007 258© A. Poetzsch-Heffter, TU Kaiserslautern

p ( \ , );

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 17

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Inheritance and Specialization (3)

Specialization is realized by additional attributes and procedures thatmay call overridden methods:

Bzgl. der Methoden lässt sich Vererbung ohne

Codeduplikation umsetzen; die Methoden der

Oberklasse lassen sich nach geeigneter

Student* StudentK

(String* n int gd int mnr int sem ) {

Oberklasse lassen sich nach geeigneter

Typkonvertierung unverändert verwenden:

(String* n,int gd,int mnr,int sem ) {

Student* this =

(Student*) malloc(sizeof(Student));

this->name = n;

this->gebdatum = gd;

this->matrikelnr = mnr;

this->semester = sem;

this->drucken = Student_drucken;

this->hat_geburtstag =

(boolean(*)(Student* int))(boolean(*)(Student*,int))

Person_hat_geburtstag;

return this;

}

Spezialisierung wird durch zusätzliche Attribute (s.o.)

und neue Prozeduren realisiert, die ggf. die

überschriebenen Methoden aufrufen:

void Student_drucken( Student* this ) {

Person_drucken( (Person*)this );

printf("Mnr:%d\n", this->matrikelnr );

printf("Sem:%d\n", this->semester );

26.06.2007 258© A. Poetzsch-Heffter, TU Kaiserslautern

p ( \ , );

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 18

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Object Creation & Method Invocation

• Object creation corresponds to call of the constructor.• Method invocation is realized by selection and call of method

belonging to the object

Übersetzung von Objekterzeugung und Methodenaufruf:Methodenaufruf:

• Objekterzeugung entspricht einem „Konstruktoraufruf“;

• Methodenaufruf wird durch Selektion und

void main( String* argv[] ) {

int i;

Aufruf der zum Objekt gehörenden Methode realisiert.

Person* pf[3];

pf[0] = PersonK( "Meyer", 19631007 );

pf[1] = (Person*)

StudentK("M\"uller",19641223,758475,5);

pf[2] = (Person*)pf[2] = (Person*)

StudentK("Planck",18580423,3454545,47);

for( i = 0; i<3; i = i+1 ) {

pf[i]->drucken( pf[i] );

}}

}

Zu beachten ist die doppelte Angabe des Zielobjektspp g jbeim „Methodenaufruf“.

Dynamische Bindung wird also durch Verwendung vonProzedurzeigern erreicht.

26.06.2007 259© A. Poetzsch-Heffter, TU Kaiserslautern

g

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 19

Translation of Object-Oriented Language Constructs Translation into Procedural Languages

Translation of Object Creation & Method Invocation (2)

Note the duplicate reference to the target object in a "method call".Dynamic binding is realized by usage of procedure pointers.

Remarks:

• Record components are not "inherited" and have to be re-listed foreach subclass.

• No usage of superclass constructor• Explicit type conversion necessary• Direct pointers to methods of an object use needlessly much

memory.• Dynamic binding only requires dereferencing which is almost as

efficient as an ordinary procedure call.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 20

Translation of Object-Oriented Language Constructs Translation of Classes

3.2.3 Translation of Classes

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 21

Translation of Object-Oriented Language Constructs Translation of Classes

Translation of Classes

Classes declare:• attributes (in Java: fields)• constructors• methods

In the following, we consider a language that supports only singleinheritance (cf. Java), i.e., each class (except Object) has exactly onesuperclass.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 22

Translation of Object-Oriented Language Constructs Translation of Classes

Object Layout

Objects are handled as memory areas on the heap:• Each object of class C gets a variable (object state) for each

inherited and for each attribute declared in C.• Additionally, it gets a variable for referring to information about the

class and its methods.• As object identity, often the start address of the memory area is

used (or another appropriate address).

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 23

Translation of Object-Oriented Language Constructs Translation of Classes

Object Layout (2)

Example:

Objekte werden als Speicherbereiche auf

der Halde verwaltet:

Objektlayout:

der Halde verwaltet:

• Dabei enthält ein Objekt einer Klasse K für

jedes ererbte und jedes in K deklarierte

Attribut eine Variable (Objektzustand).

• Zusätzlich enthält es eine Variable, mittels der

Informationen über Methoden bzw. die Klasse

referenziert werden können.

• Als Identität des Objekts wird häufig die• Als Identität des Objekts wird häufig die

Anfangsadresse des Speicherbereichs

verwendet (bzw. eine geeignete andere Adresse).

Beispiel: (Objektlayout)

class A {

int a1;

private int a2;

Klassen- &

Methoden-

Informationprivate int a2;

}

Information

zu Klasse A

•class:

Objektreferenz

•class:

a1:

a2:

Wie bei Verbunden werden Attributinstanzen/Instanzvariablen

26.06.2007 261© A. Poetzsch-Heffter, TU Kaiserslautern

Wie bei Verbunden werden Attributinstanzen/Instanzvariablen

über eine Relativadresse (offset) bzgl. der Objektreferenz

adressiert.

Object Reference

Class and Method

Information for Class A

As for records, attribute instances/instance variables are addressed bya relative address (offset) with respect to the object reference.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 24

Translation of Object-Oriented Language Constructs Translation of Classes

Object Layout (3)The size of the instance variables depends on their type. In Java, int and floatvariables require 4 bytes, long and double variables require 8 bytes.

class A {

int a1;

private int a2;

...

}

class B extends A {class B extends A {

int b;

...

}Klassen- &

Methoden-class C extends B {

int c;

}

Methoden

Information

zu Klasse C

Objektreferenz

•class:

a1:

a2:

j

b:

c:

Die Größe der einzelnen Instanzvariablen hängt selbst-

verständlich von deren Typ ab. So benötigt man in Java

für int- und float-Variablen beispielsweise 4 Byte, für

long- und double-Variablen 8-Byte.

26.06.2007 262© A. Poetzsch-Heffter, TU Kaiserslautern

Object Reference

Class and Method

Information for Class C

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 25

Translation of Object-Oriented Language Constructs Translation of Classes

Object Layout (4)

Remarks:

• In the above example, we have not considered attribute instancesof the class Object.

• Private attribute instances of superclasses have to be present inall instances of subclasses:

Bemerkungen:

• Im obigen Beispiel haben wir Attributinstanzen der

Klasse Object vernachlässigt

• Private Attributinstanzen von Oberklassen müssen

auch in Instanzen von Unterklassen vorhanden sein:

class A {

int a1;

private int a2;

int m() { return a2; }

}

class B extends A {

int b;

int n() { return m(); }int n() { return m(); }

}

• Zur Klassen- und Methodeninformation siehe unten.Zur Klassen und Methodeninformation siehe unten.

• Die Reihenfolge der Attributinstanzen ist wichtig,

um Subtyping zu ermöglichen:

Jedes Unterklassen-Objekt muss überall dort

eingesetzt werden können, wo ein Oberklassen-

Objekt erwartet wird.

Deshalb müssen die Attributinstanzen der

Oberklasse in Ober und Unterklasse Objekten

26.06.2007 263© A. Poetzsch-Heffter, TU Kaiserslautern

Oberklasse in Ober- und Unterklasse-Objekten

die gleiche Relativadresse besitzen.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 26

Translation of Object-Oriented Language Constructs Translation of Classes

Object Layout (5)

• The ordering of attribute instances is important to allow forsubtyping:

Each subclass object can be placed in all positions where asuperclass object is expected.

Thus, the attribute instances of the superclass have to have thesame relative addresses in all sub- and superclass objects.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 27

Translation of Object-Oriented Language Constructs Translation of Classes

Example: Access to Subclass Objects

A avar = new B();

... a.avar.a2...

The relative address of a2 has to be independent of the dynamic typeof avar. The dynamic type of a reference-typed expression E in a stateS is the type of the object that is obtained by evaluating E in the stateS.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 28

Translation of Object-Oriented Language Constructs Translation of Classes

Alternative Object Layout

In some cases, also an object descriptor is used. Here, the example ofa C object:

Beispiel: (Zugriff auf Unterklassen-Objekte)

A B()A avar = new B();

... avar.a2 ...

d.h. Relativadresse von a2 muss unabhängig vom

dynamischen Typ von avar sein wobei derdynamischen Typ von avar sein, wobei der

dynamische Typ eines referenzwertigen Ausdrucks E

in einem Zustand S der Typ des Objekts ist, das

man bei Auswertung von E in S erhält.

Alternatives Objektlayout:

Teilweise wird auch mit einem Objektdeskriptor

b it t hi B i i l i C Obj ktgearbeitet, hier am Beispiel eines C-Objekts:

Klassen- &

Methoden-Objektreferenz

Information

zu Klasse C•class:

Deskriptor

a1:

a2:

b:

26.06.2007 264© A. Poetzsch-Heffter, TU Kaiserslautern

c:

Object ReferenceClass and Method

Information for Class C

Descriptor

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 29

Translation of Object-Oriented Language Constructs Translation of Classes

Alternative Object Layout (2)

Remarks:• Pros:

I all object descriptors have the same memory requirementsI memory block for instance variables can be more easily moved

(simplifies for instance garbage collection)• Cons:

I more memory per objectI additional dereferencing step for accessing instance variables

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 30

Translation of Object-Oriented Language Constructs Translation of Classes

Class Information

The content (and the extend) of the class information depends on thelanguage. Three typical examples:• Class information is not provided at runtime.• Class information contains all information required for dynamic

type conversion :A avar = new b();

B bvar = (B) avar;

• Class information is represented by an object that allowsintrospection (requesting class information at runtime) andreflection (modifying the program at runtime).

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 31

Translation of Object-Oriented Language Constructs Translation of Classes

Example: Introspection in Java

Java supports introspection by using objects of the class Class. Foreach type in a Java program, there exists one object of the classClass. The class Class contains amongst others:

• the static method forName

• the instance method getName

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 32

Translation of Object-Oriented Language Constructs Translation of Classes

Example: Introspection in Java (2)

Beispiel: (Introspektion in Java)

Java unterstützt Introspektion mittels Objekten der

Klasse Class Für jeden Typ eines Java-ProgrammsKlasse Class. Für jeden Typ eines Java-Programms

gibt es ein Objekt der Klasse Class. Die Klasse Class

besitzt unter anderem:

• die statische Methode forName

• die Instanzmethode getMethod

import java.lang.reflect.*;

public class Inspektor {

public static void main(String[] ss) {

die Instanzmethode getMethod

p ( g[] ) {

try{

Class klasse = Class.forName( ss[0] );

Method[] methoden = klasse.getMethods();

for( int i = 0; i < methoden.length; i++ ){

Method m = methoden[i];

Class retType = m.getReturnType();

String methName = m.getName();

Class[] parTypes = m.getParameterTypes();

S stem o t p int( etT pe getName() + " "System.out.print(retType.getName() + " "

+ methName+"(" );

for( int j = 0; j < parTypes.length; j++ ){

if( j > 0 ) System.out.print(", ");

System.out.print( parTypes[j].getName() );System.out.print( parTypes[j].getName() );

}

System.out.println( ");" );

}

} catch( ClassNotFoundException e ) {

System.out.println("Klasse "+ ss[0]+" fehlt");

26.06.2007 266© A. Poetzsch-Heffter, TU Kaiserslautern

System.out.println( Klasse + ss[0]+ fehlt );

}

} }

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 33

Translation of Object-Oriented Language Constructs Translation of Classes

Realization of Methods

Method information allows accessing methods belonging to an object:• It provides the data structure for realization of dynamic binding.• In class-based languages, all objects of a class have the same

methods; thus, method information of all objects of a class can bestored together. (more memory-efficient compared to realizationby procedures)

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 34

Translation of Object-Oriented Language Constructs Translation of Classes

Virtual Method Table

Classically, method information is stored in a virtual method/functionstable. (For simplicity, class information is not shown)

Methodenrealisierung:

Die Methodeninformation ermöglicht den Zugriff aufdie zu einem Objekt gehörenden Methoden:die zu einem Objekt gehörenden Methoden:

• Sie liefert die Datenstruktur zur Realisierung des

dynamischen Bindens.

• Da bei klassenbasierten Sprachen alle Objekte p j

einer Klasse die gleichen Methoden haben, kannman die Methodeninformation aller Objekte einerKlasse gemeinsam speichern. Dadurch spart mangegenüber der Realisierung von 3.2.2 erheblichgegenüber der Realisierung von 3.2.2 erheblichan Speicher.

Wir betrachten hier die klassische Realisierung mit

einer Methodentabelle (virtual method/functions table):

class A {

int a1;

int a2;

int m() { ... }

Alle A-Objekte teilen sich mtab

() { }

int n( int i ) {...}

}

ObjektreferenzA::m

A::n

•mtab:

a1:

a2:

A::n

26.06.2007 267© A. Poetzsch-Heffter, TU Kaiserslautern

(Aus Gründen der Übersichtlichkeit haben wir aufdie Angabe von Klasseninformation verzichtet.)

Object Reference

all objects share mtab

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 35

Translation of Object-Oriented Language Constructs Translation of Classes

Virtual Method Table (2)

• For each class, there exists exactly one method table. The pointerto the method table is set by the constructor.

• The method table contains pointers to the methodimplementations.

• This technique allows for subtyping, as the relative address of thesubclass methods can be chosen such that there are the sameaddresses in super- and subclasses.

• It further allows method overriding by changing the accordingmethod entry.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 36

Translation of Object-Oriented Language Constructs Translation of Classes

Method Overriding

• Es existiert also für jede Klasse genau eineMethodentabelle. Der Zeiger auf die Methoden-tabelle wird vom Konstruktor gesetzttabelle wird vom Konstruktor gesetzt.

• Die Methodentabelle enthält Zeiger auf die

Methodenimplementierungen.

• Die Technik ermöglicht Subtyping, da die Relativ-g yp g,

adressen von Oberklasse-Methoden so gewähltwerden können, dass sie in Ober- und Unterklassegleich sind.

• Die Technik ermöglicht Überschreiben durch• Die Technik ermöglicht Überschreiben durch

Ausstausch des entsprechenden Eintrags(s. Beispiel)

Beispiel: (Überschreiben von Methoden)

class A {

int a1; •mtab:A::m

A::nint a2;

int m() { ... }

int n( int i ){...}

}

a1:

a2:

A::n

class B extends A {

int b;

int m() { ... }

void p() { ... }

•mtab:

a1:

B::m

A::n

B::p

26.06.2007 268© A. Poetzsch-Heffter, TU Kaiserslautern

} a2:p

b:

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 37

Translation of Object-Oriented Language Constructs Translation of Classes

Method Overriding (2)A method is addressed indirectly by the method table and the relativeaddress:

Adressierung einer Methode jeweils indirekt über

Methodentabelle und Relativadresse:Methodentabelle und Relativadresse:

A avar = new A();

... avar.m() ... // M[avar.mtab]+RA(m)

! A::m

... avar.n(7) ... // M[avar.mtab]+RA(n)

! A::n

A avar = new B();

() // M[ t b]+RA( )... avar.m() ... // M[avar.mtab]+RA(m)

! B::m

... avar.n(7) ... // M[avar.mtab]+RA(n)

! A::n

Wie bei den Instanzvariablen gewährleistet die richtigeWie bei den Instanzvariablen gewährleistet die richtige

Reihenfolge der Einträge in der Methodentabelle,

dass auf ein Unterklassen-Objekt wie auf ein

Oberklassen-Objekt zugegriffen werden kann.

Dabei werden automatisch überschreibende Methoden

ausgewählt, sofern vorhanden.

26.06.2007 269© A. Poetzsch-Heffter, TU Kaiserslautern

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 38

Translation of Object-Oriented Language Constructs Translation of Classes

Method Overriding (3)

As for instance variables, the correct ordering of the entries in themethod table allows that a subclass object can be accessed in thesame way as a superclass object.

Overriding methods are selected automatically, if applicable.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 39

Translation of Object-Oriented Language Constructs Translation of Classes

Realization of Constructors

Constructors are realized by procedures. Source language semanticstypically requires the following for an object of class C:• Allocation of memory of the new C object• Recursive calls of the superclass constructors• Execution of the called constructor of C• Potentially: class loading, initialisation of variables

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 40

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

3.2.4 Problems of Multiple Inheritance

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 41

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

Multiple Inheritance

The translation technique considered so far can only be used forlanguages with single inheritance. In this section, we sketch

• the concept of multiple inheritance• the problems associated with multiple inheritance

Multiple inheritance exists, for instance, in C++ or Eiffel.

With multiple inheritance, a class can inherit from several classes.

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 42

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

Multiple Inheritance (2)

Example:Beispiel: (Mehrfachvererbung)

In folgendem Klassendiagramm erbt E mehrfach:

A

k3

k4

B

k1

k2

C D

k5 k2

k3

E

k6

Problematik:Problematik:

• Soll E die Attribute von A doppelt erben, d.h. von

jeder Komponente zwei Kopien besitzen?

(nur relevant im Zusammenhang mit Attributen)

• Wie sollen Namenskonflikte aufgelöst werden?

( E erbt zwei Komponenten mit Namen k2)

• Mit welchen Techniken können E-Objekte so realisiert

26.06.2007 271© A. Poetzsch-Heffter, TU Kaiserslautern

werden, dass sie auch als A-, B-, C- und D-Objekte

auftreten können?

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 43

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

Difficulties of Multiple Inheritance

• Does E inherit the attributes of A twice, i.e., does it contain twocopies of each component? (only relevant for attributes)

• How are name conflicts resolved? (E inherits two componentswith name k2.)

• How can E objects be realized such that they can be used as A, B,C or D objects in the same way?

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 44

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

Difficulties of Multiple Inheritance (2)

Assuming, E inherits twice from A, an E object contains the followingcomponents:Unter der Annahme, dass E von A doppelt erbt,

besitzt ein E-Objekt die folgenden Komponenten:

E

B::k1

B::k2

A::k3

D C B A •

A::k3

A::k4

C::k5

A::k3

A::k4A::k4

D::k2

D::k3

E::k6

Mit obigem Komponentenlayout kann ein E-Objekt

direkt als B- und C-Objekt verwendet werden, nicht

aber als A- oder D-Objekt.

Lösungsansätze:

1. Implizite Typkonvertierung mit Veränderung der

Referenz in den SpeicherbereichReferenz in den Speicherbereich.

(Nachteil: ggf. Problem bei Objektidentität)

2. Adressierung mit klassenspezifischen, global

verwendbaren Relativadressen (s. Appel).

(N ht il i ht d l t P

26.06.2007 272© A. Poetzsch-Heffter, TU Kaiserslautern

(Nachteil: nicht modular, gesamtes Programm

muss bekannt sein).

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 45

Translation of Object-Oriented Language Constructs Problems of Multiple Inheritance

Difficulties of Multiple Inheritance (3)

With the above object layout, E can be used directly as a B object or asa C object, but not as an A or D object.

Solutions:

• Implicit type conversion with modification of the reference into thememory area (Drawback: potentially, problem with object identity)

• Addressing with class-specific, global relative addresses(cf. Appel) (Drawback: non-modular, complete program has to beknown)

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 46

Translation of Object-Oriented Language Constructs Further Aspects of Object-Oriented Languages

3.2.5 Further Aspects of Object-Oriented Languages

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 47

Translation of Object-Oriented Language Constructs Further Aspects of Object-Oriented Languages

Further Aspects of Object-Oriented Languages

• Static methods• Nested classes• Virtual classes• Encapsulation aspects• Dynamic Loading• Reflection

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 48

Translation of Object-Oriented Language Constructs Further Aspects of Object-Oriented Languages

Example: Local Classes

3.2.5 Weitere Aspekte bei OO-Sprachen

• statische Methoden

• geschachtelte Klassen

• virtuelle Klassen

• Kapselungsaspekte

• dynamisches Laden

• Reflexion

Beispiel: (Lokale Klassen)

class Outer {

Outer w( int j ) {

int i = 2;

class Local extends Outer {

Outer w( int jj ) {

System.out.println("i == " +i);

System.out.println("j == " +j);

return this;

}

}

System.out.println("j == " + j );

return new Local();

26.06.2007 273© A. Poetzsch-Heffter, TU Kaiserslautern

}

}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 49

Translation of Object-Oriented Language Constructs Further Aspects of Object-Oriented Languages

Example: Local Classes (2)

public class LocalClassTest {

static public void main(String[] args){

Outer ov = new Outer();

ov.w( 5 ).w( 7 );

ov.w( 7 ).w( 9 );

}

}

Gibt es Fehler?

Was ist die Ausgabe und warum?Was ist die Ausgabe und warum?

Lesen Sie zu Abschnitt 3.2:

Wilhelm, Maurer:

Abschnitt 5 2 und Anfang von 5 3 (S 182 195)• Abschnitt 5.2 und Anfang von 5.3 (S. 182-195)

Appel:

• Sections 14.1-14.3, S. 303-310

26.06.2007 274© A. Poetzsch-Heffter, TU Kaiserslautern

Questions:

• Are there errors?• What is the output and why?

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 50

Translation of Object-Oriented Language Constructs Further Aspects of Object-Oriented Languages

Literature

Recommended Reading:

• Wilhelm, Maurer: Sect. 5.2 and 5.3. (pp. 182 – 195)• Appel: Sect. 14.1–14.3, (pp. 303 – 310)

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 51

Summary - A Simple Compiler

3.3 Summary - A Simple Compiler

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 52

Summary - A Simple Compiler

A Simple Compiler - The Structure

Input File(source code)

Scanner

Parser

Name & TypeAnalysis

Translator

Code Generator

Output File(target code)

token stream

(abstract) syntax tree

attributed (abstract) syntax tree (SL)

abstract syntax tree (TL)

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 53

Summary - A Simple Compiler

Tools for Compiler Realization

• Scanner: JFlex• Parser: ANTLR, JavaCup• Abstract Syntax and Attribution for Name and Type Analysis and

Translation/Code Generation: Katja

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 54

Summary - A Simple Compiler

Scanner Specification - MiniJava in JFlex

[...]DIGIT = [0-9]LETTER = [a-zA-Z]%%[ \t\n\r]* { }"//" [^\r\n]* (\n | \r | \r\n) { }"/*" [^*] ~"*/" { }"class" { return symbol(TokenType.CLASS); }[...]"void" { return symbol(TokenType.VOID); }"static" { return symbol(TokenType.STATIC); }"int" { return symbol(TokenType.INT); }"boolean" { return symbol(TokenType.BOOLEAN); }"return" { return symbol(TokenType.RETURN); }"if" { return symbol(TokenType.IF); }"else" { return symbol(TokenType.ELSE); }"while" { return symbol(TokenType.WHILE); }[...]

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 55

Summary - A Simple Compiler

Parser Specification - MiniJava in JavaCUP

[...] Statement ::=Block:b{: RESULT = b; :}

| IF:s ParExpression:e Statement:stm{: RESULT = If(sleft, sright, e, stm, Block(-1,-1)); :}

| IF:s ParExpression:e Statement:stm ELSE Statement:estm{: RESULT = If(sleft, sright, e, stm, estm); :}

| WHILE:s ParExpression:e Statement:body{: RESULT = While(sleft, sright, e, body); :}

| RETURN:s Expression:e SEMI{: RESULT = Return(sleft, sright, e); :}

| RETURN:s SEMI{: RESULT = VoidReturn(sleft, sright); :}

| SEMI:s{: RESULT = Block(sleft, sright); :}

| ExpressionStatement:e{: RESULT = e; :} ; [...]

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 56

Summary - A Simple Compiler

Katja Specification for MiniJava Abstract Syntax

[...]Statement = Block ( Integer line, Integer column,

BlockStatements body )| If ( Integer line, Integer column, Expression cond,

Statement thenStmt, Statement elseStmt )| While ( Integer line, Integer column,

Expression cond, Statement body )| Return ( Integer line, Integer column,

Expression retValue )| VoidReturn ( Integer line, Integer column )| Assignment ( Integer line, Integer column,

Expression left, Expression right )| Expression

[...]

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 57

Summary - A Simple Compiler

Implementation of Name Analysis using Katja

public static DeclarationPos lookupInfinal ScopePos scope, final IdentifierPos id)throws CantFind {

DeclarationPos result;

if (scope == null) throw new CantFind(id);

// search in cache if we already made that lookup[...]

result = scope.Switch(new ScopePos.Switch<DeclarationPos, NE>() {public DeclarationPos CaseBlockStatementsPos

(final BlockStatementsPos term) throws NE {[...]}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 58

Summary - A Simple Compiler

Implementation of Name Analysis using Katja (2)

public DeclarationPos CaseMethodDeclPos(final MethodDeclPos term)throws NE {

for (FormalParameterPos param : term.params()) {if (nameEquals(param.ident(), id)) return param;

}return null; // did not find declaration of id

}

public DeclarationPos CaseClassBodyDeclsPos(final ClassBodyDeclsPos term) throws NE {

[...]}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 59

Summary - A Simple Compiler

Implementation of Name Analysis using Katja (3)

public DeclarationPos CaseTypeDeclsPos(final TypeDeclsPos term)throws NE {

for (TypeDeclPos typeDeclPos : term) {if (nameEquals(typeDeclPos.ident(), id))

return (ClassDeclPos) typeDeclPos;}return null; // did not find declaration of id}

});

return result;}

c© Prof. Dr. Arnd Poetzsch-Heffter Translation to Target Language 60