La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Java Virtual Machine La caratteristiche di base sono analoghe a quella della P-code però più complessa perchè i dati strutturati (oggetti e array) sono.

Presentazioni simili


Presentazione sul tema: "Java Virtual Machine La caratteristiche di base sono analoghe a quella della P-code però più complessa perchè i dati strutturati (oggetti e array) sono."— Transcript della presentazione:

1 Java Virtual Machine La caratteristiche di base sono analoghe a quella della P-code però più complessa perchè i dati strutturati (oggetti e array) sono implementati nella JVM. Analogamente alla P-code, ha lo stack per gestire i metodi e lo heap per memorizzare gli oggetti (li vedremo nel dettaglio)

2 Data Types Dal momento che rappresentazione dei dati è nascosta nella implementazione della JVM, i tipi di dati in Java e nella JVM sono abbastanza similari. Un’eccezione è tipo Boolean che non esiste nella JVM e è implementato come un int o come un byte. Gli oggetti sono memorizzati nello heap e sono accessibili usando il loro indirizzo (reference). I tipi primitivi sono immediatamente utilizzabili.

3 Data Types I tipi di dati sono primitivi : int, char, byte, short, long float, double, returnAddress. Nessuna assunzione viene fatta sul numero di bytes usati. La specifica definisce solo l’insieme di valori del tipo. References (pointers): sono indirizzi nello heap. Nessuna assunzione viene fatta sulla reppresentazione. Esiste un valore null che representa il valore indefinito .

4 Data Types Oggetti: sono dati strutturati representati nello heap come coppie di etichetta, valore dove i valori posono essere di un tipo primitive o un reference Arrays: sono oggetti i cui elementi sono tutti dello stesso tipo (i.e. sono valori di un tipo primitivo type o un reference a oggetti dello stesso tpo). Sono anch’essi contenuti nello heap. Il numero di elementi dell’array è fissato (non cambia durante l’esecuzione).

5 Lo Stack Gli elementi dello Stack sono chiamati cell o slots. La reale dimensione degli slots dipende dall’implementazione. Di solito uno slot contiene un single dato. long e integers and double precision floating point numbers sono eccezioni, in quanto di solito richiedono 2 slots. Lo stack è costituito da: area locale contiene variabili che sono locali ad un metodo e argomenti. Ha dimensione fissa. Operand storage contiene operandi per le istruzioni funzionali (aritmetiche ecc). Esiste durante l’esecuzione di un metodo

6 Lo Heap L’ area dati è chiamata Heap.
Contiene tutti gli objects statici e dinamici e gli array. L’accesso agli oggetti creati dinamicamente avviene attraverso i reference (ovvero indirizzi), che devono essere del tipo corretto. Il Garbage collector cerca nello heap, la memoria non utilizzata.

7 Class area (è permanente)
Proprietà delle classi: Superclass, interfaces implementate, liste di campi, che possono essere statici (class variables) o dinamici (instance variables) list of methods whose implementation is stored in the method area Le proprietà delle classi non possono essere cambiate, durante l’esecuzione del programma. La memoria usata per una classe può essere liberata dal garbage collector se la classe non è più utlizzata. Definizioni di Interfacce

8 Method area Contiene le definizioni dei metodi ovvero:
descrittori, parametri e type calcolato dal metodo oltre al corpo Constant pool contiene tutte le costanti contenute nel programma

9 Memory in JVM Heap Constant Pool Class area Class name
SuperClass: .... Fields: .... Methods: ... Object Method area Stack Operands Local Variables perimeter Array main Operands Local Variables Static memory Dynamic memory

10 Instruction Set creazione di oggetti invocazione di metodi
accesso e modifica dei campi Formato Istruzioni di trasferimento dei dati Conversioni di tipo Istruzioni funzionali (aritmetiche ecc) Istruzioni di controllo (control flow)

11 Oolong Oolong è un simbolico del bytecode, nel seguito introduciamo direttive e istruzioni come possono essere utilizzate in Oolong. Le istruzioni sono la rappresentazione simbolica delle istruzioni in byte code. le direttive non hanno un corrispettivo nel byte code. (anche se ci sono dei delimitatori) Tenere separate le info sulla JVM e quelle su Oolong

12 Directives, comments (Oolong?)
; questo è un commento tutte le direttive iniziano con un “.” Le direttive sono necessarie per dichiarare: classi, interfacce , gerarchie (.class, .interface, .super) restrizioni di memory .limit stack .limit locals metodi .method .end fields .field Tenere separate le info sulla JVM e quelle su Oolong

