nome: sequenza di caratteri usata per denotare un oggetto

Slides:



Advertisements
Presentazioni simili
Sottoprogrammi: funzioni e procedure
Advertisements

Puntatori in C e C++.
Type Checking (1° parte)
Algoritmi e Programmazione
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Anno accademico Le classi di memorizzazione.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione III Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Laboratorio di Linguaggi lezione VII: puntatori 3/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione IV Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Eliana minicozzi linguaggi L1 Lezione3.
eliana minicozzi linguaggi1a.a lezione2
Corso di Informatica Applicata Lezione 6
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)
Approfondimento delle classi
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
Puntatori - Cenni Nicola Fanizzi Corso di Programmazione C.d.L. in Informatica DIB - Università degli Studi di Bari.
memoria gestita staticamente:
Dichiarazioni e tipi predefiniti nel linguaggio C
Il Linguaggio C.
Le funzioni.
Espressioni condizionali
Le funzioni a tempo di esecuzione
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
Fondamenti di informatica Linguaggio C Main Program: Architettura di un PC Diagrammi di flusso Linguaggio C.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Gestione degli errori, delegates,eventi 1. Eccezione – Situazione anomala che potrebbe avvenire durante lesecuzione del programma – try{…}catch(…){…}finally{…}
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
Complessità di un algoritmo
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
STRUTTURA DI UN PROGRAMMA C In prima battuta, la struttura di un programma C è definita dalla seguente produzione: ::= { }
Copyright © Istituto Italiano Edizioni Atlas
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Introduzione alle Classi e agli Oggetti in Java 1.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Transcript della presentazione:

nome: sequenza di caratteri usata per denotare un oggetto nomi ed oggetti denotabili int pippo; int pluto() { pippo=1; } distinguere il nome e l’oggetto denotato uno stesso oggetto può avere più nomi (aliasing) uno stesso nome può denotare oggetti diversi in momenti diversi l’uso dei nomi realizza la più semplice astrazione sui dati (l’ambiente è la parte dell’implementazione responsabile dell’associazione nome-oggetto denotato) l’uso dei nomi realizza la più semplice astrazione sul controllo nome: sequenza di caratteri usata per denotare un oggetto

oggetti denotabili: oggetti a cui posso assegnare un nome oggetti i cui nomi sono definiti dall’utente (variabili, parametri, procedure tipi definiti, costanti simboliche, …) oggetti i cui nomi sono definiti dal linguaggio di programmazione (tipi primitivi, operazioni primitive, …) il binding (legame) nome-oggetto avviene in differenti fasi: progettazione del linguaggio scrittura del programma compile-time run-time

ambiente: insieme delle associazioni nome-oggetto esistenti a run-time in uno specifico punto del programma ed in uno specifico momento dichiarazione: costrutto del linguaggio che permette di introdurre un’associazione nell’ambiente int x; int f() { return 0; } typedef T = int;

stesso nome denota oggetti diversi { int pippo; pippo = 2; { char pippo; pippo = a; } } stesso oggetto denotato da più nomi in ambienti diversi una variabile passata per riferimento è accessibile: con il suo nome nel programma chiamante con il nome del parametro formale nella procedura variabile intera variabile carattere

X e Y puntano alla stessa locazione stesso oggetto denotato da più nomi, stesso ambiente int *X, *Y; X = (int *) malloc (sizeof (int)); *X = 5; Y = X; *Y = 10; write(*X); stesso nome, nello stesso ambiente, denota oggetti diversi a seconda del flusso di esecuzione del programma procedura ricorsiva che dichiara un nome locale scope dinamico aliasing il risultato è 10, perché X e Y puntano alla stessa locazione

blocco: regione testuale di un programma, individuata da un segnale di inizio e uno di fine, che può contenere dichiarazioni locali a quella regione blocco associato a una procedura blocco in-line (o anonimo) { int pippo; pippo = 2; { char pippo; pippo = a; } } blocco in-line apri blocco A; apri blocco B; chiudi blocco A; chiudi blocco B; mai permesso i cambiamenti dell’ambiente avvengono all’entrata e all’uscita dai blocchi (anche annidati)

regola di visibilità canonica: una dichiarazione locale in un blocco è visibile: in quel blocco in tutti i blocchi annidati salvo ri-dichiarazioni dello stesso nome (mascheramento)

ambiente associato a un blocco: ambiente locale (nomi dichiarati localmente al blocco, eventualmente parametri locali) ambiente non locale (nomi dichiarati fuori dal blocco, ma comunque visibili) ambiente globale (nomi creati all’inizio del programma, usabili in tutti i blocchi)

A: { int a =1; B: { int b=2; int c=2; C: { int c=3; int d; d=a+b+c; write(d); } D: { int e; e=a+b+c; write(e); }}} associazione nell’ambiente globale ambiente locale di B + ambiente globale ambiente locale di C + ambiente non locale + ambiente globale d=6; l’ambiente locale di C maschera quello di B nell’ambiente non locale di D non compare d e=5

