Specifica di un Linguaggio di Programmazione - Gianfranco ...

Pagina creata da Viola Melis
 
CONTINUA A LEGGERE
Specifica di un Linguaggio di Programmazione

                                         concisa
 Successo di un LP  descrizione
                                         comprensibile

 Pb livello di formalizzazione (notazione rigorosa per evitare ambiguità):
    Formale  incomprensibile  pb di accettazione del LP (barriera, Es: ALGOL)
    Informale  comprensibile  proliferazione di dialetti (ambiguità)

 Pb diversificazione dei destinatari (“audience”)  specifica polimorfa:
    Revisori (potenziali utenti)  successo = f (chiarezza, eleganza, ...)
    Implementatori del LP  chiaro significato dei costrutti (tutti!)
    Utenti del LP  necessità del Reference Manual

Linguaggi di Programmazione          2. Specifica                                  1
Specifica di un Linguaggio di Programmazione (ii)

                                                 lessico
 Definizione di un L (anche naturale) comprende sintassi                              delle sue frasi
                                                 semantica

                              lessico                                          semantica

                                                                    Italia     1 Febbraio 2020
          Data: DD/DD/DDDD                      01/02/2020
                                                                    USA        2 Gennaio 2020

                                          sintassi
                                    if ( expr ) statement
          Selezione in C
                                    “Se valore di expr  0 allora esegui statement”
                                                            semantica

 Sintassi: non garantisce una frase semanticamente corretta  però: semplicità ...

Linguaggi di Programmazione                          2. Specifica                                        2
Specifica di un Linguaggio di Programmazione (iii)

                                         Complessità           Standardizzazione        Formalismo

                              Lessico      piccola                    si           Espressioni regolari
                              Sintassi     media                      si           G non contestuali
                                                                                   Sem. Operazionale
                          Semantica        grossa                     no                Assiomatica
                                                                                        Denotazionale

 Sebbene separate nella descrizione, intimamente collegate:

          Sintassi: deve “suggerire” la semantica (if, while, + ...)
          Semantica: guidata dalla sintassi

Linguaggi di Programmazione                          2. Specifica                                         3
Lessico

                                  stringa lessicale = sequenza significativa di caratteri (parola)
 Terminologia                    simbolo = astrazione di una classe di stringhe lessicali (istanze)
                                  pattern = regola per descrivere le istanze di un simbolo

               Simbolo                      Istanze                                        Pattern
                  while                   while                             while
                  begin                   begin                             begin                                   enumerazine
                  relop       <    >= !=       =     ==              { =, !=, =, == }
                     id       partenza       tempo    m24    X2             lettera seguita da lettere e/o cifre
                                                                            parte intera seguita opzionalmente da
                   num            3    25   3.5   4.37E12
                                                                            parte decimale e/o parte esponenziale
                strconst              "Hello world!"                        sequenza di caratteri racchiusa tra "

Linguaggi di Programmazione                                  2. Specifica                                                         4
Specifica dei Simboli
                                                      { 0, 1 } = alfabeto binario
 Alfabeto  insieme finito di caratteri              { a, b, c, d }
                                                      ASCII = alfabeto per computer
                                                      Unicode

 Stringa su un alfabeto  sequenza finita di caratteri dell’alfabeto
        | x |  lunghezza della stringa x
          stringa nulla  |  | = 0

                                             xy   x = alfa, y =beta  xy = alfabeta
        Operatore di concatenazione:
                                              = elemento identità nella concatenazione: x = x = x

                 pensato come prodotto
                                                                       x0 = 
                                                                       x1 = x
          possibilità di definire l’operatore potenza su stringhe      x2 = xx
                                                                       ...

Linguaggi di Programmazione                         2. Specifica                                       5
Specifica dei Simboli (ii)
                                                                      ∅ (valenza formale)
 Linguaggio  insieme di stringhe su un certo alfabeto               {}
                                                                      { frasi sintatticamente corrette del Pascal }
                                                                      { bytes }

                                 Operazione         Forma                              Definizione
                                   Unione           LM                      {x|xL ∨ xM}
                              Concatenazione         LM                     { xy | x  L ∧ y  M }

                                                                     {}     se n = 0
                                  Potenza            Ln
                                                                     Ln-1 L se n  1           L L L ... L (n volte)

                          Chiusura di Kleene         L*                    U
                                                                           i=0
                                                                               L   i
                                                                                              L0  L1  L2  ...

                              Chiusura Positiva      L   +
                                                                           U
                                                                           i=1
                                                                               L   i
                                                                                               L1  L2  L3  ...