13 Descriptors (Oolong) Descrittori di tipo sono utilizzati per definire campi (field) e metodi sono: I int, F float, D double, C char etc. (vedi tabella) Descrittori analoghi a quelli di Java: public, static, final ecc. servono per specificare la visibilità ed altre proprietà di classi campi e metodi (ognuno ha i suoi descrittori, anche se alcuni sono comuni, vedi tabelle). .class super diverso da .super

14 Istruzioni : il formato
Il formato delle istruzioni è variabile op, op index, op index1 index2, op data1 data2,...

15 Definizioni di classi e metodi (Oolong)
Un primo esempio: Hello getstatic fieldname Type mette sullo stack il field ldc “string” mette sullo stack la costante specificata invokevirtual methodname(ArgType)RType Esercizi .class super diverso da .super

16 Istruzioni di trasferimento dei dati constants
ldc c load una costante c può essere un tipo primitivo bipush n push l valore di tipo T nella variabile locale n sullo stack -128 <=n<=127 sipush n push il valore di tipo T nella variable local n sulo stack <=n<=32.767 iconst_n push la costante n sullo stack., 0 <=n<=5 Tconst_n push la costante n sullo stack. T∈{l,d}, 0 <=n<=1 fconst_n push la costante n sullo stack. 0 <=n<=2 aconst_null push il reference null sullo stack iconst_m1 push int -1 sullo stack

17 Instruzioni di trasferimento dei dati local variables
Tload n push del valore di tipo T nella variabile locale n sullo stack, T∈{i,f,l,d,a} Tload_n push del valore di tipo T nella variable locale n sullo stack 0<=n<=3, T∈{i,f,l,d,a} Tstore n store the value of type T on top of the stack, into the local variable n, T∈{i,f,l,d,a} Tstore_n store the value of type T on top of the stack, into the local variable n, T∈{i,f,l,d,a}

18 Type conversion La conversione di tipo include operazioni di conversione che non possono implicare perdita di informazioni. Quindi conversione da qualcosa che necessita meno memoria a qualcosa che necessita più memoria : i2l int to long , i2f int to float etc.

19 Narrowing Narrowing include operazioni di conversione che possono implicare perdita di information. Quindi è la conversione da qualcosa che (in generale) necessita più memoria a qualcosa che necessita meno memoria : l2i long to int , f2i float to int etc.

20 Istruzioni funzionali
iadd, ladd, fadd, dadd, isub,... imul,..idiv, irem, ..., ineg il tipo del risultato è sempre lo stesso del tipo degli operandi, se necessario bisogna inserire un’operazione di conversione. gli operandi sono sullo stack l’operazione li toglie dallo stack e lascia sullo stack il risultato

21 Esempio Un esempio: Sum.j Esercizi .class super diverso da .super

22 Operazioni bit a bit (bitwise instructions)
ishl, lshl: integer e long shift left (inserisce 0) ishr, lshr: integer e long shift right (inserisce 0 o 1 ripetendo il bit di segno) iushr,lushr, integer e long unsigned shift right (inserisce sempre 0 ) iand, land: integer e long and bit a bit ior, lor: integer e long or bit a bit

23 Istruzioni di manipolazione dello stack
dup: crea un copia del top dello stack (serve in genere per modificare un’oggetto e lasciare sullo stack un puntatore all’oggetto modificato) swap: inverte i due elementi sul top dello stack pop: elimina il top dello stack (usato in genere per eliminare dallo stack il risultato di un metodo di cui interessano solo i side effects).

24 Esempi (Oolong) Un esempio: fare qualcosa con lo shift e type conversion Esercizi .class super diverso da .super

25 Oggetti Creazione: new nomeclasse
Costruttori: vengono definiti come i metodi con il nome di default <init> Uso dei campi getfield, getstatic, putfield, putstatic esempi: Dichiarazione di metodo ed invocazione: Argomento Dichiarazione di classe con field e inizializzazione: Persona .class super diverso da .super

26 Invocazione di metodi di istanza: invokevirtual
Attenzione nella JVM non c’è overloading, che, in Java infatti, viene risolto a tempo di compilazione invokevirtual MetName(ArgType)Type cerca il metodo nella classe e sue super classi (virtual dispaching) nella variabile 0 c’è il receiver (this), nella variabile 1 il 1o argomento, nella variabile 2 il 2o ecc

27 Invocazione di metodi di istanza: invokespecial
invokespecial MetName(ArgType)Type invoca il metodo della classe specificata nel nomeMet, bypassando il dispaching Per gli argomenti vale quanto detto per la invokevirtual Se la classe in cui il metodo è definito è dichiarata super l’invokespecial opera come un invokevirtual iniziando a cercare dalla super classe.

