Nomi e Ambiente. Nicola Fanizzi. Linguaggi di Programmazione [010194] 20 apr, 2016. Dipartimento di Informatica Università degli Studi di Bari



Documenti analoghi
Linguaggi di Programmazione

Programmazione II. Lezione 5. Daniele Sgandurra 2/11/2010.

Programmazione II. Lezione 6. Daniele Sgandurra 5/11/2010.

PROGRAMMAZIONE Nomi, binding, regole di visibilità (scope)

Nomi e ambiente. Blocchi e regole di scoping. Blocchi e regole di scoping Nomi e ambiente 1 / 39

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Sintassi

Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Esempio

Nomi, binding e regole di scope

Informatica 3. LEZIONE 2: Sintassi e semantica

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Corso di Linguaggi di Programmazione. Organizzazione di un processo in memoria (1)

Nomi, binding e regole di scope

Corso di Linguaggi di Programmazione

Funzioni, Stack e Visibilità delle Variabili in C

Strutture dati nel supporto a run time

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

Funzioni, Stack e Visibilità delle Variabili in C

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09

Paolo Bison. Fondamenti di Informatica A.A. 2006/07 Università di Padova

Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.

Gestione della Memoria

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi. Programmi. Ciclo di sviluppo di programmi. Obiettivo

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Informatica 3. LEZIONE 4: Semantica operazionale. Modulo 1: Strutture a blocchi Modulo 2: Comportamenti dinamici

LINGUAGGI DI PROGRAMMAZIONE

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

Macchine astratte, linguaggi, interpretazione, compilazione

Macchine astratte, linguaggi, interpretazione, compilazione

Linguaggi di programmazione

Linguaggi, Traduttori e le Basi della Programmazione

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Corso di Linguaggi di Programmazione

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

Programmazione Orientata agli Oggetti in Linguaggio Java

PROGRAMMAZIONE Nomi, binding

Introduzione all OOP!

Dati due punti sul piano calcolare la loro distanza

AA Nomi, binding

ASTRAZIONE ASTRAZIONE

Linguaggi di Programmazione

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

Ingegneria del Software

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

Macchine astratte, linguaggi, interpretazione, compilazione

Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)

Linguaggi di programmazione e astrazione

Fasi di un Compilatore

Introduzione alla programmazione A. Ferrari

Introduzione alla programmazione. Alice Pavarani

FUNZIONI FUNZIONI COME COMPONENTI SW

Esercitazioni di Informatica 3

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

Le istruzioni corrispondono univocamente a quelle macchina, ma vengono espresse tramite nomi simbolici i (parole chiave)

Linguaggi di Programmazione Corso C. Parte n.10 Gestione della Memoria. Nicola Fanizzi

FUNZIONI FUNZIONI COME COMPONENTI SW

stampa 1 su un architettura little-endian, 0 su una big-endian. Dunque, alla domanda qual è il significato di un programma?

Fondamenti di Informatica

Linguaggi di Programmazione I Lezione 1

Nomi. ! Un nome in un linguaggio di programmazione è. esa9amente quello che immaginate

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

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

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Scope, Memoria e Tabella dei Simboli

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Oggetti. Oggetti e occultamento delle informazioni. Definire oggetti. Oggetti. Definire oggetti la sintassi. Convenzione sugli identificatori

I Linguaggi di Programmazione

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Linguaggi di alto livello, compilatori e interpreti

DISPENSE DI PROGRAMMAZIONE LINGUAGGI A TIPIZZAZIONE FORTE: IL COSTRUTTO DI TIPO. TIPI SEMPLICI: TIPI PRE-DEFINITI E TIPI DEFINITI DAL PROGRAMMATORE.

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Dichiarazione di una classe. Dichiarazione ereditarietà

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Elementi di programmazione

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Traduzione ed Interpretazione. Queste sconosciute

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

Esempi (pseudo-c):! float f(){ * sin(0.75); } float f1(int x) { 2 + x * sin(0.75); } Esempio

