Corso di Informatica Modulo T3 2 Ambiente locale e globale

Похожие документы
Corso sul linguaggio Java

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Funzioni, Stack e Visibilità delle Variabili in C

Linguaggio C: le funzioni. Introduzione e sintassi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Corso di Informatica Modulo T1 1-Il concetto di algoritmo

Linguaggio C: le funzioni. Introduzione e sintassi

Definizione di classi. Walter Didimo

Parametri Formali di una Funzione e Record di Attivazione

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

La Gestione della Memoria. Carla Binucci e Walter Didimo

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

La formalizzazione dell informazione: Dati e Diagrammi di Flusso

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Spazio di indirizzamento virtuale

Scope, Memoria e Tabella dei Simboli

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Perché il linguaggio C?

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri. Sottoprogrammi: richiami

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri

Allocazione Dinamica della Memoria

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Lezione 6 Introduzione al C++ Mauro Piccolo

La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Транскрипт:

Corso di Informatica Modulo T3 2 Ambiente locale e globale 1 Prerequisiti Struttura elementare della memoria Area dati e area programma Programmazione elementare 2 1

Introduzione Lo scopo di questa Unità è capire come può avvenire l esecuzione di una funzione. Cosa succede quando avviene l istanza di una funzione? Si può usare una funzione per cambiare il valore di certe variabili? Diamo una risposta a questi quesiti. 3 Compiti e sottocompiti Quando avviene l istanza di una funzione, accadono alcuni eventi che vogliamo studiare e che somigliano molto a ciò che accade quando, mentre stiamo svolgendo un compito, ce ne viene chiesto un altro più urgente: sospendiamo il compito principale memorizziamo a che punto siamo arrivati cambiamo il contesto di lavoro eseguiamo il compito sopraggiunto ritorniamo al lavoro sospeso 4 2

L esecuzione di funzioni Quando viene istanziata una funzione, si svolge una serie di azioni analoghe. Per capire questo meccanismo, dobbiamo ricordare come un programma viene memorizzato nella RAM. Al momento dell istanza di una funzione nel programma chiamante, si ha la seguente serie di azioni: sospensione del programma in corso salvataggio dello stato del programma chiamante passaggio dei parametri dal programma alla funzione esecuzione della funzione ripristino del programma chiamante 5 L esecuzione di funzioni sospensione: il programma chiamante (di solito il main()) viene sospeso in modo temporaneo. salvataggio: viene salvato il contesto del programma chiamante (vengono salvati i valori dei registri e l indirizzo del punto di ritorno) passaggio dei parametri: l esecutore assegna ai parametri formali i valori dei parametri attuali presenti nell istanza della funzione esecuzione della funzione: l esecutore esegue le istruzioni contenute nella funzione, restituendo (se la funzione lo prevede) il valore di ritorno al programma chiamante. ripristino: l esecutore restituisce il controllo al programma chiamante, che riprende l esecuzione dal punto successivo a quello in cui è stato interrotto. 6 3

L esecuzione di funzioni 01 02 03 05 06 07 08 09 RAM I1 I2 F(a,b) I3 I4 F(x,y) istruzioni Ritorno (1) (2) L esecuzione del programma viene sospesa all istruzione F(a,b) (1). Avviene il salvataggio dell indirizzo dell istruzione I3 () successiva (punto di ritorno) in una struttura apposita di sistema detta pila di attivazione. I valori di a e b vengono copiati in x ed y pila di attivazione. 7 L esecuzione di funzioni 01 02 03 05 06 07 08 09 RAM I1 I2 F(a,b) I3 I4 F(x,y) istruzioni Ritorno (1) (2) Questa struttura è caratterizzata dal fatto che, analogamente ad una pila di piatti, è possibile aggiungere o togliere elementi soltanto dalla cima. In tal modo, quando una funzione ne chiama altre, gli indirizzi vengono estratti in ordine inverso a quello di immissione, così da riprendere l esecuzione dei lavori in sequenza corretta. pila di attivazione. 8 4

L esecuzione di funzioni 01 02 03 05 06 07 08 09 RAM I1 I2 F(a,b) I3 I4 F(x,y) istruzioni Ritorno (1) (2) Dopo il salvataggio viene eseguita la funzione F(x,y) con i valori attuali (2) pila di attivazione. 9 (4) L esecuzione di funzioni (3) 01 02 03 05 06 07 08 09 I1 I2 F(a,b) I3 I4 RAM F(x,y) istruzioni Ritorno (1) (2) Al termine della esecuzione (3) della funzione con il Ritorno, viene ripristinato lo stato del programma interrotto, memorizzato nella pila di attivazione, e ripresa (4) la sua esecuzione. pila di attivazione. 10 5