28 Invocazione di metodi statici: invokestatic
invokestatic MetName(ArgType)Type invoca il metodo della classe specificata nel MetName, analoga al invokespecial ma in questo caso non c’è il receiver quindi solo gli argomenti sono sullo stack

29 Terminazione dei metodi
return termina l’esecuzione e ritorna la chiamante, ovvero il frame sul top dello stack viene eliminato e l’istruzione che viene eseguita è quella successiva all’invocazione, xreturn con x ∈ {i, f, d, l, a} che indica n il tipo del valore risultato del metodo a è indica un reference type. La correttezza del tipo viene controllata dal verification process.

30 Istruzioni di controllo
etichette (label) che individuano indirizzi di istruzioni: sono ammessi solo indirizzi all’interno del metodo (sono in bytecode offset rispetto all’istruzione corrente) goto label: l’istruzione che viene eseguita è quella all’indirizzo corrispondente alla label

31 Istruzioni di controllo: salto condizionato
ne esistono vari insiemi: confronto di interi if_icmpgt label ecc. confronta i 2 interi sul top dello stack confronto di reference if_acmpeq label, if_acmpneq label, 2 reference sullo stack, ifnull label, ifnonnull label 1 reference sullo stack confronto con 0 ifeq label, ifne label ecc. 1 int sullo stack Esempi: Branch e Loop

32 Istruzioni di controllo: salto condizionato
Tutte queste lasciano -1, 0 o 1 sullo stack, bisogna poi usare un ifeq iflt ecc per trasferire il controllo confronto di double: dcmpg, dcmpl 2 double sullo stack confronto di float fcmpg, fcmpl 2 float sullo stack confronto di long lcmp 2 long sullos tack

33 Istruzioni di controllo: switch e tableswitch
Entrambe si aspettano un valore intero sullo stack. switch tableswitch Esempi: Confronto e Confronto1 Esercizi: rifare gli esercizi risolti con gli if usando switch e tableswitch opportunamente

34 Istruzioni di controllo: subroutines
È un goto con ritorno, somiglia ad un invocazione di subroutine senza argomenti. il comando è jsr label salta all’istruzione di indirizzo label e lascia sullo stack l’indirizzo di ritorno. il codice che inizia a label deve memorizzare l’indirizzo di ritorno in una variabile locale ret n ritorna il controllo all’istruzione il cui indirizzo è contenuto nella variabile argomento. Non modifica il top dello stack.

35 Arrays Gli array sono oggetti e come tali sono memorizzati nello heap.
newarray type crea un array i cui elementi sono di tipo type. il numero di elementi dell’array è l’intero sul top dello stack il puntatore all’array è lasciato sullo stack le operazioni per accedere ad un elemento e per modificarlo sono xload e xstore

36 Arrays xload si aspetta sullo stack il puntatore all’array e l’indice dell’elemento da caricare sullo stack xstore si aspetta sullo stack il puntatore all’array e l’indice dell’elemento da modificare e il nuovo valore da memorizzare x {a, b, c, d, f , l, s} Esempi: EsArray e ProvaTest (esempio che mostra come sa possibile mischiare programmi Java compilati e programmi ottenuti con Oolong

37 Cast Anche il cast è un’operazione della JVM.
checkcast Type controlla che il top dello stack sia del tipo specificato. Il top dello stack NON viene rimosso. Il cast permette di superare il verification process. Eventualmente se il tipo non e quello atteso si verificherà un errore a runtime.

38 Eccezioni nella JVM Dichirazione e creazione dell’eccezione come sottoclasse di java/lang/Exception con il costruttore <init> (vedi esempio ElementNotFoundException) direttive nel metodo .catch Eccezione from label1 to label2 using label3 direttiva .throws Eccezione nel metodo se questo può lanciare un Eccezione.

39 Eccezioni nella JVM l’istruzione athrow deve trovare sullo stack l’eccezione, se nel metodo c’è un catch dell’eccezione lo stack degli operandi viene ripulito, l’eccezione è ricaricata sullo stack e l’esecuzione procede con il codice a partire da label3 del catch appropriato. Altrimenti il processo del metodo corrente termina, e l’eccezione è comunque ricaricata sullo stack. Esempio EsArray.j EsArray2.j

40 Format of Java Binary Class
Constant pool size Magic number Version information Constant pool Access flags This Class Super Class Interface count Interfaces Field count Field information Methods Method count Attribute count Attributes Esempio di Hello

41 Garbage collector Tipo di tecnica usata

42 Verification process Cosa viene fatto


Scaricare ppt "Java Virtual Machine La caratteristiche di base sono analoghe a quella della P-code però più complessa perchè i dati strutturati (oggetti e array) sono."

Presentazioni simili


Annunci Google