operazioni sull’ambiente entrando in un blocco: creazione delle associazioni fra i nomi locali al blocco e gli oggetti denotati disattivazione delle associazioni per i nomi ridefiniti uscendo dal blocco: distruzione delle associazioni fra i nomi locali al blocco e gli oggetti denotati riattivazione delle associazioni per i nomi che erano stati ridefiniti

operazioni sui nomi e sull’ambiente naming: creazione di associazione fra nome e oggetto denotato (dichiarazione locale al blocco o parametro) referencing: riferimento di un oggetto denotato mediante il suo nome (uso del nome per accedere all’oggetto denotato) disattivazione di associazione fra nome e oggetto denotato (la nuova associazione per un nome maschera la vecchia associazione, che rimane disattivata fino all’uscita dal blocco) riattivazione di associazione fra nome e oggetto denotato (una vecchia associazione che era mascherata è riattivata all’uscita da un blocco) unnaming: distruzione di associazione fra nome e oggetto denotato (all’uscita di un blocco)

operazioni su oggetti denotabili creazione: allocazione della memoria e inizializzazione accesso e modifica: tramite il nome distruzione: deallocazione della memoria

quale valore di x è stampato? regole di scope A: { int x=0; void pippo(){ x=1;} B: { int x; pippo(); } write(x); quale valore di x è stampato?

regola di visibilità canonica: una dichiarazione locale in un blocco è visibile: in quel blocco in tutti i blocchi annidati salvo ri-dichiarazioni dello stesso nome (mascheramento) MA la regola di visibilità (cioè l’annidamento) è basata: sul testo del programma (scope statico) ? sul flusso di esecuzione (scope dinamico)?

che succede al compilatore con questa regola? scope statico o scope annidato più vicino l’ambiente in qualsiasi punto e in qualsiasi momento dipende SOLO dalla struttura sintattica del programma (basic, algol, ada, pascal, java) cioè le dichiarazioni locali in un blocco includono solo quelle presenti nel blocco, e non quelle dei blocchi annidati; se si usa un nome in un blocco, l’associazione valida è quella locale al blocco; se non esiste, si prende la prima associazione valida a partire dal blocco immediatamente esterno, dal più vicino al più lontano; se non esiste, si considera l’ambiente predefinito del linguaggio; se non esiste, errore; se il blocco ha un nome, allora il nome fa parte dell’ambiente locale del blocco immediatamente esterno (caso procedure). che succede al compilatore con questa regola?

esempio con scope statico { int x=0; void pippo(int n) {x=n+1;} write(x); {int x=0; } stampa 4 stampa 0 stampa 4

lo scope statico permette di determinare tutti gli ambienti di un programma leggendone il testo migliore comprensione del programma controlli di correttezza a compile-time ottimizzazione del codice a compile-time problema del tipaggio statico e della sicurezza dei tipi gestione a run-time complicata (gli ambienti non locali evolvono diversamente dal flusso di attivazione e disattivazione dei blocchi)

void pippo() {write(x);} void pluto() {const x=1; pippo();} pluto(); } con lo scope statico la sequenza di blocchi da considerare per risolvere i riferimenti a nomi non locali è diversa da quella dei blocchi aperti e chiusi durante l’esecuzione (gestibile LIFO) seguendo il flusso del programma, con scope statico, è stampato 0, mentre ci aspettavamo 1, essendo pluto l’ultimo blocco attivo

scope dinamico l’associazione valida per un nome X, in un punto P di un programma, è la più recente associazione creata (in senso temporale) per X che sia ancora attiva quando il flusso di esecuzione arriva a P scope statico e scope dinamico sono uguali per la determinazione dell’ambiente locale e di quello globale gestione a run-time semplice ma poco efficiente(LIFO sulle attivazioni dei blocchi) flessibilità nei programmi difficile comprensione delle chiamate delle procedure

void pippo() {write(x);} void pluto() {const x=1; {const x=2; } stampa 1 con scope dinamico, perché considera la più recente associazione ancora attiva

problemi di scope statico dove introdurre le dichiarazioni qual è la visibilità delle variabili definizioni ricorsive begin const pippo = valore; const valore = 0; end valore usato prima della definizione begin const valore = 1; procedure pluto const pippo = valore; const valore = 0; end valore maschera la definizione esterna nella procedura

in ADA si usano dichiarazioni incomplete type lista = ^elemento; type elemento = record informazione: intero; successivo: lista end type elemento; type lista = access elemento; type elemento is record errore: elemento è usato prima di essere definito; in Pascal si può fare, ma solo con i puntatori in ADA si usano dichiarazioni incomplete

procedure pippo (A: integer); forward; procedure pluto (B: integer) begin pippo(3); end procedure pippo; pluto(4) in Pascal si usano definizioni incomplete per le funzioni mutuamente ricorsive; in C si può fare liberamente