Cambiare i valori dei parametri Al momento dell istanza, l esecutore fa una copia dei parametri attuali ed opera su queste, non sulle variabili originali. Quindi la funzione NON è in grado di restituire in uscita i valori dei parametri modificati, avendo lavorato sulle loro copie. PROBLEMA: Come può la funzione restituire in uscita i valori dei parametri modificati? Sappiamo che al massimo può restituire un solo valore che mediante l istruzione Ritorno() viene comunicato al programma principale. Vediamo come un sottoprogramma possa restituire i valori modificati al programma chiamante. 11 Ambiente locale e globale Il programma chiamante e i sottoprogrammi operano ciascuno in una zona distinta della memoria che chiamiamo ambiente. L area dati di un programma si distingue in ambiente locale di ciascuna funzione (l insieme delle variabili accessibili alla funzione) e ambiente globale (quello accessibile a tutte le funzioni). Ambiente globale Ambiente locale sottoprogramma 1 Ambiente locale sottoprogramma 2 12 6

Visibilità locale delle variabili Le variabili dichiarate all interno di una funzione: prendono il nome di variabili locali sono allocate al momento dell istanza della funzione in un estensione dell area dati detta stack e vengono deallocate alla fine della funzione; NON sono visibili nelle funzioni esterne ad essa (sono private) possono avere lo stesso nome di variabili globali (ma, quando il controllo torna al programma chiamante, riprendono automaticamente il loro valore originario Poiché il programma principale è esso stesso una funzione, le variabili dichiarate nel suo interno sono variabili locali ad esso. Lo stack funziona secondo la tecnica LIFO (Last In First Out), per cui le variabili vengono allocate man mano che si istanziano le funzioni e vengono deallocate in ordine inverso. 13 Visibilità locale delle variabili Esempio Intero minimo() Inizio Intero m;. Se (a<b) m=a; Altrimenti m=b; Ritorna(m); Fine. La funzione minimo() calcola il minimo che è posto nella variabile locale Intero m che viene allocata nello stack all inizio della funzione e deallocata alla fine L istruzione Ritorna(m) comunica al programma principale il valore m, ponendolo nel nome della funzione (minimo). 14 7

Visibilità globale delle variabili Quando si vuole che una variabile abbia visibilità in tutto il programma, occorre definire la variabile all esterno di tutte le funzioni. In tal caso la variabile si dice variabile globale e sarà visibile ed utilizzabile da tutte le funzioni (è una variabile pubblica). Se una di esse modifica il valore di una variabile globale, il cambiamento sarà osservabile in tutte le altre funzioni. In alcuni casi questo fatto NON è desiderabile per cui in genere occorre preferire l uso di variabili locali. 15 Visibilità globale delle variabili Intero a, b; Algoritmo P Inizio Intero u, v;.. Fine. Intero f (Intero x) Inizio Intero m, n, u;.. Ritorna m; Fine; Nell esempio, la funzione f () può modificare le variabili globali a e b e le sue variabili locali m, n e u, ma non u e v (locali a P) Il programma P può modificare le variabili a e b e le variabili u e v, ma non le variabili m ed n (che sono locali ad f ()) La funzione f () può modificare la sua variabile locale u, poiché è la variabile visibile al momento, ma, all interno del programma P, la variabile u torna ad assumere il valore che aveva inizialmente 16 8

Visibilità globale delle variabili Quindi un primo modo per risolvere il PROBLEMA è usare le variabili globali: in questo caso una funzione può restituire più di un valore (modificato) ma presenta due svantaggi: obbliga alla dichiarazione di variabili globali, con conseguente spreco di spazio di memoria (sono variabili che occupano memoria per tutto il tempo di esecuzione del programma) impedisce la privatezza consentita invece dall uso di variabili locali Vediamo un altro modo per risolvere il PROBLEMA in cui una funzione debba modificare un suo parametro e restituirlo modificato al programma chiamante 17 Passaggio per indirizzo Come sappiamo, quando si passa un parametro ad una funzione, essa ne crea una copia ed elabora su questa. Questa tecnica prende il nome di passaggio del parametro per valore. Un altro interessante modo per risolvere il problema della modifica del valore da parte di una funzione è chiamato passaggio del parametro per indirizzo (detto anche passaggio per riferimento). Ciò può essere ottenuto passando alla funzione non la variabile, ma il suo indirizzo. In tal modo, al ritorno al programma chiamante, l indirizzo della variabile resterebbe il medesimo, ma ovviamente il suo contenuto risulterebbe modificato. 18 9

Passaggio per indirizzo Per indicare che passiamo l indirizzo del parametro e non il contenuto del parametro, utilizziamo la parola Ref (che ricorda la parola Riferimento) Ad esempio, lo scambio del valore di due variabili sarebbe: void Scambio (Ref Intero x, Ref Intero y) Inizio Intero temp; temp = x; x = y; y = temp Fine; x ed y rappresentano non il contenuto delle variabili, ma i rispettivi indirizzi L indirizzo delle due variabili resta lo stesso sia all interno che all esterno della funzione. Le modifiche che essa apporta, saranno effettuate non tramite il nome (contenuto) delle variabili ma attraverso i loro indirizzi. 19 Passaggio per indirizzo Algoritmo main() Inizio Intero a,b; Leggi(a); Leggi(b); Scambio(a,b); Stampa(a); Stampa(b); Fine. Nell istanza della funzione si inviano le variabili (i loro nomi). La funzione tramite la parola chiave Ref ne prende i rispettivi indirizzi e realizza lo scambio del contenuto di quegli indirizzi. 20 10

Input e Output di funzioni Quindi, riassumendo: passaggio per valore: il parametro consente l input per la funzione; l output potrà essere il valore della funzione (se non è void) passaggio per indirizzo: il parametro consente sia l input che l output. Si usa quando la funzione in genere deve restituire più valori in uscita, oppure quando si vuole modificare il valore di un parametro formale e mantenere questa modifica anche nel programma chiamante. 21 Struttura di un sottoprogramma In generale un sottoprogramma ha il seguente aspetto: tipo ident (lista parametri) Inizio dichiarazione variabili locali istruzioni; Ritorna (espressione); Fine; tipo è il tipo di dato calcolato dalla funzione ident e restituito al programma principale tramite Ritorna (espressione) Se la funzione non restituisce alcun valore si pone void Indica la lista dei parametri formali Contiene la dichiarazione delle variabili locali della funzione (non hanno nessun riferimento nelle funzioni esterne) 22 11

Struttura di un sottoprogramma In generale un sottoprogramma ha il seguente aspetto: tipo ident (lista parametri) Inizio dichiarazione variabili locali istruzioni; Ritorna (espressione); Fine; La parola Fine va fatta seguire dal ; per indicare il termine della funzione ma non del programma principale. Contiene il blocco di istruzioni interne alla funzione. Ritorna (espressione) serve a comunicare al programma principale il risultato del calcolo effettuato dalla funzione. È assente nel caso di funzione void. 23 Utilità dei sottoprogrammi L uso dei sottoprogrammi consente di: semplificare l analisi del problema, dando una visione sintetica ma completa del problema principale semplificare la fase di realizzazione (sviluppo, compilazione, esecuzione e manutenzione) riutilizzare i sottoprogrammi in altri programmi 24 12

Sottoprogrammi predefiniti In tutti i linguaggi di programmazione, vengono forniti numerosi insiemi di funzioni già pronte per l utilizzo da parte del programmatore. Queste funzioni si dicono built-in, nel senso che sono a corredo del compilatore del linguaggio. Le funzioni predefinite sono raggruppate in insiemi detti librerie di sottoprogrammi. Si possono ad esempio avere librerie di tipo: matematico (elaborazioni matematiche, trigonometriche, ecc) stringa (elaborazione di stringhe) carattere (elaborazione su caratteri) 25 Argomenti Compiti e sottocompiti L esecuzione di funzioni Cambiare i valori dei parametri Ambiente locale e globale Visibilità locale delle variabili Visibilità globale delle variabili Passaggio per indirizzo Input e Output di funzioni Struttura di un sottoprogramma Utilità dei sottoprogrammi Sottoprogrammi predefiniti 26 13

Altre fonti di informazione P.Gallo, F.Salerno Informatica Generale 1, ed. Minerva Italica G.Callegarin Corso di Informatica 1, ed. CEDAM 27 14