AOT LAB Agent and Object Technology Lab Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Fondamenti di Informatica Linguaggi di Programmazione Michele Tomaiuolo AOT LAB Linguaggi macchina I linguaggi macchina forniscono solo le operazioni che l'elaboratore può eseguire: Operazioni molto elementari Diverse per ogni processore Scritte in linguaggio binario Sono più orientati alla macchina che ai problemi da trattare 2 AOT LAB Linguaggi assemblativi Una prima evoluzione sono i linguaggi assemblativi che sostituiscono i codici binari con codici simbolici START: EQUAL: MOV CMP JZ INT RET MOV AX, BX AX, 12h EQUAL 21h BL, 82h I linguaggi macchina e i linguaggi assemblativi sono detti linguaggi a basso livello 3 AOT LAB Linguaggi ad alto livello I cosiddetti linguaggi ad alto livello sono stati introdotti per facilitare la scrittura dei programmi Sono linguaggi simbolici e in continua evoluzione Sono definiti da un insieme di regole formali, le regole grammaticali o sintassi Questi linguaggi di programmazione permettono: La descrizione del problema in modo intuitivo, dimenticandosi che verranno eseguiti da un calcolatore Una astrazione rispetto al calcolatore su cui verrà eseguito il programma Ma devono essere tradotti in linguaggio macchina 4 AOT LAB Storia dei linguaggi Inizi Assembly Linguaggio macchina 1945 1950 Sistema ALGOL Prolog COBOL Simula LISP BASIC C FORTRAN Pascal 1960 1970 OOP Internet .NET Smalltalk PHP C++ Javascript ADA Java 1980 2000 http://www.oreilly.com/news/graphics/prog_lang_poster.pdf http://www.levenez.com/lang/history.html http://www.byte.com/art/9509/sec7/art19.htm http://www.princeton.edu/~ferguson/adw/programming_languages.shtml 5 AOT LAB Sintassi e semantica Le regole di sintassi definiscono come si devono comporre i simboli e le parole per formare delle istruzioni corrette La semantica di un’istruzione definisce il significato della stessa Un programma sintatticamente corretto non è necessariamente semanticamente corretto I programmi fanno quello che prescriviamo che facciano e non quello che vorremmo che facessero 6 AOT LAB Sintassi e semantica Programma sintatticamente corretto Soddisfa le regole sintattiche Cioè, è una sequenza di parole o simboli appartenenti alle giuste categorie sintattiche Programma semanticamente corretto Soddisfa le regole semantiche Dice se il programma ha senso, se sarà possibile eseguirlo Ad esempio, la frase “Il cane gioca in borsa” è sintatticamente corretta, ma non semanticamente 7 AOT LAB Semantica Correttezza semantica (typing) Quali tipi di dato possono essere elaborati? Quali operatori applicabili ad ogni dato? Quali regole per definire nuovi operatori? Effetto dell’esecuzione (semantica operazionale) Quale è il singolo effetto di ogni azione elementare? Quale è l’effetto dell’aggregazione delle azioni? • Cioè quale è l’effetto dell’esecuzione di un certo programma? 8 AOT LAB Paradgmi di programmazione Forniscono la filosofia con cui si scrivono i programmi e stabiliscono: La metodologia con cui si scrivono i programmi Il concetto di computazione I linguaggi devono consentire ma soprattutto spingere all’adozione di un particolare paradigma: Imperativo Logico Funzionale Orientato agli oggetti 9 AOT LAB Imperativi Fortran Cobol C Pascal Visual Basic Funzionali Lisp ML Linguaggi di programmazione Logici Prolog Orientati agli Oggetti C++ Java C# Smalltalk Eiffel 10 AOT LAB Esempi di programma Calcolo fattoriale Il fattoriale del numero intero positivo n è il prodotto dei primi n numeri interi positivi Il fattoriale viene rappresentato con la forma n! Gestione liste Una lista è una delle strutture dati consistente in una sequenza di nodi che contengono • Campi di dati arbitrari • Uno o due riferimenti che puntano al nodo successivo e/o precedente Operazioni possibili sulle liste sono aggiunta, rimozione, ordinamento ecc. di nodi 11 AOT LAB Linguaggi imperativi Un linguaggio imperativo è legato all’architettura della macchina di Von Neumann, ma ad un livello di astrazione vicino a quello dei diagrammi di flusso La principale attività del processore è assegnare valori a celle di memoria Le operazioni che effettuano le istruzioni di un linguaggio imperativo si basano sul concetto di variabile Astrazione del concetto di locazione di memoria 12 AOT LAB Linguaggi imperativi I linguaggi imperativi adottano uno stile prescrittivo Il programma imperativo prescrive le operazioni che il processore deve compiere L’esecuzione delle istruzioni è nell'ordine in cui appaiono nel programma L’ordine può essere alterato dalle strutture di controllo realizzate dal processore con le istruzioni di salto 13 AOT LAB Programma imperativo La struttura del programma consiste principalmente in due parti: Una parte di dichiarazione in cui si dichiarano tutte le variabili del programma ed il loro tipo Una parte di istruzioni che realizzano l'algoritmo risolutivo del problema I tipi di istruzioni corrispondono proprio ai tipi di istruzioni possedute dai processori Istruzioni di lettura e scrittura Istruzione di assegnamento Istruzioni aritmetiche e logiche Istruzioni di controllo 14 AOT LAB Fattoriale main(…) { printf(“%d”, fattoriale(n)); } cc fattoriale.c int fattoriale(int n) { int fatt = 1; for (int i = 1; i <= n; i++) { fatt = fatt * i; } return fatt; } fattoriale 3 6 15 AOT LAB struct lista { int val; lista *next; } main(…) { … } int aggiungi(int n, lista l) { … } Gestione liste cc gestisciLista.c gestisciLista Scegli l’operazione: … int rimuovi(int indice, lista l) { … } … 16 AOT LAB Pregi e difetti + Ottima efficienza + Adatti a programmi numerici e gestionali - Scarsa naturalezza, leggibilità e flessibilità Difficile programmazione incrementale Non adatti per la manipolazione simbolica Le funzioni e le variabili non sono funzioni e variabili matematiche - Poco adatti per applicare metodi formali di correttezza e di verifica di programmi - Difficile manipolazione dinamica di programmi 17 AOT LAB Linguaggi funzionali In un linguaggio funzionale un programma è visto come una funzione matematica Una funzione è una regola di corrispondenza che associa ad ogni elemento del suo dominio un unico elemento nel codominio Una definizione di funzione specifica il dominio, il codominio e la regola di associazione Dopo la definizione una funzione può essere applicata ad un elemento del dominio per restituire l'elemento associato nel codominio 18 AOT LAB Linguaggi funzionali La sola operazione del modello funzionale è l’applicazione di funzioni ad operandi Il ruolo della macchina funzionale (interprete) è valutare il programma e produrre un valore Il valore di una funzione è determinato solo dai suoi argomenti Non ci sono effetti collaterali (funzionale puro) L'essenza della programmazione funzionale è combinare funzioni Basato sull’utilizzo della ricorsione Le variabili sono variabili matematiche che denotano un valore fisso nel tempo e non valori mutabili Non c’è nessun assegnamento 19 AOT LAB (defun fattoriale(n) (if (= n 0) 1 (* n (fattoriale (- n 1))) ) ) Fattoriale (fattoriale 3) 6 http://www.joeganley.com/code/jslisp.html 20 AOT LAB Gestione liste (car (list 1 2 3)) 1 (cdr (list 1 2 3)) (2 3) (cons 4 (list 1 2 3)) (4 1 2 3) 21 AOT LAB Pregi e difetti + Adatti per la manipolazione simbolica e per i problemi naturalmente ricorsivi + Le funzioni e le variabili sono funzioni e variabili matematiche + Adatti per applicare metodi formali di correttezza e di verifica di programmi + Facile manipolazione dinamica di programmi + Adatti per applicazioni di Intelligenza Artificiale e programmazione esplorativa + Buona naturalezza - Bassa efficienza Non adatti per la manipolazione numerica Difficile programmazione procedurale Scarsa leggibilità e flessibilità Non facilitano la programmazione incrementale 22 AOT LAB Linguaggi logici In un linguaggio logico un programma è composto da una base di conoscenza contenente: Una descrizione del problema basata su formule logiche (fatti, predicati, …) Un insieme di regole per manipolare la descrizione del problema Con un linguaggio logico programmare significa: Descrivere il problema con delle formule del linguaggio Interrogare il sistema (motore inferenziale) per effettuare delle inferenze 23 AOT LAB Linguaggi logici L’esecuzione di un programma corrisponde all’applicazione delle regole alla descrizione del problema L’esecuzione è attivata da una interrogazione dell’utente Lo scopo dell’esecuzione è • Verificare se la descrizione del problema soddisfa l’interrogazione • Recuperare i valori della descrizione del problema che soddisfano l’interrogazione • Rispetto alle normali computazioni, il calcolo logico ha le caratteristiche del cosiddetto non-determinismo: Può terminare con insuccesso Può concludersi con più di un caso di successo 24 AOT LAB Fattoriale fattoriale(0, 1) :- !. fattoriale(N, X) :- N > 0, M is N - 1, fattoriale(M, Y), X is Y * N. fattoriale(3, X) X = 6 http://www.sfu.ca/~gholst/JLog/index.html 25 AOT LAB Gestione liste aggungi([], X, X). aggiungi([[X1 | X2], Y, [X1 | Z]) :- aggiungi(X2, Y, Z). aggiungi([1], [1, 2], W) W = [1, 1, 2] 26 AOT LAB Pregi e difetti + Adatti per la manipolazione simbolica e per i problemi naturalmente ricorsivi + Adatti per applicare metodi formali di correttezza e di verifica di programmi + Facile manipolazione dinamica di programmi + Adatti per applicazioni di Intelligenza Artificiale + Buona naturalezza - Bassa efficienza Non adatti per la manipolazione numerica Scarsa leggibilità e flessibilità Difficile programmazione procedurale Non facilitano la programmazione incrementale 27 AOT LAB Linguaggi orientati agli oggetti I linguaggi orientati agli oggetti si sono evoluti a partire dal concetto di astrazione di dato introdotto in alcuni linguaggi imperativi Con un linguaggio orientato agli oggetti si cerca di rappresentare un problema descrivendo ogni entità partecipante con un oggetto nella forma e nel comportamento La definizione di un oggetto è basata su tecniche di Incapsulamento dei dati Ereditarietà Astrazione Polimorfismo 28 AOT LAB Linguaggi orientati agli oggetti Incapsulamento dei dati I dettagli di definizione degli oggetti sono nascosti Solo le operazioni (metodi) permesse su di loro sono visibili Ereditarietà Gli oggetti sono definiti in una gerarchia Ereditano dall’immediato parente dati e metodi Aggiungono dati e metodi e specializzano quelli ereditati Astrazione Il meccanismo con cui si specifica le caratteristiche peculiari di un oggetto che lo differenzia da altri Polimorfismo Possibilità di eseguire funzioni con lo stesso nome su tipi di dati differenti 29 AOT LAB Linguaggi orientati agli oggetti In un linguaggio di programmazione orientato agli oggetti (OOP) un programma consiste: Definizione di un insieme di classi Creazione di un insieme di istanze di queste classi ed esecuzione dei loro metodi Una classe definisce un tipo di oggetto come insieme di: Variabili (campi) Funzioni (metodi) 30 AOT LAB class Fattoriale { int valore; int fattoriale(int n) { int fatt = 1; for (int i = 1; i <= n; i++) fatt = fatt * i; return fatt; } void main(String[] args) { … System.out.println(fattoriale(n)); … } } Fattoriale javac fattoriale.java java fattoriale 3 6 31 AOT LAB Gestione liste class Lista { int val; Lista next; Lista aggiungi(int val) { … } … javac GestisciListe.java java GestisciListe Lista rimuovi(int indice) { … } } import Lista; Class GestisciListe { Vector<Lista> liste; … void main(String[] args) { …} } 32 AOT LAB + + + + + + Pregi e difetti Ottima flessibilità e programmazione incrementale Ottimo riuso del software Buona efficienza Adatti per programmi numerici e gestionali Abbastanza adatti per la manipolazione simbolica Discreta naturalezza e leggibilità e flessibilità - Poco adatti per applicare metodi formali di correttezza e di verifica di programmi - Difficile manipolazione dinamica di programmi 33 AOT LAB Paradigmi di programmazione Imperativo Programma = Algoritmo + Dati Logico Programma = Logica + Controllo Funzionale Programma = Funzione Orientato agli Oggetti Programma = Oggetti 34 AOT LAB Perchè più paradigmi e linguaggi? Efficienza Rapida prototipazione Facile comprensione del linguaggio (leggibilità) Modificabilità e riusabilità Programmazione in largo Qualità del programma 35 AOT LAB Programmazione multi paradigma Rispetto alla varietà dei problemi e delle applicazioni concrete ogni paradigma presenta propri vantaggi e svantaggi Per risolvere il problema si cerca di aggiungere a un linguaggio, appartenente ad un particolare paradigma di programmazione, caratteristiche proprie di un altro paradigma A volte lo stesso scopo viene raggiunto aggiungendo particolari librerie Un'altra soluzione, spesso adottata, è quella di interfacciarsi con altri linguaggi 36 AOT LAB Ciclo di vita del software Lo sviluppo del software è un’attività dinamica soggetta a continue variazioni e modifiche Si parla di manutenzione del software per indicare l’attività che prevede la correzione ed il miglioramento di un programma e della sua documentazione Il software, per questo motivo, è soggetto ad una evoluzione nota con il nome di ciclo di vita che può essere riassunta nello schema seguente 37 AOT LAB Ciclo di vita del software Fase 1 – Analisi dei requisiti Intervista con il cliente per la messa a punto delle specifiche. Descrizione dell’input e dell’output mediante variabili semplici e strutturate Fase 2 – Progetto Stesura dell’algoritmo, rappresentato mediante pseudo codice, e controllo della sua funzionalità Fase 3 – Implementazione Codifica dell’algoritmo in un linguaggio di programmazione dipendente dal tipo di problema 38 AOT LAB Ciclo di vita del software Fase 4 – Collaudo e validazione Procedura di prova e verifica del programma realizzato attraverso l’esecuzione con dati campione e l’utilizzo di utenti Fase 5 – Redazione della documentazione Procedura di stesura del manuale d’uso Fase 6 – Rilascio del prodotto Diffusione del software prodotto e della sua documentazione per la relativa commercializzazione Fase 7 – Manutenzione Attività di correzione e modifica necessarie per un migliore utilizzo o funzionamento 39