ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
ITIS-LS “Francesco Giordani” Caserta prof. Ennio Ranucci a.s. 2019-2020 Linguaggi ed espressioni regolari Javascript Linguaggi formali Espressione regolare un esempio di grammatica Automi ed espressioni regolari -1-
ITIS-LS “Francesco Giordani” Caserta Anno scolastico: 2019/2020 Classe 3^ sez.B spec. Informatica e telecomunicazioni Data: Numero progressivo dell’esercizio: es1 (espressioneRegolareData.html) Versione: 1.0 Programmatore/i: Sistema Operativo: Windows 10 Compilatore/Interprete: Browser - Javascript Obiettivo didattico: Espressioni regolari Obiettivo del programma: Validare la data File espressioneRegolareData.html function validate(val) { var expr = /^\d{2}\/\d{2}\/\d{4}$/; if (! expr.test(val)) { window.alert("Formato data non valida"); return false; } return true; } Date (dd/mm/yyyy): -2-
ITIS-LS “Francesco Giordani” Caserta Anno scolastico: 2019/2020 Classe 3^ sez.B spec. Informatica e telecomunicazioni Data: Numero progressivo dell’esercizio: es2 (espressioneRegolareMail.html) Versione: 1.0 Programmatore/i: Sistema Operativo: Windows 10 Compilatore/Interprete: Browser - Javascript Obiettivo didattico: Espressioni regolari Obiettivo del programma: Validare la mail File espressioneRegolareMail.html function validate(val) { var expr =/^[\w\-\.]+@[\w\-\.]+\.[a-z]+$/; if (! expr.test(val)) { window.alert("Formato mail non valida"); return false; } return true; } Mail (prova@dominioII.dominioI): -3-
Un tipo diverso di algebra: le espressioni regolari. (fonte lidimatematici) Immaginiamo di avere a disposizione un insieme di simboli a nostra scelta, ad esempio: A = {a, b, c} lo chiameremo alfabeto. L’idea è di costruire un modello formale che ci consenta di generare sequenze di questi simboli, come ad esempio “aaa” oppure “aabb” o ancora, “acac“. Le sequenze di simboli sono dette stringhe. Per fare ciò, abbiamo bisogno di definire un insieme di operazioni ammesse, in modo tale da costruire stringhe a partire dai singoli simboli dell’insieme A dell’alfabeto. Queste operazioni saranno anch’esse rappresentate da simboli. Simboli speciali, però, perché indicano azioni. I simboli delle operazioni ammesse, che chiameremo operatori, sono quindi diversi dai simboli degli elementi dell’alfabeto. E’ una distinzione importante, perché il nostro processo di costruzione non ha alcun vincolo, siamo perfettamente liberi di inventare i simboli e di attribuirli ai vari operatori o elementi dell’alfabeto. E’ una nostra scelta. La prima operazione che vogliamo è sicuramente di poter scrivere serie di simboli, la chiameremo concatenazione, e la indichiamo con un punto ‘.’: a.a = aa decidiamo anche che, per comodità, questo operatore può essere omesso, in modo da rendere più leggibile l’operazione. La seconda operazione che vogliamo è la possibilità di scegliere alternativamente un simbolo oppure l’altro, chiameremo questo operatore unione, e lo indicheremo con il +. Quindi, ad esempio, usando concatenazione ed unione otteniamo: a(a+b) = aa oppure ab Infine, definiamo un terzo operatore che consente di concatenare zero o più volte, a nostra scelta, una stringa, lo indichiamo con *: a* = aaaaaaaa … E’ un operatore molto particolare, che va sotto il nome di Stella di Kleene. Manca ancora un elemento importantissimo, la stringa vuota, che di norma viene indicata con la lettera greca ε (epsilon). La stella di Kleene ammette infatti anche nessuna ripetizione del simbolo, quindi la stringa vuota ε è un risultato ammesso dell’espressione a*. a* = ε, a, aa, aaa, … Soffermiamoci per ora a giocare con le espressioni regolari, per costruire insiemi di stringhe a partire dai simboli dell’alfabeto e gli operatori che abbiamo definito. Ad esempio, l’espressione regolare: a(b+c)b* ammette come soluzione questo insieme di stringhe: {ab, ac, abb, abbb…., acb, acbbb …} Le espressioni regolari sono una vera e propria algebra, detta Algebra di Kleene. E’ grazie al matematico americano Stephen Kleene se, oggi, abbiamo gli strumenti matematici che ci consentono di comunicare con i calcolatori elettronici attraverso strutture di linguaggio specifiche, dette linguaggi formali. -4-
Le espressioni regolari sono strumenti che consentono di rappresentare, in modo estremamente sintetico, intere famiglie di stringhe dalla struttura anche piuttosto complessa. E’ possibile costruire un’automa in grado di riconoscere stringhe aventi struttura specifica. Teorema: Per ogni espressione regolare esiste un automa a stati finiti in grado di riconoscere il linguaggio generato. Un automa è un insieme di stati, archi e simboli che etichettano gli archi. Gli automi hanno due stati speciali, lo stato iniziale e lo stato finale. A partire da una espressione regolare, si costruisce un automa a stati finiti che ne riconosce il linguaggio applicando pochissime regole. Lo stato iniziale si distingue per essere l’una con una freccia entrante e nessuno stato precedente, e quello finale per una doppia bordatura. La stringa vuota è riconosciuta da uno stato che è, contemporaneamente, iniziale e finale. Quindi ε è riconosciuta da: La concatenazione di due porzioni di espressione regolare si costruisce connettendo gli automi che le riconoscono con un arco, su cui è stato posto l’elemento corrispondente del vocabolario. Quindi, ad esempio, la stringa ab è riconosciuta da: La Stella di Kleene si realizza ponendo un arco che rientra all’ingresso stesso della porzione di espressione da ripetere indefinitamente, ad esempio, questo automa riconosce la stringa (ab)*: -5-
Notate che, siccome l’espressione (ab)* è soddisfatta anche dalla stringa vuota ε, l’automa ha uno stato iniziale che è anche finale. Infine, l’unione si riconosce ponendo due archi uscenti con il corrispondente elemento dell’alfabeto. Ad esempio, a+b è riconosciuta da questo automa: L’automa che riconosce l’espressione regolare a(b+c)b* è quindi: L’insieme di stringhe generato dalle espressioni regolari e riconosciuto dai relativi automi a stati finiti è anche detto linguaggio. Automi ed espressioni regolari sono oggetti matematici dotati di un formalismo ben preciso e di potenzialità espressive caratteristiche. Il matematico inglese Alan Turing, oggi è ritenuto a buon diritto uno dei padri, se non il padre e fondatore della scienza dell’informazione. Come tanti geni è stato incompreso in vita e, per il fatto di essere gay, addirittura osteggiato. Turing nasce il 23 giugno 1912 a Paddington nei dintorni di Londra. Si laurea nel 1934 a Cambridge, distinguendosi già per i propri solidissimi contributi in meccanica quantistica, probabilità e logica. Nel 1936 inventa una astrazione matematica del moderno calcolatore: la Macchina di Turing. Il genio inglese supera le limitazioni degli automi a stati finiti intuendo che il problema sta nella mancanza di memoria. Immagina una macchina astratta che, come gli automi a stati finiti, è dotata di un alfabeto di simboli, un insieme di stati e una funzione di transizione ma, per la prima volta in assoluto, a questi elementi aggiunge una memoria interna, un nastro, da cui legge e scrive simboli dell’alfabeto. Le operazioni condotte dalla macchina di Turing sono assimilabili, a tutti gli effetti, alle istruzioni dei microprocessori moderni. Nel suo lavoro di dottorato (1938) in Logica, Teoria dei numeri e Algebra, Turing dimostra che la sua macchina è universale, cioé equivalente a tutti i possibili tipi di macchina calcolatrice. In altri termini, qualsiasi programma di computer scritto in passato, presente o futuro, è convertibile in un suo equivalente eseguibile con la Macchina di Turing. Turing si distingue durante la seconda guerra mondiale per aver saputo svelare il segreto di Enigma, il codice di crittografia usato dai nazisti per le proprie comunicazioni. Il suo contributo si rivela determinante per la vittoria degli alleati. Alla fine della seconda guerra mondiale Turing si dedica a tempo pieno allo sviluppo della moderna scienza dei calcolatori, e svolge un ruolo di -6-
primissimo piano nella definizione dei principi teorici sottostanti la programmazione, le reti neurali, e l’intelligenza artificiale. ITIS-LS “Francesco Giordani” Caserta Anno scolastico: 2019/2020 Classe 3^ sez.B spec. Informatica e telecomunicazioni Data: Numero progressivo dell’esercizio: es3 (GeneraStringhe.html) Versione: 1.0 Programmatore/i: Sistema Operativo: Windows 10 Compilatore/Interprete: Browser - Javascript Obiettivo didattico: Espressioni regolari, generare stringhe in modo casuale e validarle Obiettivo del programma: genera e valida stringa File GeneraStringhe.html /* Funzione in puro Javascript per generare una stringa random */ var stringaDavalidare; function generateRandomString(iLen) { var stringaRandom = ''; var sChrs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; for (var i = 0; i < iLen; i++) { var randomPoz = Math.floor(Math.random() * sChrs.length); stringaRandom += sChrs.substring(randomPoz, randomPoz + 1); } document.getElementById("result").innerHTML = stringaRandom; stringaDaValidare=stringaRandom } function validate() { var expr = /a+\w*/i; -7-
if (! expr.test(stringaDaValidare)) { window.alert("Formato stringa non valida"); } else { window.alert("Formato stringa valida"); } } Stringa random generata: Nota: var expr = /a(b+c)b*/; ammette questo insieme di stringhe valide: {ab, ac, abb, abbb…., acb, acbbb …} -8-
Informatica e Laboratorio di Programmazione linguaggi Alberto Ferrari Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei linguaggi formali Sistemi Informativi o linguaggi formali o linguaggi di programmazione o linguaggi di marcatura (es. HTML, Latex) o interazione uomo macchina (es. ricerca Google) o linguaggi nel software di sistema o compilatori o interpreti … http://www.ce.unipr.it/~aferrari/codowood Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei descrizione di un linguaggio Sistemi Informativi o grammatica o quali frasi sono corrette? o lessico o analisi lessicale (sequenze corrette di simboli dell’alfabeto (token)) o sintassi o analisi sintattica (sequenze corrette di token) o semantica o cosa significa una frase corretta? o attribuzione del significato o pragmatica o come usare una frase corretta? o implementazione o come eseguire una frase corretta rispettando la semantica? Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei Sistemi Informativi linguaggi formali GRAMMATICA Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei alfabeti e stringhe Sistemi Informativi o alfabeto Σ: insieme di simboli o stringa s: sequenza di simboli di Σ o s ∈ Σ*, insieme di tutte le stringhe o ε: stringa vuota o |s|: lunghezza della stringa s o linguaggio L ⊆ Σ* o sottoinsieme di tutte le stringhe possibili o grammatica: regole formali per definire le “stringhe ben formate” di L o esempio: numeri romani da 1 a 1000 o alfabeto {I, V, X, L, C, D, M} + regole ... Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei concatenazione di stringhe Sistemi Informativi o operazione di concatenazione • o proprietà associativa: (x • y) • z = x • (y • z) o non commutativa: x • y ≠ y • x o Σ* chiuso rispetto alla concatenazione: Σ* • Σ* → Σ* o potenza o xn = x • x • x • x … (n volte) o elemento neutro ε o stringa vuota, ∀ x ∈ Σ*, ε • x = x • ε = x Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei operazioni sui linguaggi Sistemi Informativi o L1 ed L2 linguaggi su Σ* (due insiemi di stringhe) o unione: L1 ∪ L2 = {x ∈ Σ* : x ∈ L1 ∨ x ∈ L2} o intersezione: L1 ∩ L2 = {x ∈ Σ* : x ∈ L1 ∧ x ∈ L2} o complementazione: = {x ∈ Σ* : x ∉ L1} o concatenazione o prodotto: L1 • L2 = {x ∈ Σ* : x = x1 • x2, x1 ∈ L1, x2 ∈ L2} o potenza: Ln = L • Ln-1, n≥1; L0 = {ε} per convenzione o concatenazione di n stringhe qualsiasi di L o stella di Kleene: L* = ∪ Ln, n = 0..∞ o concatenazione arbitraria di stringhe di L L*: chiusura riflessiva e transitiva di L rispetto a • Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei definizione dei linguaggi Sistemi Informativi o approccio algebrico o linguaggio costruito a partire da linguaggi più elementari, con operazioni su linguaggi o approccio generativo o grammatica, regole per la generazione di stringhe appartenenti al linguaggio o approccio riconoscitivo o macchina astratta o algoritmo di riconoscimento, per decidere se una stringa appartiene o no al linguaggio Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei Sistemi Informativi un esempio di grammatica espressioni regolari - regex Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei espressioni regolari Sistemi Informativi o dato un alfabeto Σ, chiamiamo espressione regolare una stringa r sull'alfabeto Σ ∪ {+, *, (, ), •, Ø} tale che: o r = Ø: linguaggio vuoto; oppure o r ∈ Σ: linguaggio con un solo simbolo; oppure o r = s + t: unione dei linguaggi L(s), L(t); oppure o r = s • t: concatenazione dei linguaggi L(s), L(t); oppure o r = s*: chiusura del linguaggio L(s) o (con s e t espressioni regolari; simbolo • spesso implicito) esempio Σ = {a, b}: a • (a + b)* • b Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei espressioni regolari Sistemi Informativi o una espressione regolare (regular expression) è una sequenza di simboli che identifica un insieme di stringhe o esistono regole condivise fra i vari linguaggi relative alle regex ☺ o i vari linguaggi utilizzano notazioni diverse per rappresentare le stesse espressioni regolari o le espressioni regolari possono definire tutti e soli i linguaggi regolari o nella gerarchia di Chomsky la classe dei linguaggi generati da grammatiche di tipo 3 o riconosciuti da automi a stati finiti o espressioni regolari nei linguaggi di programmazione o prima implementazione PERL '80 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei regex – classi di caratteri Sistemi Informativi o [...] per includere uno qualsiasi dei caratteri in parentesi o singoli caratteri o intervalli di caratteri adiacenti o [A-Z] = qualsiasi lettera maiuscola o [a-zABC] = qualsiasi lettera minuscola oppure A, B, o C o [^...] per escludere uno qualsiasi dei caratteri in parentesi o [^0-9] = qualsiasi carattere non numerico o simboli speciali per identificare classi di caratteri o \d = numerico, equivale a [0-9] o \s = [ \t\r\n\f] o \w = [0-9a-zA-Z_] o \D = non numerico, equivale a [^0-9] Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei regex – caratteri speciali Sistemi Informativi o . per un carattere qualsiasi o A.B riconosce la stringa AoB, AwB, AOB ecc. o \ escape, per sequenze speciali o caratteri speciali o \? cerca il ? o ^ corrisponde all'inizio del testo o $ corrisponde alla fine del testo o | per alternativa tra due espressioni (unione) o A|B = carattere A o carattere B o (...) per raggruppare sotto-espressioni o ga(zz|tt)a trova sia gazza che gatta Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei regex - ripetizioni Sistemi Informativi o {...} per specificare il numero di ripetizioni o \d{3,5} sequenze di almeno tre cifre, al massimo cinque o * zero o più occorrenze di un’espressione o (ab)* riconosce ab, abab, la stringa vuota, ma non riconosce abba o + una o più occorrenze o (ab)+ non riconosce la stringa vuota o ? zero o al più una occorrenza (parte opzionale) o (ab)? riconosce ab ma non abab Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei regex - esempi Sistemi Informativi o codice fiscale: o ^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$ o dominio: o ^[\w\-]+\.(it|com|org|net|eu|mobi)$ o e-mail: o ^[\w\-\.]+@[\w\-\.]+\.[a-z]+$ o file: ^.+\.zip$ o data: ^\d{2}/\d{2}/\d{4}$ Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei html & JavaScript - regex Sistemi Informativi function validate(val) { var expr = /^\d{2}\/\d{2}\/\d{4}$/; if (! expr.test(val)) { window.alert("Wrong date format"); return false; } return true; } Date (dd/mm/yyyy): Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei regex in Python Sistemi Informativi o modulo standard re o le espressioni regolari vengono compilate in oggetti RegexObject o gli oggetti RegexObject contengono metodi per varie operazioni o match() o determina se la RE corrisponde all'inizio della stringa (None se non trovata) o search() o ricerca tutte le posizioni corrispondenti alla RE all'interno di una stringa (None se non trovata) o findall() o trova tutte le sottostringhe corrispondenti alla RE, e le restituisce in una lista o… >>> import re >>> p = re.compile('ab*') https://docs.python.it/html/lib/re-syntax.html Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei regex - esempio Sistemi Informativi import re ro = re.compile('[a-z]+') # uno o più caratteri alfabetici minuscolo #f = ro.match('sistemi09informativi') f = ro.search('09sistemi09informativi') if f: #group() restituisce la stringa corrispondente alla RE print('f.group()',f.group()) #start() restituisce la posizione iniziale della corrispondenza print('f.start()',f.start()) #end() restituisce la posizione finale della corrispondenza print('f.end()',f.end()) #span() restituisce una tupla contenente la (start, end) posizione della corrispondenza print('f.span()',f.span()) else: print('no match') l = ro.findall('09sistemi09informativi') print(l) Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei regex - esempio Sistemi Informativi import re # Remove anything other than digits phone = 'Phone: +39 0521 905708' num = re.sub(r'\D', "", phone) print("Phone Num : ", num) # Hide password string = 'Password: mypwd' hidden = re.sub(r'^(Password:\s*).+$', r'\1(******)', string) print(hidden) # part of a match address = 'Please mail it to alberto.ferrari@unipr.it.com' match = re.search(r'([\w.-]+)@([\w-]+).([\w]+)',address) print(match.group(0)) print(match.group(1)) print(match.group(2)) print(match.group(3)) https://docs.python.org/3/library/re.html Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei Python - regex Sistemi Informativi import re print('match only upper and lowercase letters, numbers, and underscores') patterns = r'^[a-zA-Z0-9_]*$' text1 = 'sistemi_informativi' if re.search(patterns,text1): print('ok') print('minimum eight characters, at least one uppercase letter, one lowercase letter and one number') patterns = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$' pwd = input('password ') while not re.search(patterns,pwd): pwd = input('password ') Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei regex - esempi Sistemi Informativi def is_alphanumeric(string): characherRegex = re.compile(r'[^a-zA-Z0-9.]') string = characherRegex.search(string) return bool(string) def is_mailAddress(string): characherRegex = re.compile(r'^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$') string = characherRegex.search(string) return bool(string) def is_CF(string): # characherRegex = re.compile(r'^[a-z]{6}[0-9]{2}[a-z][0-9]{2}[a-z][0-9]{3}[a-z]$') characherRegex = re.compile(r'^[A-Z]{6}' r'[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST]{1}[0-9LMNPQRSTUV]{2}' r'[A-Z]{1}[0-9LMNPQRSTUV]{3}[A-Z]{1}$') string = characherRegex.search(string) return bool(string) Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei Sistemi Informativi approccio generativo grammatiche di Chomsky Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei grammatiche di Chomsky Sistemi Informativi o grammatica G = < VT, VN, P, S > o VT : alfabeto finito di simboli terminali o VN : alfabeto finito di simboli non terminali o (variabili, categorie sintattiche) o V = VT ∪ VN o P: insieme di produzioni o ∈ P si indica con α → β o α ∈ V o β ∈ V o S ∈ VN: assioma o L(G): insieme delle stringhe di simboli terminali ottenibili con finite operazioni di riscrittura Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei albero delle frasi Sistemi Informativi • la radice dell'albero è l'assioma • ogni nodo ha tanti figli, quante sono le produzioni applicabili • ogni figlio è una forma di frase • le foglie sono stringhe del linguaggio • primo esempio: – G1 = – P1 = {F → ab, F → aFb} • secondo esempio: – G2 = – P2 = {F → ab, F → aG, G → Fb} Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei esempio grammatica context-free Sistemi Informativi o G = (1) E → I (2) E → E + E (3) E → E * E (4) E → E - E (5) E → -E (6) E → (E) (7) I → a (8) I → b (9) I → Ia (10)I → Ia o … genera espressioni aritmetiche con operatori +,*,- unario e binario e simboli a b Alberto Ferrari – Informatica e Laboratorio di Programmazione
esempio grammatica context- Ingegneria dei Sistemi Informativi sensitive o G = (1) S → aSBC (2) S → aBC (3) CB → BC (4) aB → ab (5) bB → bb (6) bC → bc (7) cC → cc o … genera il linguaggio {anbncn : n≥1} o per generare aaabbbccc: o applicare 1-1-2-3-3-3-4-5-5-6-7-7 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei classificazione di Chomsky Sistemi Informativi o tipo 0: grammatiche ricorsivamente enumerabili (RE) o αAβ → γ (non limitate) o tipo 1: grammatiche contestuali (CS) o αAβ → αγβ o tipo 2: grammatiche non contestuali (CF) o A → γ o tipo 3: grammatiche regolari (REG) o A → aB, oppure A → b, oppure A → ε o coincide con classe dei linguaggi definiti da regex A, B ∈ VN; a, b ∈ VT; α, β, γ ∈ V* Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei Sistemi Informativi linguaggi di programmazione Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei linguaggio di programmazione Sistemi Informativi o notazione formale per definire algoritmi o algoritmo: sequenza di istruzioni per risolvere un dato problema in un tempo finito o ogni linguaggio è caratterizzato da: o sintassi o semantica Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei sintassi Sistemi Informativi • insieme di regole formali per scrivere frasi ben formate (programmi) • lessico – parole riservate, operatori, variabili, costanti ecc. (token) • grammatiche non contestuali (...) espresse con notazioni formali: – Backus-Naur Form – Extended BNF – Diagrammi sintattici Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei semantica Sistemi Informativi o attribuisce un significato alle frasi (sintatticamente corrette) costruite nel linguaggio o una frase può essere sintatticamente corretta ma non aver alcun significato o soggetto – predicato – complemento o “La mela mangia il bambino” o “Il bambino mangia la mela” o avere un significato diverso da quello previsto... o GREEK_PI = 345 Alberto Ferrari – Informatica e Laboratorio di Programmazione
semantica Ingegneria dei Sistemi Informativi nei linguaggi di programmazione o correttezza sui tipi o quali tipi di dato possono essere elaborati? o quali operatori applicabili ad ogni dato? o quali regole per definire nuovi tipi e operatori? o semantica operazionale o qual è l'effetto di ogni azione elementare? o qual è l’effetto dell’aggregazione delle azioni? o qual è l’effetto dell’esecuzione di un certo programma? Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei linguaggi di basso livello Sistemi Informativi • più orientati alla macchina che ai problemi da trattare • linguaggi macchina – solo operazioni eseguibili direttamente dall'elaboratore – Op. molto elementari, diverse per ogni processore, in formato binario • linguaggi assembly – prima evoluzione – codici binari → mnemonici Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei linguaggi di alto livello Sistemi Informativi • introdotti per facilitare la scrittura dei programmi • definizione della soluzione in modo intuitivo • astrazione rispetto al calcolatore su cui verranno eseguiti • necessaria traduzione in linguaggio macchina Alberto Ferrari – Informatica e Laboratorio di Programmazione
storia ed evoluzione Ingegneria dei Sistemi Informativi dei linguaggi di programmazione https://www.cs.toronto.edu/~gpenn/csc324/PLhistory.pdf http://www.levenez.com/lang/history.html http://www.cs.brown.edu/~adf/programming_languages.html Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei paradigmi di programmazione Sistemi Informativi o definiscono la filosofia e la metodologia con cui si scrivono i programmi o definiscono il concetto (astratto) di computazione o ogni linguaggio consente (o spinge verso) l'adozione di un particolare paradigma o imperativo / procedurale o orientato agli oggetti o scripting (tipizzazione dinamica, principio DRY - Don't Repeat Yourself) o funzionale (funzioni come “cittadini di prima classe”) o logico (base di conoscenza + regole di inferenza) Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei linguaggi e paradigmi Sistemi Informativi o imperativi / procedurali o Cobol, Fortran, Algol, C, Pascal o orientati agli oggetti o Simula, Smalltalk, Eiffel, C++, Delphi, Java, C#, VB.NET o scripting o Basic, Perl, PHP, Javascript, Python o funzionali o Lisp, Scheme, ML, Haskell, Erlang o logici o Prolog... Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei paradigma logico - prolog Sistemi Informativi o il paradigma logico utilizza la logica del primo ordine (clausole di Horn) sia per rappresentare sia per elaborare l'informazione o assiomi e regole di inferenza o si descrive la struttura logica del problema piuttosto che il modo di risolverlo o focus sugli aspetti logici del problema e sul modo migliore per rappresentarli o prolog (programmation en logique) o ideato da Alain Colmerauer negli anni '70 o linguaggio di programmazione di tipo dichiarativo o il programmatore dice cosa fare e non come farlo Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei prolog Sistemi Informativi o un programma prolog è composto da o fatti (affermazioni sempre vere) padre(aldo,giovanni). padre(aldo,lucia). madre(giulia,giovanni). madre(giulia,lucia). o regole genitore(X,Y) :- padre(X,Y). genitore(X,Y) :- madre(X,Y). fratello_sorella(X,Y) :- padre(Z,X), padre(Z,Y), madre(W,X), madre(W,Y), X \= Y. o domande (goal) ?- padre(luca,pippo) -- YES ?- fratello_sorella(X,giovanni) -- X=lucia Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei prolog - query Sistemi Informativi o per soddisfare un goal (rispondere a una domanda) o cerca un fatto che unifica il goal o identificare una sostituzione delle variabili che rende identici il fatto e il goal o se un fatto viene trovato, il goal è soddisfatto o cerca una regola la cui testa (parte sinistra) unifica il goal o se la trova, cerca di soddisfare tutti i sotto-goal di cui è composta la regola (parte destra) o usa una stessa sostituzione delle variabili per tutti i sotto-goal https://swish.swi-prolog.org/ Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei example: mortal philosophers Sistemi Informativi consider the following argument: all men are mortal. Socrates is a man. ------------------------- hence, Socrates is mortal. the two premises can be expressed as a little it has two premises and a conclusion prolog program: mortal(X) :- man(X). man(socrates). the conclusion can then be formulated as a query: ?- mortal(socrates). Yes Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei paradigma funzionale Sistemi Informativi o paradigma di programmazione in cui l’operazione fondamentale è l’applicazione di funzioni ai loro argomenti o un programma è una funzione, definita in termini di altre funzioni, che elaborano l’input e restituiscono il risultato finale o le funzioni sono prive di effetti collaterali (no side effects) o funzioni pure o le funzioni sono trattate come un qualsiasi altro tipo di dato o first class objects o la ricorsione è la principale struttura di controllo o non esistono costrutti iterativi o high order functions: funzioni che operano su funzioni, che operano su funzioni, … Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei paradigma funzionale - lisp Sistemi Informativi o lisp (list processing) è un linguaggio di programmazione (John McCarthy 1958) per il trattamento di liste e, in generale, di informazione non numerica o utilizzato in progetti di intelligenza artificiale o le liste in lisp sono in realtà alberi con l’informazione (i simboli atomici) memorizzata nelle foglie o es. la lista (a (b c) d (e f g)) corrisponde all’albero in figura o un programma lisp è una lista o è possibile scrivere programmi che ricevono in input altri programmi (defun mylength (lst) (cond ((null lst) 0) ((atom lst) nil) (t (+ 1 (mylength (cdr lst)))))) funzione mylength che, data una lista lst, ne calcola il numero di elementi Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei esecuzione dei programmi Sistemi Informativi o linguaggio ad alto livello → passi necessari: o compilazione, traduzione in linguaggio macchina o collegamento (linking) con librerie di supporto o caricamento (loading) in memoria o programmi compilati: applicati i 3 passi... o a tutto il codice; prima dell'esecuzione o programmi interpretati: applicati i 3 passi... o in sequenza, su ogni istruzione; a tempo di esecuzione Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei processo di compilazione Sistemi Informativi • traduzione da linguaggio alto livello a linguaggio macchina • analisi: lessicale, grammaticale, contestuale • rappresentazione intermedia: albero sintattico annotato (AST) • generazione codice oggetto – non ancora eseguibile – linker, loader Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei albero sintattico Sistemi Informativi while b != 0: if a > b: a = a − b else: b = b − a return a Algoritmo di Euclide per MCD Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei collegamento Sistemi Informativi o il linker collega diversi moduli oggetto o simboli irrisolti → riferimenti esterni o il collegamento può essere statico o dinamico o collegamento statico o libreria inclusa nel file oggetto, eseguibile stand-alone o dimensioni maggiori, ma possibile includere solo funzionalità utilizzate o collegamento dinamico o librerie condivise da diverse applicazioni o installazione ed aggiornamento unici o caricate in memoria una sola volta Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei caricamento Sistemi Informativi o il loader carica in memoria un programma rilocabile o risolti tutti gli indirizzi relativi (variabili, salti ecc.) o caricati eventuali programmi di supporto o rilocazione statica o indirizzi logici trasformati in indirizzi assoluti o rilocazione dinamica o indirizzi logici mantenuti nel programma in esecuzione o programma compilato: indirizzamento relativo o tramite registro base: locazione in memoria del codice, dei dati e dello stack o Memory Management Unit Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei codice gestito Sistemi Informativi o compilazione in codice intermedio o Bytecode (Java), Common Intermediate Lang. (.NET), … o Python: compilato per una macchina virtuale (file .pyc), ma in modo trasparente o esecuzione su una macchina virtuale, che gestisce la memoria (garbage collection) o Java Virtual Machine, Common Language Runtime, … o spesso compilazione “al volo” (Just In Time) in codice nativo Alberto Ferrari –Informatica e Laboratorio di Programmazione
Puoi anche leggere