Esecuzione dei programmi CAP 21
L’esecuzione dei programmi Java viene svolta dalla macchina virtuale Java (JVM). La JVM è una macchina virtuale che fornisce al computer capacità diverse da quelle che possiede direttamente. Mentre il computer memorizza i dati come sequenza di bit e byte nella sua memoria e li elabora eseguendo le istruzioni del proprio linguaggio macchina, la macchina virtuale, fornita dalla JVM consiste in un ambiente in cui esistono diversi oggetti, dotati di stato e comportamento, che cooperano mediante richieste di esecuzione di operazioni. La JVM rende il computer una macchina virtuale in cui “vivono” degli oggetti, ciascuno dei quali porta con sé le informazioni relative al proprio stato.
Memoria a runtime
La memoria a runtime è la memoria durante il tempo di esecuzione dei programmi. Nel caso di Java, che è un linguaggio di programmazione ad oggetti, la memoria viene usata da una parte per memorizzare gli oggetti e il loro stato, dall’altra per memorizzare le informazioni necessarie all’esecuzione di metodi e costruttori. A runtime, la gestione della memoria avviene per aree di memoria, ovvero per gruppi consecutivi di byte.
- Memorizzare le istruzioni, opportunamente codificate, del programma in esecuzione
- Memorizzare lo stato di un oggetto
- Memorizzare le variabili locali relative all’attivazione di un metodo o di un costruttore
Durante l’esecuzione di un programma le aree di memoria vengono assegnate in modo dinamico, mediante operazioni di allocazione e deallocazione. Allocare un’area di memoria significa riservare una porzione di memoria per uno scopo specifico. Deallocare un’area di memoria significa liberare quella porzione di memoria, affinché possa essere usata per altri scopi.
La gestione della memoria è dinamica nel senso che:
- L’area di memoria per un oggetto viene allocata solo nel momento della costruzione dell’oggetto e deallocata quando l’oggetto diventa “inutile”
- L’area di memoria per l’attivazione di un metodo o costruttore viene allocata solo quando il metodo o il costruttore viene invocato, e viene deallocata quando l’esecuzione del metodo o costruttore termina
Record di attivazione
La gestione della memoria per l’esecuzione di metodi è basata sulla gestione di aree di memoria chiamate record di attivazione. Un record di attivazione ha lo scopo di memorizzare le informazioni necessarie ad una singola esecuzione (ovvero attivazione) di un metodo. L’attivazione di un metodo è l’intervallo di tempo relativo alla sua esecuzione, che va dalla sua invocazione al momento in cui termina. Ciascun record di attivazione è relativo all’attivazione di un metodo, e non semplicemente a un metodo.
- Le variabili locali del metodo
- L’esecutore del metodo, ovvero un riferimento all’oggetto responsabile dell’esecuzione dell’attivazione del metodo
- Il punto di ritorno, ovvero un’indicazione del punto in cui il metodo è stato invocato
Quando l’esecuzione del metodo terminerà, la JVM restituirà il controllo a chi ha invocato il metodo, e l’esecuzione riprenderà dal punto in cui il metodo chiamante è stato interrotto, ovvero il punto di ritorno.
Gestione esecuzione di un metodo
- Quando un metodo viene invocato viene allocato un record di attivazione per gestire le informazioni relative all’attivazione di questo metodo, viene stabilito il riferimento all’esecutore e il punto di ritorno.
- Il metodo viene eseguito, eseguendo ordinatamente le istruzioni. Ogni volta che un’istruzione del metodo deve accedere a una variabile locale del metodo, la variabile che viene acceduta è quella allocata nel record di attivazione associato all’attivazione di questo metodo.
- Quando il metodo termina, il controllo torna dove specificato nel punto di ritorno, eventualmente insieme alla restituzione di un valore. Contestualmente alla terminazione, il record di attivazione viene deallocato, in quanto le informazioni che esso contiene non sono più utili.
I diversi record di attivazione sono memorizzati in una zona di memoria chiamata pila di attivazione (o stack). La pila di attivazione è una sequenza ordinata di record di attivazione. Una delle due estremità è designata come testa. Ogni volta che viene invocato un metodo, il relativo record di attivazione viene allocato nella pila di attivazione, e diventa la nuova testa della pila.
Ricorsione CAP 22
La ricorsione è una tecnica di programmazione basata sulla definizione di metodi e classi ricorsivi. Un metodo ricorsivo è un metodo che, direttamente o indirettamente può invocare se stesso. La ricorsione è connessa alla nozione matematica di induzione. Un insieme è definito in modo induttivo se è definito in termini di se stesso; una funzione è definita in modo induttivo se è definita in termini di se stessa.
Esempio: L’insieme dei numeri naturali può essere definito in modo induttivo come il più piccolo insieme che gode delle seguenti proprietà:
- 0 è un numero naturale;
- Se N è un numero naturale, allora anche il successore di N (N+1) è un numero naturale.
Da ciò si deduce:
- 2 è un numero naturale se vale 0 o se è il successore di un numero naturale; ma 2 è il successore di 1, perciò è un numero naturale se anche 1 lo è
- 1 è un numero naturale se vale 0 o se è il successore di un numero naturale; ma 1 è il successore di 0, perciò è un numero naturale se anche 0 lo è
- 0 è un numero naturale se vale 0 o se è il successore di un numero naturale; ci troviamo nel primo caso, dunque 0 è un numero naturale
- Come conseguenza che 0 è un numero naturale si può concludere che anche 1 è un numero naturale
- Come conseguenza che 1 è un numero naturale si può concludere che anche 2 è un numero naturale, come volevamo.
Nella definizione induttiva di un insieme è possibile identificare:
- Uno o più casi base, ciascuno dei quali descrive l’appartenenza di alcuni elementi all’insieme in modo diretto: “0 è un numero naturale”
-
Domande esame orale Fondamenti di informatica
-
Domande e Risposte orale Fondamenti di informatica
-
Appunti codici per esame orale Fondamenti di informatica
-
Informatica parte orale