Elementi di programmazione

Marco Faella Introduzione al corso

Una funzione riceve dati di ingresso in corrispondenza ai parametri

Variabili. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Pr ogramming Languages. Sottoprogrammi

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

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

Linguaggi e Ambienti di Programmazione

Costanti e Variabili

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Transcript:

Nomi e Ambiente Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari Linguaggi di Programmazione [010194] 20 apr, 2016

Sommario 1 Nomi Definizione Astrazione Elementare Progettazione dei nomi Binding 2 Ambiente Introduzione Blocco Operazioni 3 Scope Regole di scope Scope statico Scope dinamico 4 Esercizi Nomi e Ambiente 20 apr, 2016 2 / 58

Agenda 1 Nomi Definizione Astrazione Elementare Progettazione dei nomi Binding 2 Ambiente 3 Scope 4 Esercizi Nomi e Ambiente 20 apr, 2016 3 / 58

Nomi Nome: sequenza di caratteri usata per denotare una componente del programma oggetti (in senso generale) identificatori: token alfanumerici simboli di operatori (primitivi): +, -,... Esempi var area: real; float area; dichiarazioni di nomi di variabili (PASCAL, C) calcolaarea(b,h: real): real; float calcolaarea(float b, float h); dichiarazioni nomi di funzione (PASCAL, C) Nomi e Ambiente 20 apr, 2016 4 / 58

Nomi [... cont.] Osservazione nome oggetto denotato stesso oggetto con molti nomi stesso nome per più oggetti è possibile riutilizzare gli stessi nomi in parti diverse del programma per componenti diverse gli alias Nomi e Ambiente 20 apr, 2016 5 / 58

Astrazione Elementare Astrazione sui dati es. usare il nome di una variabile permette di astrarre dalla locazione di memoria, indirizzo, ecc. area := (b * h) / 2 ambiente: implementazione del meccanismo che determina l associazione nome locazione Astrazione sul controllo un nome associato ad un insieme di comandi regole per determinare visibilità e utilizzo del sottoprogramma (interfaccia) Nomi e Ambiente 20 apr, 2016 6 / 58

Oggetti denotabili Oggetto denotabile con un nome definito dall utente variabili, parametri formali, sottoprogrammi, tipi, etichette, moduli, costanti, eccezioni,... definito dal linguaggio tipi primitivi, operazioni primitive, costanti predefinite, parole riservate,... Nomi e Ambiente 20 apr, 2016 7 / 58

Progettazione dei nomi domande tipiche: Lunghezza massima? Sono permessi caratteri di connessione (es. "_")? Differenza maiuscole/minuscole (case-sensitivity)? Le parole speciali sono considerate parole riservate o parole-chiave?. Nomi e Ambiente 20 apr, 2016 8 / 58

Progettazione dei nomi [... cont.] Lunghezza dei nomi Se la lunghezza massima consentita è troppo corta, i nomi difficilmente possono essere significativi (ossia possono suggerire un significato) Esempi in vari linguaggi FORTRAN I: max 6 COBOL: max 30 FORTRAN 90 e ANSI C: max 31 ADA e JAVA: nessun limite, e tutti sono significativi C++: nessun limite dai progettisti, ma gli implementatori possono imporre un limite Nomi e Ambiente 20 apr, 2016 9 / 58

Progettazione dei nomi [... cont.] Connettori Esempi in vari linguaggi PASCAL, MODULA-2, e FORTRAN 77 non li permettono Altri lo fanno (quali?) Case sensitivity Svantaggio per la leggibilità: nomi che appaiono simili sono diversi Peggio ancora in C++ e JAVA poiché i nomi predefiniti mescolano maiuscole o minuscole (es. IndexOutOfBoundsException) In C, C++ e JAVA i nomi sono case-sensitive Non succede in altri linguaggi Nomi e Ambiente 20 apr, 2016 10 / 58