Linguaggi di Programmazione                           2. Specifica                                                     6
Specifica dei Simboli (iii)

                                          L = { A, B, ..., Z, a, b, ..., z }                     linguaggio
 Esempio di linguaggio:                                                       isomorfismo tra
                                          M = { 0, 1, ..., 9 }                                   alfabeto

              1. L  M = { lettere e cifre }
              2. L M = { stringhe composte da una lettera seguita da una cifra }
              3. L3 = { stringhe di 3 lettere }
              4. L* = { stringhe di lettere, inclusa  }

      id      5. L ( L  M )* = { stringhe alfanumeriche che iniziano con una lettera }
         +
 num 6. M = { stringhe di almeno una cifra } = { costanti intere senza segno }

Linguaggi di Programmazione                                2. Specifica                                       7
Espressioni Regolari

 Potente formalismo per specificare un pattern (id, num, ...)
        identificatore = lettera (lettera | cifra)*

                               espressioni regolari               mediante operatori applicati a sottoespressioni ...
 Similitudine                                                    fino alle espressioni atomiche
                               espressioni aritmetiche
                                  (34+25) * (12+3)
                                                                             caratteri         numeri
                                                                             alfabeto

                              espressioni aritmetiche  risultato = numero
 Differenza
                              espressioni regolari  “risultato” = { stringhe } = linguaggio

Linguaggi di Programmazione                               2. Specifica                                                  8
Definizione di Espressione Regolare
 Def di espressione regolare (su un alfabeto )  mediante regole induttive:
      1.  è una espressione regolare che denota il linguaggio {  }
      2. Se a  , allora a è una espressione regolare che denota il linguaggio { a }
      3. Se x, y sono expr regolari che denotano rispettivamente L(x), L(y), allora:
             (x) è una expr regolare che denota L(x)               possibilità di includere parentesi (non intrusive)

             (x) | (y) è una expr regolare che denota L(x)  L(y)
             (x) (y) è una expr regolare che denota L(x) L(y)
             (x) è una expr regolare che denota (L(x))*

                                                      carattere dell’alfabeto 
 Regola 2  diversi significati di a                 espressione regolare
                                                      stringa
                                                                                                Associazione         Operatore
                                                                              precedenza
 Eliminazione delle parentesi mediante regole di                                                   sinistra             |
                                                                              associatività         sinistra      Concatenazione
                                                                                                    sinistra            *

●   Insieme regolare  linguaggio determinato da una espressione regolare

Linguaggi di Programmazione                          2. Specifica                                                                  9
Esempi di Espressioni Regolari
1.  = { a, b, c }. Determinare l’expreg corrispondente alle stringhe che contengono esattamente un b:
                                                                                                   (a | c)* b (a | c)*

2.  = { a, b, c }. Determinare l’expreg corrispondente alle stringhe che contengono al più un b:
                                                                                                  (a | c)* (b | ) (a | c)*

          Oss: expreg equivalente: (a | c)* | (a | c)* b (a | c)*              diverse expreg per lo stesso L!
                    Formalmente: L(x) = L(y)  x  y

3. Limite della potenzialità espressiva (insiemi non regolari):

    = { a, b }. L = { an b an | n  0 } = { aba, aabaa, aaabaaa, ... } = astrazione di costrutti bilanciati

                              non specificabile con una espressione regolare  non può contare!

                                                                          non sufficientemente vincolante:
                                                            a* b a *      complete ma non sound

Linguaggi di Programmazione                                2. Specifica                                                       10
Proprietà Algebriche
 Proprietà algebriche delle espressioni regolari (analogamente alle espressioni aritmetiche)

                                 Proprietà                                  Descrizione
                                x|y = y|x              | è commutativo
                         x | (y | z) = (x | y) | z     | è associativo
                              (x y) z = x (y z)        Concatenazione è associativa
                              x (y | z) = xy | xz
                                                       Proprietà distributiva della concatenazione rispetto a |
                              (x | y) z = xz | yz
                               x = x = x              = elemento identità per concatenazione

                                x* = (x | )*          Relazione tra ripetizione ed 

                                  x** = x*             Ripetizione è idempotente

Linguaggi di Programmazione                                  2. Specifica                                         11
Espressioni Regolari Estese
 Non cambia il potere espressivo (però: concisione, scrivibilità)
