Esercitazione guidata 1

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Procedure e funzioni A. Ferrari.
Sintassi (prima parte)
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
Type Checking (1° parte)
SOS a piccoli passi Invece di semplificare sempre in configurazioni finali, fattorizziamo in passi più piccoli (da cui il nome). In questo modo la non.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di un’espressione La maggior.
Linguaggi a memoria condivisa Lidea è di aggiungere ad un linguaggio imperativo dei costrutti per rappresentare lesecuzione parallela di statements. Supponiamo.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
Algoritmi e Programmazione
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Metodologie di Programmazione = decomposizione basata su astrazioni
Introduzione al linguaggio C
Lez. 41 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Anno accademico Le classi di memorizzazione.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
PROGRAMMI DI RICERCA E ORDINAMENTO
JAVASCRIPT DIFFERENZA TRA JAVASCRIPT E JAVA TAG LO SCRIPT OGGETTI LE CLASSI FUNZIONE GESTORE DI EVENTI ELEMENTI DEL LINGUAGGI è un vero e proprio linguaggio.
Corso di Informatica (Programmazione)
Introduzione alla programmazione lll
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)
Semantica Operazionale Strutturata
Approfondimento delle classi
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Le funzioni.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
LINGUAGGI DI PROGRAMMAZIONE
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Lo sviluppo top down Le funzioni
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.
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
Complessità di un algoritmo
CORSO DI PROGRAMMAZIONE II Lezione 22
- prof. V. Riboldi - SOTTOPROGRAMMI IN TPASCAL METODO TOP DOWN.
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
R 255 G 211 B 8 R 255 G 175 B 0 R 127 G 16 B 162 R 163 G 166 B 173 R 104 G 113 B 122 R 234 G 234 B 234 R 175 G 0 B 51 R 0 G 0 B 0 R 255 G 255 B 255 Supporting.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Sottoprogrammi e funzioni
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.
Classi: class Foo { public int x; public int y; public void swap (boolean z) { if (z) {int temp = x; x = y; y = temp;}; }; } Ambienti per le classi: Cenv.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Programmazione in Java
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Lo stato  I domini della semantica restano invariati: Ide, Val (Int  { ,  }) Loc (locazioni di memoria), FunctDecl. ma definiamo 2 funzioni: Loc :
Elementi di semantica denotazionale ed operazionale
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Introduzione alle Classi e agli Oggetti in Java 1.
Esercitazione guidata 1
Transcript della presentazione:

Esercitazione guidata 1 Sfruttando le tecniche viste in casi più semplici, si dia la semantica statica del linguaggio imperativo (didattico) descritto dalla seguente grammatica LW: Prog ::= Decs main() Stats. Decs ::= Dec | Dec Decs. Dec ::= VDec | FDec. VDec ::= PDec | Type Id = Exp; PDec ::= Type Id; FDec ::= RType Id(PDecs) {Stats [result Exp]} PDecs ::= PDec | PDec PDecs. Rtype ::= Type | void. Type ::= int | bool. Stats ::= Stat | Stat Stats. Stat ::= Exp; | while (Exp) {Stats} | if (Exp) {Stats} else {Stats}. Exp ::= Id | Id = Exp | Id(Exps) | Exp + Exp | … Exps ::= Exp | Exp Exps. Questo linguaggio sarà usato frequentemente per le domande sulla semantica statica (all’orale)

Vincoli statici (informali) Nel corpo del programma possono essere usati solo identificatori dichiarati precedentemente e devono essere usati in modo consistente col tipo con cui sono dichiarati. Inoltre non si ammettono doppie dichiarazioni. Nelle dichiarazioni con inizializzazione il tipo deve corrispondere al tipo dell’espressione usata per inizializzare Una funzione ha la parte result Exp se e solo se il suo tipo risultante non è void Se una funzione ha la parte result Exp, il suo tipo risultante deve essere lo stesso tipo di Exp Le espressioni che compaiono in while e if devono essere di tipo booleano Un’espressione corretta usa solo identificatori dichiarati e in modo consistente col loro tipo Un’assegnazione è corretta solo se il tipo dell’espressione è uguale a quello dell’identificatore Una chiamata di funzione è corretta se il numero e il tipo dei parametri attuali coincide con quelli dei parametri formali