Progettazione dei nomi [... cont.] Parole speciali Aiuto alla leggibilità Usate per delimitare o separare l espressione delle istruzioni Una parola chiave è una parola che è speciale solo in certi contesti, es., in FORTRAN Real VarName Real è un tipo di dato seguito da un nome pertanto si tratta dell uso come parola chiave Real = 3.4 Real è una variabile in questo caso Una parola riservata è una parola speciale che non può essere usata per un nome definito dall utente Nomi e Ambiente 20 apr, 2016 11 / 58

Binding Un binding 1 è un associazione, come quella tra un attributo ed un entità o tra un operazione ed un simbolo (operatore) binding-time: momento in cui avviene il binding 1 IPA: / baindin/ Nomi e Ambiente 20 apr, 2016 12 / 58

Binding-time Language design time: progettazione del linguaggio collega i nomi primitivi (costanti ed operatori) Language implementation time*: implementazione associare un tipo floating point ad una rappresentazione Programming-time: scrittura del programma definisce le associazioni che saranno portate a termine nella fase successiva Compile-time: Compilazione del programma associare una variabile ad un tipo es. variabili globali in C o PASCAL Nomi e Ambiente 20 apr, 2016 13 / 58

Binding-time [... cont.] Linking-time: Collegamento del programma associare un nome ad una variabile esterna Loading-time*: Caricamento del programma associare una variabile ad una cella di memoria es. in FORTRAN 77 o ad una variabile static (in C) Run-time: Esecuzione del programma associare una variabile locale non statica ad una cella di memoria puntatori/riferimenti a variabili in memoria dinamica Nomi e Ambiente 20 apr, 2016 14 / 58

Binding statico / dinamico Un associazione è statica se si salda prima dell esecuzione (run time) e resta immutata per tutta l esecuzione del programma Un associazione è dinamica se è introdotta per la prima volta durante l esecuzione e può essere cambiata nel corso della stessa Nomi e Ambiente 20 apr, 2016 15 / 58

Agenda 1 Nomi 2 Ambiente Introduzione 3 Scope Blocco Operazioni 4 Esercizi Nomi e Ambiente 20 apr, 2016 16 / 58

Ambiente Ambiente (referencing environment) insieme delle associazioni nomi-oggetti denotabili in un dato punto del programma ed in un dato momento della sua esecuzione usualmente si escludono quelle definite dal linguaggio nella macchina astratta: per ogni nome e per ogni sezione del codice si determina l associazione corretta Nomi e Ambiente 20 apr, 2016 17 / 58

Dichiarazioni dichiarazione: costrutto che permette di introdurre una nuova associazione nell ambiente corrente esplicita ad es. 1 int x; 2 int f() { 3 return 0; 4 } 5 type T = int; implicita inferenza del tipo dall uso dell oggetto associato al nome talvolta dallo stesso nome Nomi e Ambiente 20 apr, 2016 18 / 58

Associazioni molteplici stesso nome oggetti diversi 1 { 2 int pippo; 3 pippo = 2; 4 { 5 char pippo; 6 pippo = a; 7 } 8 } il nome pippo denota due variabili diverse la molteplicità può dipendere anche dal momento in cui si giunge in una sezione di codice caso dei parametri o nomi locali nei sottoprogrammi ricorsivi Nomi e Ambiente 20 apr, 2016 19 / 58

Associazioni molteplici [... cont.] aliasing: nomi diversi (alias) per lo stesso oggetto Esempi passaggio parametri per riferimento: visibile sia la variabile passata sia il parametro che ne ha preso l indirizzo union (C), record con varianti (PASCAL) molteplici espressioni riferite ad un oggetto Esempio a una stessa var. dinamica. Cosa stampa (C)? 1 int * X, * Y; 2 X = (int * ) malloc(sizeof (int)); 3 4 * X = 1; Y = X; 5 6 * Y = 5; printf("%d", * X); Nomi e Ambiente 20 apr, 2016 20 / 58