1. Una o più ripetizioni: x+  xx*                                (L(x))+
       Esempio: Numeri naturali in forma binaria        (0|1)+  (0|1)(0|1)*

2. Qualsiasi carattere in :              

       Esempio: Tutte le stringhe che contengono almeno un b                 .*b.*

3. Un range di caratteri: [ ... ]             [abc]  a | b | c        [a-z]  a | b | ... | z
         [0-9]  0 | 1 | ... | 9   [a-zA-Z]  {lettere minuscole e maiuscole}         [A-Za-z]  [A-z] (anche in ASCII)

4. Qualsiasi carattere al di fuori di un certo insieme: ~
                                                  ~a    {a}          ~(a | b | c)    {a, b, c}

5. Sottoespressioni opzionali: ?                  ( | ) ? [0-9]+  naturale con possibile segno

                (x)?  (x | )

Linguaggi di Programmazione                         2. Specifica                                                     12
Definizioni Regolari
 Associazioni di nomi a espressioni regolari (semantica MACRO)  modularizzazione
          nome1  x1
                                 Nomi distinti
          nome2  x2
                                 xi = expreg sui simboli in   { nome1, nome2, ..., nomei-1 }
          ...
                                 Non ricorsive! (altrimenti  aumento potere espressivo)
          nomen  xn

Esempi:                           lettera  [A-Za-z]
1. Identificatori Pascal:         cifra  [0-9]                          [A-Za-z] ([A-Za-z] | [0-9])*
                                  id  lettera (lettera | cifra)*

                                                                                      intera
2. Numeri con esponente               7.25E-2 = 7.25 * 10-2 = 0.0725      : 3 parti   decimale
                                                                                      esponenziale

           nat  [0-9]
           snat  (|) ? nat
           num  snat (“.”nat) ? (E snat) ?

Linguaggi di Programmazione                            2. Specifica                                      13
Espressioni Regolari per Token nei LP
 Classificazione elementi lessicali:
        Keywords = { if, then, while, do, begin, end, procedure, function, case, repeat ... }
        Simboli speciali = { +, -, *, /, =, >, >=, !=, ++, --, &&, ||, ... }
        Identificatori = { stringhe alfanumeriche che iniziano con una lettera }
        Costanti = { 25, .34, 2.7E-3, "alfa", 'a', ... }
        Pseudosimboli (spaziatura, commenti)

 Keywords:                                                                       Simboli speciali:

      if  if                                                                      plus  “+”
      then  then                                                                  minus  “”
      ...                                                                          ...
      while  while                                                                equal  ==
      keyword  if | then | ... | while                                            assign  =
                                                                                   plusplus  “++”
                                                                                   minusminus  “--"

 Costanti:
                                charconst  ‘.’
                                strconst  \”(~\”)*\”                  caso semplice, senza metacaratteri
                                ...

Linguaggi di Programmazione                             2. Specifica                                        14
Espressioni Regolari per Token nei LP (ii)
                                              Pascal:      { commento }          { (~})* }
 Commenti:  diversi stili                   C:           /* commento */
                                              Ada:         -- commento            --(~\n)*
                              /*     */
    Stile C:                  ba ... ab (astrazione)    ba(b*(a*(a|b)b*)*a*)ab

                                                                     ((ab))*    no!

 Ambiguità: quando la stessa stringa di caratteri è compatibile con più espressioni regolari

                                      while id
                                            while
                        Esempi:
                                          noteq
                                            less greater

                                                            keywords = reserved words
               LP  regole di disambiguamento
                                                            principio della sottotringa più lunga (maximal munch)

            in generale: insufficienti          E1                          E2

Linguaggi di Programmazione                                  2. Specifica                                           15
Espressioni Regolari per Token nei LP (iii)

 Delimitatori: caratteri sui quali una stringa cessa di rappresentare un simbolo (“confini” dei token)

                          caratteri speciali   alfa=beta
    Esempi
                         spaziatura      while a > b do

      Def di pseudosimbolo: whitespace  (blank | tab | newline | comment)

                               quando riconosciuto, viene ignorato  Linguaggi liberi dal formato

Linguaggi di Programmazione                                2. Specifica                                   16
Sintassi

 L = { stringhe di caratteri su un certo alfabeto }  { frasi }

 Regole sintattiche: specificano la struttura delle frasi di L

                                                    numerose
                              naturale  regole
    Oss: L                                          complesse
                              artificiale  poche (semplici) regole

 Convenzione: sintassi  descrizione del lessico (unità sintattiche di più basso livello)

                                       sintassi
                                                                      semantica
                                       lessico

