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.

Slides:



Advertisements
Presentazioni simili
L’architettura della Java Virtual Machine
Advertisements

Massa Laura Mela Enrica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Allocazione dinamica della memoria
Ereditarietà e Polimorfismo
1 Numeri interi e numeri in virgola mobile F. Bombi 2 6 novembre 2003.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
IL PROCESSORE I MICROPROCESSORI INTEL Il microprocessore è un circuito integrato dotato di una struttura circuitale in grado di effettuare un determinato.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi I PUNTATORI.
Programmazione in Java Parte I: Fondamenti Lezione 1 Dott. Marco Faella.
Programmazione in Java Parte II Lezione 5 Dott. Marco Faella.
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica PROBLEMI E ALGORITMI LINGUAGGIO MACCHINA.
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Java World Introduzione.
Java: concetti e costrutti base
Introduzione al linguaggio C
Comandi assembly Il termine assembly deriva dal programma traduttore in linguaggio macchina assembler, l’assemblatore non fa altro che assemblare il.
Elementi di Informatica
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
7. Strutture di controllo Ing. Simona Colucci
Cammino dei Dati (Datapath)
Programmazione a oggetti
Unità didattica 1: Introduzione al linguaggio Java
Organizzazione fisica
TIPI PRIMITIVI TIPI STRUTTURATI
JAVA usa una rappresentazione in VIRGOLA MOBILE
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Corso Java Introduzione.
Vettori dinamici Definiremo la classe vector.
Programmazione e Laboratorio di Programmazione
Java World Cicli e Array.
FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a. a
Controllo e microprogrammazione
OBJECT ORIENTED DATABASE
ABAP Objects ALV Grid Mantova, 30 dicembre 2018.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Programmazione e Laboratorio di Programmazione
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
SQL per la modifica di basi di dati
Sommario cos’è un tipo di dato astratto astrazione tramite specifica:
APPUNTI SUL LINGUAGGIO C
LINUX: struttura generale
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
La struttura dei primi programma in C
Lucidi della Pof.ssa Pazienza
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Processi decisionali e funzioni di controllo
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
concetti ed applicazioni
Java Introduzione.
Array Un array è un contenitore “contiene” al massimo un numero predefinito di oggetti dello stesso tipo. Ogni oggetto dell'array è detto “elemento” Ad.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
Ese 3 (del 3 Aprile 2003).
Programmazione Procedurale
Transcript della presentazione:

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)

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.

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 .

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).

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

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.

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

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

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

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)

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

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

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

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

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

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 -32.768 <=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

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}

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.

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.

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

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

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

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).

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

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

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

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.

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

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.

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

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

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

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

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.

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

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

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.

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.

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

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

Garbage collector Tipo di tecnica usata

Verification process Cosa viene fatto