program5 analisi funzionale del programma sondaggio conoscenze programmatorie listaioli Donato Taddei su uictech, 18\02\2013, h. 19.35. Prerequisito: Aver letto, compreso, e tenere a portata di mano il precedente messaggio dal titolo: Programmazione: riassunto della presente tornata di messaggi, che perciò viene riportato in coda al presente. Volendo seguire non ci sono scuse. Nelle conclusioni si era ipotizzato, al fine di focalizzare i concetti, una applicazione pratica consistente in un sondaggio per saggiare le conoscenze programmatorie dei listaioli e si era detto che sarebbe stato quasi immediato, appunto sulla scorta dei punti precedenti, definire le voci del questionario. Questo è un possibile esempio di form: Campo1: Indica, separati da virgole, i linguaggi di programmazione che conosci, o lascia in bianco. Campo2: Indica gli ambienti di sviluppo che utilizzi, separati da virgole, o lascia in bianco Campo3: Indica l'ambiente di sviluppo che hai trovato più accessibile. Seguono poi una serie di caselle da marcare: Casella1: usi linguaggi compilati? Casella2: Usi linguaggi interpretati? Casella3: programmi a basso livello? Casella4: utilizzi linguaggi di alto livello? Casella5: Utilizzi linguaggi procedurali? Casella6: utilizzi linguaggi orientati agli oggetti? Nota: i nomi campo1, casella6, ecc. si riferiscono ai campi di editazione e alle caselle in cui chi partecipa al sondaggio immetterà i suoi dai. Allora possiamo dire che i nomi simbolici campo1, campo2 ecc. sono delle variabili che avranno come valore quanto immesso dai partecipanti. Ogni form avrà una variabile campo1, casella4, ecc. ma il suo contenuto sarà diverso per ogni form, appunto variabili. Abbiamo così definito le voci del questionario o, se si preferisce, definito l'oggetto questionario e le sue proprietà. Adesso andremo a definire il prospetto riassuntivo dei dati del sondaggio, cioè il risultato della nostra elaborazione, del programma che andremo a scrivere. In Gergo questa operazione viene chiamata "analisi funzionale", od anche "microanalisi" od ancora "specifiche di minutazione" ma può essere anche semplicemente tradotto come "andiamo a vedere cosa deve fare questo programma e come". Cominciamo col dire che, a differenza della form col questionario, le voci del prospetto saranno il risultato di specifiche elaborazioni, prodotto quindi del programma che andremo a scrivere. Allora diremo che le voci del prospetto sono il risultato di funzioni e, a ben sottolineare questo concetto, accanto ai nomi simbolici delle singole voci porremo una coppia di parentesi tonde, nelle quali mettere appunto tra parentesi singole porzioni del programma. Il prospetto coi risultati dovrà quindi contenere: 1) - Totale-partecipanti() Sarà incrementato ad ogni form analizzata 2) - totale-utenti-linguaggi-inpercentuale() sarà incrementato solo per le schede che non hanno lasciato il campo in bbianco; ne sarà riportato il dato percentuale rispetto ai partecipanti; Inoltre si riporterà, per ciascun linguaggio indicato, che abbiamo detto possono essere anche più di uno in ciascuna schedda, nome e la percentuale di utilizzo rispettto al totale di quelli che hanno specificato un linguaggio. 3) - totale-utenti-ambienti-sviluppo() verrà riportato il totale di quelli che utilizzano un ambiente di sviluppo, in percentuale rispetto agli utenti di un linguaggio, e la distinta per ciascun ambiente con indicazione della percentuale rispetto agli utenti di ambienti di sviluppo. 4) - ambiente-sviluppo-accessibile() Sarà riportato l'ambiene di sviluppo ritenuto più accessibile. Dobbiamo ora gestire le caselle con le altre voci. Poichè però tra gli scopi del questionario c'è anche quello di saggiare le conoscenze programmatorie dei listaioli, a differenza del punto precedente sull'ambiente di sviluppo accessibile, che è un dato soggettivo, qui si tratta di valutare la congruità di quanto affermato nelle caselle con quanto si è dichiarato in precedenza. uno può aver detto di usare il c e poi dichiarare di usare linguaggi orientati agli oggetti, un altro può aver detto di programmare in perl e averlo marcato come linguaggio a basso livello, un altro ancora aver dichiarato di conoscere l'assembler ed averlo dichiarato di usare un linguaggio orientato agli oggetti. Dunque il prospetto dovrà evidenziare che percentuale di utenti di linguaggi in realtà dimostra di non sapere di cosa sta parlando e quale linguaggio ha per le mani. Possiamo pensare allora ad una unica funzione. 5) - Verifica-caselle() che oltre al totale percentuale per ciascuna casella, sempre rispetto al totale utenti di linguaggio, iporti le percentuali per ciascuna casella degli errori grossolani: esempio: il 60% usa linguaggi compilati anche se il 35% degli utenti ha dichiarato inesattezze al iguardo. Abbiamo finora quindi definito 9 variabili nel questionario e 5 funzioni per generare il prospetto riassuntivo. Ma non è ancora il tempo di cominciare a scrivere codice. L'obbiettivo, o come anche si dice il "goal" di questo modo di procedere è quello di scrivere la minor quantità di codice possibile, o, come pure si dice, di Massimizzare il riutilizzo del codice stesso. Necessita quindi un lavoro di ottimizzazione per fare in modo appunto di scrivere il minor numero possibile di righe di codice, nonchè può essere necessario rivedere il tutto e stabilire per esempio di aggiungere altre voci al questionario e altre funzioni per elaborarle. Questo può essere fatto da chiunque, anche senza conoscere un linguaggio, e infatti, in ambiente professionale, potrebbe essere il commitente del programma a chiedere modifiche e aggiunte. Perciò questo è un esercizio in cui può cimentarsi chiunque, indipendentemente dalla conoscenza di un linguaggio di programmazione. Per fare qualche esempio: potremmo fare una unica funzione per il calcolo delle varie percentuali, considerato che il problema si ripropone in parecchie delle funzioni che abbiamo definito; Analogamente potremmo definire una funzione che divida per virgola i campi che ammettono più linguaggi e più ambienti. Dovremo inoltre definire una tabella con le caratteristiche di ciascun linguaggio da confrontare con quanto inserito nelle caselle dai partecipanti. Nota: come detto al nome di ciascuna variabile corrisponderanno valori diversi per ogni scheda; viceversa ad ogni nome di funzione corrisponderà sempre lo stesso pezzo di programma che sarà eseguito su ciascuna scheda e a cambiare saranno solo i valori delle variabili su cui lavora ciascuna funzione. Normalmente non opera affatto così chi scrive un programma per diletto: individua le librerie e le funzioni che fanno al caso della idea che intende realizzare e comincia a scrivere codice che spesso è costretto a riscrivere per non aver tenuto conto di tante cose e nel riscrivere magari ci infila altri errori logici. Nella migliore delle ipotesi il programma funzionerà ma quando tra qualche anno il programmatore dovrà aggiornare il suo programma, specie se non ha messo molti commenti nel codice, egli stesso non ci capirà più una mazza o quasi e farà meglio a riscriverlo da zero, pealtro potendo così mettere a frutto l'esperienze nel frattempo maturata. Per focalizzare quanto detto dunque l'esercizio fondamentale è quello di ottimizzare l'analisi funzionale, per poi passare afinalmente a scrivere codice nei diversi linguaggi. Se infatti tutti quelli che seguono avranno ben chiaro cosa fa il programma e come, sarà perfino istruttivo vederne la realizzazione nei diversi linguaggi, per capire come, a parte il formalismo che contraddistingue ciascun linguaggio, in questi casi semplici, tutti i linguaggi si equivalgono nel senso di poter fare le stesse cose, sia pure con formalismi abbastanza diversi. Era questo che sottolineava tempo fa Francesco Melis, prima di sparire, sequestrato in qualche grotta del supramonte. Ma non è solo lui ad essere sparito: è sparito pure chi come Giovanni trovava illuminanti questi messaggi, Angela che ci vedeva più chiaro, Odisseo imprigionato a Malta dalla ninfa Calipso, Guido che a quest'ora, dopo aver gettato il dado, attraversa il Rubicone, e l'arcangelo Gabriele che detta il suo Corano al profeta. Loro interventi in merito non sarebbero sgrditi, meno ancora quelli di chi ha in queste cose un po di esperienza in più come Andrea Roveretto o Mario Barbuto. Don --------------------------------- Messaggio di riferimento ----- Original Message ----- From: Donato Taddei To: uictech@yahoogroups.com Sent: Friday, February 15, 2013 8:49 PM Subject: Programmazione: riassunto della presente tornata di messaggi Prerequisito: nessuno. Non è necessario nemmeno aver letto o minimamente compreso i messaggi in merito passati in questo ultimo scorcio. Nei romanzi a puntate il riassunto delle puntate precedenti si fa per quelli che hanno saltato la puntata oltre che per quelli che non ricordano. Il riassunto è di per sè un procedimento di sintesi, dal particolare si risale a concetti generali, ciooè si prescinde dai dettagli che ciascuno ha esposto, per astrarre, sintetizzare, generalizzare il succo. Si compie cioè un processo di astrazione o di generalizzazione. Ma, oltre al riassunto, qui si vogliono anche cominciare ad anticipare alcuni concetti che potrebbero essere oggetto di una successiva tornata. Alcune parole o frasi verranno sottolineate, ribadite, sia con delle ripetizioni, dei sinonimi, sia attraverso le virgolette. 1) - "linguaggio di programmazione" é stato questo uno dei principali "oggetti" del contendere, il linguaggio di programmazione è stato oggetto di discettazioni varie. Bene: "un" linguaggio di programmazione qualunque, ogni linguaggio di programmazione, dunque tutti i linguaggi di programmazione ha come scopo quello di permettere all'uomo di dare istruzioni al computer. Tutti i linguaggi di programmazione hanno quindi in comune questo scopo, e quindi possiamo dire che un linguaggio di programmazione qualsiasi ha comunque la caratteristica, la "proprietà", di servire a fare programmi. Questa proprietà non è una descrizione, una chiacchiera, si sostanzia nelle azioni che farà poi compiere al computer. 2) - l'"ambiente di sviluppo" "un" ambiente di sviluppo, quindi "ogni" ambiente di sviluppo, vale a dire "tutti" gli ambienti di sviluppo hanno come scopo ultimo quello di aiutare il programmatore a scrivere programmi in un determinato linguaggio. Questo scopo viene raggiunto: A) - attraverso la generazione di codice al posto del programmatore, b) - il riutilizzo di spezzoni dicodice presente nelle sue librerie sempre per far faticare meno il programmatore, c) - fare una serie di cose di cui normalmente il programmatore medio manco si accorge e non ha nemmeno una pallida idea che esistano, figurarsi a farle. Dunque lo scopo viene raggiunto attraverso parecchie azioni. Allora possiamo dire che tutti gli ambienti di sviluppo condividono un unico fine che si esplicita nelle tre azioni che abbiamo detto. 3) - linguaggi e ambienti Tutti i linguaggi hanno un proprio ambiente di sviluppo? No. Dunque l'ambiente di sviluppo non fa parte delle proprietà comuni a tutti i linguaggi di programmazione perchè ci sono pure quelli che non ce l'hanno. 4) - Ambienti di sviluppo accessibili agli orbi. Solo pochissimi. Dunque la proprietà accessibilità non è una proprietà comune a tutti gli ambienti di sviluppo ma solo a una esigua minoranza di essi, vale a dire agli ambienti di sviluppo accessibili. 5) - Linguaggi compilati e linguaggi interpretati. Fanno tutti parte dei linguaggi di programmazione ma hanno due modalità alternative e a volte concomitanti di funzionamento: I linguaggi compilati producono alla fine un file exe, quelli interpretati vengono eseguiti passando il codice come input a un programma specifico che provvede ad eseguirlo. Un programma scritto in un linguaggio compilato avrà un suo codice e il corrispondente file exe prodotto dal compilatore. In un linguaggio interpretato ogni programma avrà il proprio codice ma come eseguibile il programma interprete del linguaggio in cui il codice è stato scritto, e sarà sempre quello per qualsiasi programma scritto in quel linguaggio. 6) - il livello dei linguaggi di programmazione Si dicono a "basso livello" quei linguaggi che sono più vicini al funzionamento della macchina; si dicono ad "alto livello" quei linguaggi che sono invece più vicini al linguaggio e al ragionamento umano; si dicono di "medio livello" quei linguaggi che hanno caratteristiche intermedie tra questi due. Comunque ogni linguaggio di programmazione ha un suo specifico livello, per cui possiamo dire che il livello è una cratteristica comune a tutti i linguaggi, ancorchè assuma differenti valori per i tre sottoinsiemi di linguaggi considerati. 7) - linguaggi procedurali e linguaggi ad oggetti Con buona approssimazione possiamo dire che ricadono nei tre sottoinsiemi di cui al punto precedente: i linguaggi ad oggetti corrispondono all'incirc a quelli di alto livello, quelli molto procedurali a quelli di basso livello, e quelli cosiddetti "orientati agli oggetti" al medio livello. 8) _ Pensiamo a una applicazione pratica delle banalità suesposte perchè non stiamo facendo filosofia ma parlando appunto di programmazione. Potremmo per esempio voler fare un programma che elabori un questionario in merito alle preferenze e conoscenze programmatorie dei listaioli. Ovviamente dovremmo prima di tutto definire la scheda con le voci del questionario, ovvero, per usare la terminologia fin qui usata, definire l'"oggetto scheda" e le sue proprietà (le voci), ovvero definire le proprietà che caratterizzano l'oggetto scheda, cioè che ogni scheda del questionario dovrà contenere. Se qualcuno volesse esercitarsi avrebbe gioco facile: basterebbe riferirsi ai 7 punti precedenti. Altro paio di maniche invece sarebbe esercitarsi a organizzare il programma che dovrà elaborarle, nonostante questo sia u caso estremamente semplice, in quanto ogni voce è indipendente dalle altre. Se parecchie persone vi si cimentassero il risultato sarebbe quello di ottenere tanti programmi diversi quanti fossero quelli che facessero l'esercizio, con relativa babele di approcci, di linguaggi, distinguo, funzioni che sembrerebbero tutte uguali, ma in realtà nella pratica molto piene di errori che sfuggirebbero a un esame superficiale di chi legge ma che prolungherebbero all'infinito la discussione perchè poi ognuno chiederebbe agli altri dove può stare la causa dei suoi errori, cioè perchè il suo programma non funziona. La torre di babele sarebbe notevolmente moltiplicata nel caso più complesso in cui le singole voci fossero interdipendenti le une dalle altre, come potrebbe essere il caso in cui, anzicchè voci di un questionario, le variabili in gioco dipendessero le une dalle altre come un sistema di equazioni o le variabili di una formula fisica. E allora dovreste migrare in massa perchè non se ne potrebbe più di codici, di if, di loop, di costrutti, di parentesi, e relativi dibattiti. Supponiamo infine che prevalga il buon senso e che quindi prima di lanciarsi in esercizi logici e dialettici, si faccia uno sforzo di sintesi e di astrazione, tipo quello che state leggendo e che si faccia prima di impelagarsi, non dopo come questo riassunto. é garantito che la babele sarà molto minore e più breve. Si potrà allora dire che il problema del questionario ai listaioli è stato affrontato con uno stile di programmazione orientato agli oggetti. Come avete potuto vedere in questo riassunto si è parlato di linguaggi di programmazione senza aver avuto bisogno di nominarne neppure uno, e si può continuare senza ricorrere ai costrutti e alla grammatica e sintassi di alcun linguaggio per cominciare a sviluppare il programma. L'esercizio potrebbe essere proprio questo. Chi legge ed è digiuno di queste cose non conosce alcun linguaggio di programmazione, ma conosce l'italiano, la logica e il buon senso, o almeno si spera.Torna all'indice