Linguaggi di Programmazione                            2. Specifica                          17
Sintassi (ii)
 Def formale di un L per                riconoscimento
                                                                non pratica!
                                         generazione

    1. Riconoscitori del linguaggio

    Hp: L su alfabeto   R  strumento di riconoscimento:

             frase (sequenza di token)                 verdetto     
                                           R                           L

    Pb: L infinito  R             non adatto per enumerare le frasi di L
                                   usato per verificare la correttezza sintattica di un programma

Linguaggi di Programmazione                      2. Specifica                                       18
Sintassi (iii)

                                                                        push
    2. Generatori del linguaggio

 G  strumento per generare le frasi di L:                               frase (imprevedibile!)
                                                                   G

 Doppio pb                   R: strumento poco utile per definire L poichè usato “per tentativi”
                              G: aleatorietà della frase generata

 Stretta connessione tra                  generazione    = scoperta della computer science
                                           riconoscimento

                              Meccanismo di R basato su quello di G

Linguaggi di Programmazione                         2. Specifica                                    19
Metodi formali per la definizione della sintassi

 1950s:                      John Backus
                              Noam Chomsky   inventano la stessa notazione in contesti diversi

    Chomsky (linguista): specifica 4 classi di strumenti generativi (grammatiche)
                          definiscono 4 classi di linguaggi

                                0
                                1                            0       G ricorsivamente enumerabili
                                2                            1       G sensibili al contesto
                                             Classe
                                                             2       G non-contestuali  sintassi
                                3                            3       G regolari          lessico

Linguaggi di Programmazione                        2. Specifica                                      20
Metodi formali per la definizione della sintassi (ii)

    Backus (1959): presenta ALGOL 58  sintassi specificata in BNF

 BNF (Backus-Naur Form) : quasi identica allo strumento 2 di Chomsky

 Paradosso: BNF              non accettata prontamente dagli utenti dei LP
                              poi, standard per la descrizione della sintassi dei LP

 BNF = linguaggio per descrivere un LP  metalinguaggio

Linguaggi di Programmazione                  2. Specifica                              21
BNF
 Idea di fondo della notazione BNF: astrazioni per definire le strutture sintattiche

         Assegnamento in C:               assign  var = expr

                                           LHS             RHS = { token, stringhe lessicali, astrazioni }

         Parafrasi della regola (produzione):

          “Un’istanza dell’astrazione assign è definita come un’istanza dell’astrazione
           var, seguita dalla stringa lessicale ‘=’, seguita da un’istanza dell’astrazione expr”.

                              netto = lordo - tara

 Necessario definire tutte le astrazioni (tipicamente: ricorsivamente)

Linguaggi di Programmazione                 2. Specifica                                                 22
BNF (ii)

 Nomenclatura: nella produzione      astrazione  (simbolo) nonterminale
                                      token / stringa lessicale  (simbolo) terminale

 Def: Grammatica  { produzioni }

                                           terminali
 Formalmente: G = (T, N, P, A)            nonterminali
                                           produzioni
                                           assioma (astrazione di più alto livello)

 Astrazione: può essere definita in  modi  alternative in un’unica regola (leggibilità)

Linguaggi di Programmazione           2. Specifica                                       23
BNF (iii)

      1. Selezione in Pascal:         if-stat  if bool-expr then stat
                                      if-stat  if bool-expr then stat else stat

                                        if-stat  if bool-expr then stat |
                                                  if bool-expr then stat else stat

      2. Specifica sintetica di liste (finite ma illimitate)

     In matematica: 1, 2, 

     In BNF  ‘’            ricorsione:         id-list  id | id , id-list   (piede ricorsione, passo ricorsivo)

                              semplice
     BNF = strumento
                              potente

Linguaggi di Programmazione                  2. Specifica                                                             24
BNF (iv)
 BNF = strumento generativo per definire LP

 Derivazione  “Frase generata mediante una serie di applicazioni delle regole
                (riscrittura), partendo dall’assioma”

                                                                 forma sentenziale
                                                     assign  id := expr
       assign  id := expr                                   A := expr
       id  A | B | C                                        A := id * expr
                                                             A := B * expr
       expr  id + expr |      A := B*(A+C)
               id * expr |                                   A := B * (expr)
              (expr)     |                                   A := B * (id + expr)
                id                                           A := B * (A + expr)
                                                             A := B * (A + id)
                                                             A := B * (A + C)

