Esercitazione guidata 1

Slides:



Advertisements
Presentazioni simili
Esercitazione guidata 1
Advertisements

Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
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.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
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
Selezione (=scelta) con “if-else”
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
- 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]
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
IL SOFTWARE (FPwin 6.0).
© 2007 SEI-Società Editrice Internazionale, Apogeo
rielaborato da Atzeni-etal., Basi di dati, Capitolo 4
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Introduzione al linguaggio C
Il linguaggio C Strutture Moreno Marzolla
7. Strutture di controllo Ing. Simona Colucci
Algoritmi e soluzioni di problemi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
10. Programmazione Ricorsiva Ing. Simona Colucci
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Equazioni differenziali
Le postcondizioni specificano l’output della funzione.
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Questa è la funzione esponenziale
Imperativo Italiano.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
© 2007 SEI-Società Editrice Internazionale, Apogeo
Strutture di Controllo
Secondo Programma in C.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Semantica denotazionale algebrica di LW
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
Ricorsione 16/01/2019 package.
I SOTTOPROGRAMMI.
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Strapazziamo le immagini…
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Astrazione e Concretizzazione
Interpretazione Astratta
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Le stringhe in C++ Laboratorio 26 Aprile Dott. Serena Villata
Processi decisionali e funzioni di controllo
Programmazione e Laboratorio di Programmazione
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Selezione e Proiezione
Analisi composizionale e contestuale
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Array e Stringhe Linguaggio C.
Ricerca 01/08/2019 package.
Ese 1 (del 31 Marzo 2004).
Semantica operazionale:
Programmazione e Laboratorio di Programmazione
Script su vettori Realizza uno script che chiede in input una dimensione d e crea un vettore di d numeri interi casuali. Poi calcola la somma dei due numeri.
Programmazione Procedurale
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