Blocco Blocco: regione di codice identificata da segnalatori di inizio e fine che possa contenere dichiarazioni locali a tale regione begin... end ALGOL e derivati {... } C e derivati let... in... LISP blocco inline (o anonimo) può comparire dovunque possa comparire un comando semplice blocco di sottoprogramma l ambiente del corpo del sottoprogramma viene esteso con le dichiarazioni dei parametri Nomi e Ambiente 20 apr, 2016 21 / 58

Ambiti statici Un blocco serve a creare ambiti statici in unità di programma Esempi C e C++: 1 for (...) { 2 int index; 3... 4 } ADA: 1 declare LCL : FLOAT; 2 begin 3... 4 end Nomi e Ambiente 20 apr, 2016 22 / 58

Ambienti e Blocchi L ambiente cambia con l entrata e l uscita dai blocchi Un blocco è il costrutto di granularità minima cui è associabile un ambiente costante Ambiente di un blocco: ambiente corrente quando il blocco viene eseguito costituito soprattutto dai binding per i nomi dichiarati localmente nel blocco Nomi e Ambiente 20 apr, 2016 23 / 58

Annidamento e Sovrapposizione blocchi Spesso annidabili la definizione di un blocco inclusa in quella di un altro in C, i blocchi associati a sottoprogrammi non possono essere annidati in PASCAL e ADA è possibile avere blocchi di sottoprogrammi all interno di altri sottoprogrammi Mai sovrapponibili l ultimo blocco aperto deve essere il primo ad essere chiuso vale pressoché per tutti i linguaggi che prevedono i blocchi Nomi e Ambiente 20 apr, 2016 24 / 58

Blocchi e visibilità Una dichiarazione locale ad un blocco è visibile in un altro blocco se il binding creato dalla stessa è presente anche nell ambiente del secondo Regola di visibilità canonica: dichiarazione locale visibile anche in tutti i blocchi annidati eccezione: blocco annidato nel quale compaia una nuova dichiarazione per quel nome; la nuova associazione oscura la precedente (buco di visibilità, shadowing) Osservazioni non c è visibilità dall esterno verso l interno binding interni non attivi nell ambiente del blocco esterno blocchi allo stesso livello hanno visibilità separate Nomi e Ambiente 20 apr, 2016 25 / 58

Tipi d ambiente Ambiente associato ad un blocco è costituito da: locale binding per nomi introdotti da dichiarazioni nel blocco compresi i binding dei parametri formali come per le var. locali non-locale binding per nomi visibili nel blocco ma non dichiarati localmente si considerano i binding esterni globale binding creati all inizio dell esecuzione del programma nomi usabili in tutti i blocchi fa parte dell ambiente non-locale Nomi e Ambiente 20 apr, 2016 26 / 58

Tipi d ambiente [... cont.] Osservazioni regole di visibilità: determinano come i nomi dichiarati in blocchi esterni sono visibili nei blocchi interni importando codice da moduli esterni i relativi binding fanno parte dell ambiente globale Nomi e Ambiente 20 apr, 2016 27 / 58