Linguaggi di Programmazione         2. Specifica                                     25
BNF (v)
 Rappresentazione della struttura gerarchica delle frasi mediante alberi sintattici

                                                      assign

                                  id                       :=   expr

                                  A                   id             *   expr

                                                      B         (        expr    )
                A := B*(A+C)
                                                                id        +     expr

                                                                A                id

 Frase sulle foglie (da sinistra a destra)                                      C

Linguaggi di Programmazione            2. Specifica                                    26
BNF: Linguaggio per tabelle
                R                                                                                        S
                              def R (A: integer, B: string, C: boolean)                             D      E
   A  B     C
                              def S (D: integer, E: string)
   3 alfa true                                                                                     125   sole
                              R := {(3, "alfa", true)(5, "beta", false)}
   5 beta false                                                                                    236   luna
                              S := {(125, "sole")(236, "luna")}

                              program  stat-list
                              stat-list  stat-list stat | stat
                              stat  def-stat | assign-stat
                              def-stat  def id ( def-list )
                              def-list  def-list, domain-decl | domain-decl
                              domain-decl  id: domain
                              domain  integer | string | boolean
                              assign-stat  id :=  tuple-list 
                              tuple-list  tuple-list tuple-const | 
                              tuple-const  ( simple-const-list )
                              simple-const-list  simple-const-list, simple-const | simple-const
                              simple-const  intconst | strconst | boolconst

Linguaggi di Programmazione                            2. Specifica                                             27
BNF: Linguaggio per tabelle (ii)
program  stat-list
stat-list  stat-list stat | stat
stat  def-stat | assign-stat
def-stat  def id ( def-list )
def-list  def-list, domain-decl | domain-decl
domain-decl  id: domain                                                                                       program
domain  integer | string | boolean
assign-stat  id :=  tuple-list                                                                               stat-list
tuple-list  tuple-list tuple-const | 
tuple-const  ( simple-const-list )                                                                                                           stat
simple-const-list  simple-const-list, simple-const | simple-const
                                                                                              stat-list