Problematiche (e soluzioni) 1 Dichiarazioni e Tipi: rispetto a quanto visto finora ci sono due novità: Il tipo dell’identificatore è dichiarato esplicitamente (Type Id ) per cui non c’è bisogno di dedurlo Bisogna verificare che nelle dichiarazioni con inizializzazione (Type Id = Exp;) il tipo scelto e il tipo dell’espressione usata per inizializzare coincidano La problematica connessa ad ambiente locale e globale si ritrova nella dichiarazione di funzione: RType Id(PDecs) {Stats [result Exp]}, nel cui corpo si possono usare variabili e funzioni globali mentre i parametri costruiscono un ambiente locale (ed ovviamente i nomi dei parametri devono essere tutti distinti)

Problematiche (e soluzioni) 2 Dichiarazioni di funzione. Per verificare che la parte result Exp ci sia se e solo se il suo tipo risultante non è void, la cosa più facile è dare regole separate per i due casi. Questo, in effetti corrisponde a espandere la notazione compatta nelle corrispondenti produzioni: FDec ::= Type Id(PDecs) {Stats result Exp} | void Id(PDecs) {Stats} e dare una regola per ciascuna produzione L’insieme dei tipi associati agli identificatori andrà ampliato per trattare i tipi funzionali: Types = BTypes  (BTypes+  RTypes), dove BTypes = {int, bool} e RTypes = BTypes  {void}

Come si trovano le regole della semantica statica Euristica Prima di tutto va chiarito che quanto segue è una metodologia che supporta il lavoro di definizione della semantica statica, non un algoritmo che seguito ciecamente porta ad una buona definizione. Concentriamoci sul dare le regole per i casi corretti. Principio 1. Si parte dando una regola per ogni produzione della grammatica Principio 2. Per dare ciascuna regola si lavora top down: a) Si parte dalla conseguenza, lasciando in bianco il risultato b) Si mette una premessa per ogni sottostringa della stringa di cui si vuol dare la semantica statica, introducendo le identificazioni fra le metavariabili suggerite dai vincoli c) Se necessario si catturano eventuali altri vincoli con condizioni a lato d) Si usano le metavariabili introdotte nelle premesse per esprimere il risultato nelle conseguenze

Come si trovano le regole della semantica statica Esempio applicato ad una regola Consideriamo il caso della dichiarazione con inizializzazione Type Id = Exp; una stringa del linguaggio “generata” da questa produzione ha la forma t x = e, dove t  LType(LW), x  LId(LW), ed e  LExp(LW) b) Nelle premesse metto una clausola per ogni componente della stringa A priori dovrebbe usare un t’, ma dai vincoli informali so che deve essere uguale a t Queste due sono superflue, perché identificatori e tipi sono sempre corretti c) Non si ammettono doppie dichiarazioni rg, rl  t rg, rl  x rg[rl]  e: t x  Dom(rl) rg, rl  t x = e  rl[t/x] d) Se tutto è andato bene il risultato è l’aggiornamento a) Scrivo le conseguenze, lasciando in bianco il risultato. Siccome è una dichiarazione avrà questa forma

Esempio 2 Consideriamo il caso della applicazione di funzione Id(Exps); una stringa del linguaggio “generata” da questa produzione ha la forma x(el), dove x  LId(LW), ed el  LExps(LW) Se la correttezza di una singola espressione produce il suo tipo, quella di una sequenza di espressioni produrrà una lista di tipi Devo verificare che x sia una funzione e qual è il suo tipo r  el: tl x  Dom(r), r(x)= <tl,rt> r  x(el): rt Vediamo anche le regole per Exps. __:_  Envs  LExps(LW)  Types+ Nella grammatica abbiamo due produzioni Exps ::= Exp | Exp Exps. Quindi avremo due regole r  e: t r  e: t r  el: tl e  LExp(LW) r  e: t r  e el: t tl Caso base: la sequenza ha lunghezza 1 Passo induttivo