Tipi d ambiente [... cont.] 1 A: { 2 int a = 1; 3 B: { 4 int b = 2; 5 int c = 2; 6 C: { 7 int c = 3; 8 int d; 9 d = a+b+c; 10 printf("%d",d); 11 } // C 12 D: { 13 int e; 14 e = a+b+c; 15 printf("%d",e); 16 } // D 17 } // B 18 } // A A: blocco dell ambiente globale contiene il binding per a B: ambiente locale contiene b e c locali ed eredita il binding per a dall ambiente globale C: ambiente locale annidato in quello di B contiene c (nuova) e d locali eredita il binding per b dall ambiente non-locale ed a dall ambiente di A D: ambiente locale annidato in quello di B contiene e locale eredita i binding per b e c dall ambiente di B ed a dall ambiente di A Nomi e Ambiente 20 apr, 2016 28 / 58

Operazioni sull ambiente entrata in un blocco 1 creazione delle associazioni per i nomi locali 2 disattivazione delle associazioni per nomi con binding non-locali preesistenti uscita da un blocco 1 distruzione delle associazioni per nomi locali 2 riattivazione delle associazioni per nomi oscurati Nomi e Ambiente 20 apr, 2016 29 / 58

Operazioni su nomi ed ambiente Più in generale: creazione binding nome-oggetto (naming) distruzione binding nome-oggetto (unnaming) riferimento ad oggetto mediante il nome (referencing) disattivazione binding nome-oggetto riattivazione binding nome-oggetto Osservazione per effetto delle regole di visibilità un ambiente contiene binding attivi e binding disattivati Nomi e Ambiente 20 apr, 2016 30 / 58

Operazioni su su oggetti denotabili creazione accesso modifica distruzione allocazione di memoria necessaria nome = binding = locazione = valore le regole rendono l associazione univoca nome = binding = locazione e modifica del valore nella locazione deallocazione delle risorse Nomi e Ambiente 20 apr, 2016 31 / 58

Operazioni su su oggetti denotabili [... cont.] Osservazioni creazione e binding spesso contemporanee es. dichiarazioni di variabili int x; ciò non vale sempre! lifetime(oggetto) < > lifetime(binding) > parametri formali e variabili < riferimento sospeso (dangling) Nomi e Ambiente 20 apr, 2016 32 / 58

Agenda 1 Nomi 2 Ambiente 3 Scope Regole di scope Scope statico Scope dinamico 4 Esercizi Nomi e Ambiente 20 apr, 2016 33 / 58

Scope Lo scope di un associazione è il segmento di istruzioni per il quale essa è visibile gli ambienti possono cambiare in base alle operazioni definite su di essi ambienti non locali più difficili da trattare Nomi e Ambiente 20 apr, 2016 34 / 58

Scope [... cont.] Esempio Quale valore viene stampato? 1 A:{ 2 int x = 0; 3 4 void procedura() { 5 x = 1; 6 } 7 8 B: { 9 int x; 10 procedura(); 11 } 12 13 printf("%d",x); 14 } Nomi e Ambiente 20 apr, 2016 35 / 58

Regole di scope Determinano la validità dei binding nel passaggio da un ambiente all altro: una dichiarazione locale ad un blocco è visibile in esso ed in tutti i blocchi annidati annidamento si può intendere in senso statico flusso del testo sorgente del programma in senso dinamico flusso d esecuzione del programma differiscono solo rispetto ad ambienti non locali e non globali - negli altri casi coincidono Nomi e Ambiente 20 apr, 2016 36 / 58

Scope statico Basato sulla struttura sintattica del sorgente: ambiente in ogni punto stabilito dal compilatore i. dichiarazioni locali definiscono l ambiente locale non quelle in blocchi annidati ii. l uso di un nome in un blocco comporta: l utilizzo del binding dell ambiente locale, se esiste; altrimenti, si risale la gerarchia dei blocchi alla ricerca di un ambiente non locale contenente un binding valido ambito più esterno: parole predefinite del linguaggio iii. il nome di un blocco fa parte dell ambiente esterno immediatamente precedente al blocco vale anche per i nomi dei sottoprogrammi: i binding del nome sono nell ambiente esterno, sono quindi visibili anche in quello interno ciò rende possibili le chiamate ricorsive Nomi e Ambiente 20 apr, 2016 37 / 58

Scope statico [... cont.] Le variabili possono essere occultate da una sezione di programma avente una variabile più vicina con lo stesso nome In C++ e ADA è ammesso l accesso a queste variabili "nascoste" In C++: class_name::name In ADA: unit.name Nomi e Ambiente 20 apr, 2016 38 / 58

Scope statico [... cont.] Esempio Quali valori vengono stampati? 1 { 2 int x = 0; 3 void proc(int n) 4 { 5 x = n+1; 6 } 7 proc(3); 8 printf("%d",x); 9 { 10 int x = 0; 11 proc(3); 12 printf("%d",x); 13 } 14 printf("%d",x); 15 } Nomi e Ambiente 20 apr, 2016 39 / 58

Scope statico [... cont.] vantaggi: leggibilità e comprensibilità basta scorrere le dichiarazioni nel sorgente ottimizzazione e controllo di correttezza il compilatore può decidere (quasi) tutto modalità usata dalla maggior parte dei linguaggi ALGOL, PASCAL, C, C++, ADA, JAVA, SCHEME,... svantaggi: relativamente complicata gestione a run-time gerarchia degli ambienti locali e non gerarchia delle attivazione dei blocchi Nomi e Ambiente 20 apr, 2016 40 / 58

Problemi di scope (statico) Problemi: DOVE possono essere introdotte dichiarazioni QUAL è l esatta visibilità delle variabili locali PASCAL regole restrittive i. dichiarazioni ad inizio blocco e PRIMA dell uso ii. binding valevoli da inizio a fine blocco (possibili buchi) iii. dichiarazioni PRIMA dell uso C e ADA più flessibili valevoli dalla dichiarazione a fine blocco eccezioni (alla iii.) tipi ricorsivi sottoprogrammi forward PASCAL e nomi funzioni C JAVA disciplina mista dichiarazioni ovunque e valide fino a fine blocco dichiarazione membro vale per tutta la classe Nomi e Ambiente 20 apr, 2016 41 / 58

Scope dinamico Con lo scope statico l avvicendarsi degli ambienti non locali non segue il flusso di attivazione/disattivazione dei blocchi questo rende la gestione degli ambienti a run-time più complessa Per semplificare... Nomi e Ambiente 20 apr, 2016 42 / 58

Scope dinamico [... cont.] Regola basata sulla sequenza di chiamata delle unità di programma e non su come appaiono nel sorgente criterio temporale anziché spaziale modalità usata in alcuni dialetti di LISP, APL, SNOBOL, PERL,. Nomi e Ambiente 20 apr, 2016 43 / 58

Scope dinamico [... cont.] Esempio binding per la x nel blocco di prima()? 1 { 2 const x = 0; 3 4 void prima() { 5 printf("%d",x); 6 } 7 8 void seconda() { 9 const x = 1; 10 prima(); 11 } 12 13 seconda(); 14 } Nomi e Ambiente 20 apr, 2016 44 / 58

Scope dinamico [... cont.] Regola di scope dinamico L associazione per un nome non locale X in un punto P del programma è la più recente tra quelle create per X ad essere attiva quando il flusso di controllo raggiunge P implementata con ricerca nella pila dei record di attivazione dei blocchi/sottoprogrammi che hanno fatto raggiungere P per l ambiente locale (e quello globale) non c è differenza con la regola dello scope statico Nomi e Ambiente 20 apr, 2016 45 / 58

Scope dinamico [... cont.] Esempio binding per la x nel blocco di prima()? 1 { 2 const x = 0; 3 4 void prima() { 5 printf("%d",x); 6 } 7 8 void seconda() { 9 const x = 1; 10 { const x = 2; } 11 prima(); 12 } 13 14 seconda(); 15 } Nomi e Ambiente 20 apr, 2016 46 / 58

Scope dinamico [... cont.] vantaggi: flessibilità stesso sottoprogramma si comporta diversamente a seconda del momento in cui viene invocato può dipende dal valore di var. non locali anziché da parametri: Esempio stampa( ) usa il colore indicato dalla var. colore 1 { colore = FF000; 2 stampa(testo); 3 } svantaggi: minore leggibilità e comprensibilità difficile ricostruire le dichiarazioni dal sorgente gestione differita al run-time poco usata nei linguaggi general-purpose Nomi e Ambiente 20 apr, 2016 47 / 58

Visibilità e Durata Visibilità e Durata sono a volte strettamente correlate, ma sono concetti differenti si consideri il caso di una variabile static in una funzione C/C++ vive tra una chiamata e l altra visibile solo quando si chiama la funzione Nomi e Ambiente 20 apr, 2016 48 / 58

Costanti con nome variabile vincolata ad avere un dato valore assegnatole durante la sua memorizzazione usate per parametrizzare i programmi il legame con i valori può essere statico (costanti manifeste) o dinamico Esempi: FORTRAN 90: espressioni a valori costanti ADA, C++ e JAVA: espressioni di ogni tipo vantaggi leggibilità e modificabilità dei programmi Nomi e Ambiente 20 apr, 2016 49 / 58

Agenda 1 Nomi 2 Ambiente 3 Scope 4 Esercizi Nomi e Ambiente 20 apr, 2016 50 / 58

Esercizi Es. 1: Cosa stampa sotto scope statico? 1 int X = 0; 12 2 int Y; 3 4 void incr() { 5 X++; 6 } 7 8 void incr2() { 9 X++; 10 incr(); 11 } 13 read(y); 14 if Y > 0 { 15 int X; 16 incr2(); 17 } 18 else 19 incr2(); 20 21 write(x); Nomi e Ambiente 20 apr, 2016 51 / 58

Esercizi [... cont.] Es. 2: Quali e quanti valori sono stampati (scope dinamico)? 1 int X = 1; 13 2 int Y; 14 read(y); 3 4 void fie() { 5 foo(); 6 X = 0; 7 } 8 9 void foo() { 10 int X; 11 X = 5; 12 } 15 16 if Y > 0 { 17 int X = 4; 18 fie(); 19 } 20 else 21 fie(); 22 23 write(x); Nomi e Ambiente 20 apr, 2016 52 / 58

Esercizi [... cont.] Es. 3: Nello schema seguente inserire nelle zone indicate con // 1 e // 2 codice utile a far sì che le due chiamate a foo(), da dichiarare in // 1, assegnino a x con scope statico, lo stesso valore con scope dinamico, valori diversi 1 { 2 int i; 3 // 1 4 for (i=0; i<=1; i++) { 5 int x; 6 // 2 7 x = foo(); 8 } 9 } Nomi e Ambiente 20 apr, 2016 53 / 58

Esercizi [... cont.] Es. 4: Sotto scope statico cosa stampa? (passaggio y per valore) 1 { 2 int x = 2; 3 int fie(int y) { 4 x = x + y; 5 } 6 7 { 8 int x = 5; 9 fie(x); 10 write(x); 11 } 12 write(x); 13 } Es. 5: E se lo scope è dinamico e il passaggio per riferimento? Nomi e Ambiente 20 apr, 2016 54 / 58

Esercizi [... cont.] Es. 6: Scope statico e passaggio per riferimento: cosa stampa? 1 { 2 int x = 2; 3 4 void fie(reference int y) { 5 x = x + y; 6 y = y + 1; 7 } 8 9 { 10 int x = 5; 11 int y = 5; 12 fie(x); 13 write(x); 14 } 15 write(x); 16 } Nomi e Ambiente 20 apr, 2016 55 / 58

Esercizi [... cont.] Es. 7: Scope statico: cosa stampa? 1 { 2 int x = 2; 3 4 void fie(value int y) { 5 x = x + y; 6 } 7 8 { 9 int x = 5; 10 fie(x++); / * Nota: post-incremento * / 11 write(x); 12 } 13 14 write(x); 15 } Nomi e Ambiente 20 apr, 2016 56 / 58

Esercizi [... cont.] Es. 8: Scope dinamico: cosa stampa? 1 { 2 int x = 1; 3 int y = 1; 4 5 void fie(reference int z){ 6 z = x + y + z; 7 } 8 9 { 10 int y = 3; 11 { int x = 3 } 12 fie(y); 13 write(y); 14 } 15 write(y); 16 } Nomi e Ambiente 20 apr, 2016 57 / 58

Riferimenti Gabbrielli & Martini: Linguaggi di Programmazione, McGraw-Hill 2a edizione Nomi e Ambiente 20 apr, 2016 58 / 58