simple-const  intconst | strconst | boolconst
                                                                       stat-list                                            stat           assign-stat
                                                     stat-list                                stat                       assign-stat
                                                        stat                              def-stat
                                                    def-stat                                                               )
                                                                     def                 id       (       def-list
                                                                                         S
                                                                                              def-list               ,             domain-decl
     def R (A: integer, B: string, C: boolean)
     def S (D: integer, E: string)                                                       domain-decl                        id         :             domain
     R := {(3, "alfa", true)(5, "beta", false)}
     S := {(125, "sole")(236, "luna")}                                                                                         E
                                                                                    id        :             domain                                   string
                                                                                    D
                                                                                                            integer
  Linguaggi di Programmazione                                        2. Specifica                                                                             28
EBNF
 Stesso potere espressivo  aumento di          scrivibilità
                                                 leggibilità
 Estensioni ® nuovi metacaratteri: [ ] { } ( ) +

1. Opzionalità
                                  if-stat  if ( expr ) stat [ else stat ]

2. Ripetizione
                                                id-list  id {, id }

3. Disgiunzione

                              for-stat  for var := expr (to | downto) expr do stat

Linguaggi di Programmazione                   2. Specifica                            29
EBNF (ii)

                              expr  expr + term | expr - term | term
 BNF:
                              term  term * factor | term / factor | factor

                               expr  term {( + | - ) term}
 EBNF:
                               term  factor {( * | / ) factor}

Ripetizione non vuota:
                                            comp-stat  begin stat { stat } end

                                               comp-stat  begin { stat }+ end

Linguaggi di Programmazione                       2. Specifica                    30
EBNF: Linguaggio per tabelle
                 R                                                                            S
                              def R (A: integer, B: string, C: boolean)                  D          E
    A  B     C
                              def S (D: integer, E: string)
    3 alfa true                                                                         125       sole
                              R := {(3, "alfa", true)(5, "beta", false)}
    5 beta false                                                                        236       luna
                              S := {(125, "sole")(236, "luna")}

                                 program  {stat }+
                                 stat  def-stat | assign-stat
                                 def-stat  def id “(“ def-list “)”
                                 def-list  domain-decl {, domain-decl }
                                 domain-decl  id: domain
                                 domain  integer | string | boolean
                                 assign-stat  id := “{” {tuple-const} “}”
                                 tuple-const  “(“ simple-const {, simple-const } “)”
                                 simple-const  intconst | strconst | boolconst

Linguaggi di Programmazione                        2. Specifica                                          31
EBNF: Linguaggio per tabelle (ii)
                                                                                    program

                                stat                                 stat                                stat             stat

                              def-stat                             def-stat                         assign-stat        assign-stat

                                                def           id         (           def-list   )
                                                              S

                                                      domain-decl                          ,             domain-decl

                                            id          :               domain                      id          :   domain
                                            D                                                       E
                                                                      integer                                          string
       program  {stat }+
       stat  def-stat | assign-stat
       def-stat  def id “(“ def-list “)”                                def R (A: integer, B: string, C: boolean)
       def-list  domain-decl {, domain-decl }                           def S (D: integer, E: string)
       domain-decl  id: domain                                          R := {(3, "alfa", true)(5, "beta", false)}
       domain  integer | string | boolean                               S := {(125, "sole")(236, "luna")}
       assign-stat  id := “{” {tuple-const} “}”
       tuple-const  “(“ simple-const {, simple-const } “)”
       simple-const  intconst | strconst | boolconst

Linguaggi di Programmazione                                          2. Specifica                                                    32
Diagrammi sintattici

    un diagramma  unità sintattica (nonterminale)

 Diversa rappresentazione grafica per                                     nonterminali
                                                                           terminali

 Selezione Ada: if-stat  if cond then stats { else-if } [ else stats ] end if ;
                 else-if  elsif cond then stats

if-stat:                 if           cond     then     stats                                        end if   ;

                                                                           else-if    else   stats

else-if:                      elsif     cond     then       stats

Linguaggi di Programmazione                                 2. Specifica                                      33
Semantica dinamica

 Per descrivere il significato dei programmi

                              specifica non ambigua del LP (evitamento proliferazione dialetti)
 Vantaggi                    possibilità di generazione automatica del compilatore
                              supporto alla prova formale di correttezza dei programmi

                                             operazionale
 Formalismi: semantica                      assiomatica
                                             denotazionale

Linguaggi di Programmazione                            2. Specifica                               34
Semantica operazionale
                                              (PL/I, 1972)

 Significato di un costrutto descritto dall’esecuzione su macchina reale (< livello)
                                                                    virtuale (interprete)

 Se virtuale  necessità di costruire 2 componenti                 traduttore L  L’
                                                                    macchina virtuale di L’

 Macchina virtuale (interprete) di L’:
                                                         dati
                              programma                         risultati
                                                Interprete

     Semantica di una istruzione = cambiamento di stato della macchina virtuale

Linguaggi di Programmazione               2. Specifica                                        35
Semantica operazionale (ii)

                              Istruzione C                            Semantica operazionale
                     for(expr1; expr2; expr3)                  expr1;
                      statements
                                                               loop: if expr2 = 0 goto out
                                                                        statements
                                                                        expr3;
                                                                        goto loop
                                                               out:

Oss: Semantica operazionale espressa algoritmicamente, non matematicamente

Linguaggi di Programmazione                     2. Specifica                                   36
Semantica denotazionale

 Semantica denotazionale = formalismo rigoroso più usato per descrivere il
  significato dei programmi (basato sulla teoria delle funzioni ricorsive)

 Idea:  astrazione del LP: def dominio matematico
                                 f : istanze della astrazione  elementi del dominio

                                  f
                                                     applicate sull'albero sintattico!

 Oggetti matematici denotano il significato delle corrispondenti entità linguistiche

Linguaggi di Programmazione           2. Specifica                                       37
Semantica denotazionale (ii)

Es: Numeri binari:                     bnum  0 | 1 | bnum 0 | bnum 1

                                                 6 bnum                 110 ® possibili diverse semantiche:
                                                                          • numero binario

                                       3 bnum                             • and / or logico
                                                                 0
                                                                          • vettore di booleani

                              1 bnum                                      • ...
                                                        1

                                 1

    N = { naturali }  dominio degli oggetti matematici associati

                                               Mb(‘0’) = 0
    Mb  funzione di mapping                  Mb(‘1’) = 1
                                               Mb(bnum ‘0’) = 2 * Mb(bnum)
                                               Mb(bnum ‘1’) = 2 * Mb(bnum) + 1

Linguaggi di Programmazione                       2. Specifica                                                38
Semantica denotazionale (iii)

Es: Numeri decimali:               dnum  0 | 1 | ... | 9 | dnum 0 | dnum 1 | ... | dnum 9

                                Md(‘0’) = 0, Md(‘1’) = 1, ..., Md(‘9’) = 9
                                Md(dnum ‘0’) = 10 * Md(dnum)
                                Md(dnum ‘1’) = 10 * Md(dnum) + 1
                                                  ...

                                Md(dnum ‘9’) = 10 * Md(dnum) + 9

Linguaggi di Programmazione                  2. Specifica                                    39
Semantica denotazionale (iv)

   Stato di un programma  {(i1, v1), (i2, v2), ..., (in, vn)}                                ik = nome di una variabile
                                                                                               vk = valore corrente di ik
                              stato del programma                                                     (eventualmente undef)
   (ik, s)  funzione che computa vk
                                                                            Me(dnum, s) = Md(dnum).
Es: Espressione (senza effetti collaterali):                                Me(var , s) = if (var, s) = undef then
                                                                                            errore
                                                                                          else (var, s).
             expr  dnum | var | bexpr
                                                                            Me(bexpr, s) = Mbe(bexpr, s).
             bexpr  expr1 op expr2
             op  + | *                                                     Mbe(bexpr, s) = if Me(expr1, s) = errore or
                                                                                               Me(expr2, s) = errore then
                                                                                                 errore
                                                    Interi
                                                                                            elsif Mo(op) = '+' then
                                                                                                 Me(expr1, s) + Me(expr2, s)
    Dominio associato = Z  { errore }                                                      else
                                                                                                  Me(expr1, s) * Me(expr2, s).
                                                                            Mo(+) = ('+').
                                                                            Mo(*) = (‘*’).

Linguaggi di Programmazione                                  2. Specifica                                                        40
Semantica denotazionale (v)

           expr  dnum | var | bexpr         s = {(x,3),(y,4)}
           bexpr  expr1 op expr2
           op  + | *
                                                x + 12 * y
                                                                                expr 51
             Me(dnum, s) = Md(dnum).
                                                                               bexpr 51
             Me(var , s) = if (var, s) = undef then
                             errore
                           else (var, s).                          3 expr       op '+'   expr 48
             Me(bexpr, s) = Mbe(bexpr, s).
                                                                      var        +        bexpr 48
            Mbe(bexpr, s) = if Me(expr1, s) = errore or
                                                                      (x)
                               Me(expr2, s) = errore then
                                 errore                                      12 expr       op '*'    expr 4
                            elsif Mo(op) = '+' then
                                 Me(expr1, s) + Me(expr2, s)                   dnum        *         var
                            else                                                ( 12 )               (y)
                                  Me(expr1, s) * Me(expr2, s).
            Mo(+) = ('+').
            Mo(*) = (‘*’).

Linguaggi di Programmazione                          2. Specifica                                             41
Semantica denotazionale (vi)

                                            valutazione di E
Es: Assegnamento: x := E
                                            setting di x con il valore di E

         Ma(x := E, s) =
            if Me(E, s) = errore then
                errore                                                        confronto fra nomi!
            else                                                                    (ik, s)      if ik  x
                 s’ = {(i1, v1’), (i2, v2’), ..., (in, vn’)},  k  [1 .. n] vk’ =
                                                                                    Me(E, s) otherwise

Linguaggi di Programmazione                         2. Specifica                                              42
Semantica denotazionale (vii)

Es: Ciclo a condizione iniziale: while B do L

 Assumiamo                    Mlist : [ istruzioni ]  stato
                               Mbool : expr booleana  { true, false, errore }

                              Mw(while B do L, s) =
                                if Mbool(B, s) = errore then
                                    errore
      (piede della ricorsione) else if Mbool(B, s) = false then s
                                else if Mlist(L, s) = errore then errore
                   (ricorsione) else Mw(while B do L, Mlist(L, s))

                                                      stato dopo l’esecuzione di L
Oss:
          Conversione iterazione  ricorsione
          Se  terminazione: computazione di nulla!

Linguaggi di Programmazione                       2. Specifica                       43
Semantica denotazionale (viii)

          Mw(while B do L, s) =
                          if Mbool(B, s) = errore then
                                                                              while i
Puoi anche leggere