Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
per capire cosa stiamo facendo e per ritagliarci un angolino nel mondo delle scienze
Viste le definizioni di problema, soluzione e algoritmo vediamo ora come possiamo mettere in condizioni il nostro computer
di aiutarci a risolvere i nostri problemi
La programmazione:
• E` l'attività con cui si predispone l'elaboratore ad eseguire un particolare insieme di azioni su particolari informazioni
(dati), allo scopo di risolvere un certo problema.
Dopo aver costruito l’algoritmo per la soluzione di un determinato problema, si passa alla realizzazione del programma
eseguibile al computer (implementazione).
L’ implementazione che comprende le fasi che vanno dalla codifica (scrittura del codice, riscrittura) dell’algoritmo in un
linguaggio di programmazione (linguaggio per scrivere istruzioni che verranno tradotte -compilate o interpretate- nel
linguaggio macchina eseguibile dal nostro “esecutore” che è il computer) (il risultato di questa fase si chiama genericamente
codice sorgente o listato del programma o semplicemente programma) al completamento del programma, perfettamente
funzionante.
In pratica l’implementazione è la concretizzazione nel programma di una descrizione astratta, l’algoritmo.
È importante che il programma sia corredato da due tipi di documentazione
quella necessaria al suo utilizzo, indirizzata agli utenti utilizzatori del programma applicativo he si sta scrivendo
(documentazione esterna tipicamente la troviamo nei manuali del nostro applicativo) e
quella necessaria a comprendere come il programma è stato realizzato (la sua logica di calcolo) per poter effettuare
successive revisioni manutenzioni nuovi sviluppi (documentazione interna, indirizzata agli sviluppatori di software,
programmatori, chi scrive il codice del programma) questa documentazione in genere viene scritta in forma di commenti al
codice direttamente all’interno del listato del programma, in genere facendola precedere da e o inserendola tra alcuni
caratteri speciali che avvisano il compilatore o l’interprete che ciò che stiamo scrivendo non istruzioni che vanno eseguiti, in
VBA i commenti vengono fatti precedere dal carattere speciale apicetto ‘).
Durante le varie fasi bisogna provvedere al controllo della correttezza (verifica) per assicurarsi che il programma funzioni
correttamente.
Già durante la stesura dell’algoritmo si devono stabilire i casi di prova per la verifica della correttezza e scrivere la
documentazione con le indicazioni per l’utilizzo del programma.
L’implementazione comprende:
La codifica
La codifica dell’algoritmo consiste nella scrittura del programma in un linguaggio di programmazione.
Ogni linguaggio di programmazione impone proprie regole per la codifica del programma.
Alcuni linguaggi sono case sensitive, cioè distinguono tra caratteri maiuscoli e minuscoli mentre altri no.
Per quanto riguarda le istruzioni, se il linguaggio è case sensitive bisogna rispettare le regole imposte cioè la scrittura
corretta per ogni istruzione che potrà contenere lettere maiuscole e/o minuscole, altrimenti l’istruzione non viene
riconosciuta o la sua interpretazione può risultare ambigua; se non è case sensitive è conveniente scrivere tutto in minuscolo;
per quanto riguarda gli identificatori, se il linguaggio è case sensitive un identificatore scritto in minuscolo viene considerato
diverso dallo stesso scritto in maiuscolo; anche se il linguaggio non è case sensitive, conviene comunque adottare una regola e
seguirla sempre per non confondersi; è tendenza comune scrivere gli identificatori in minuscolo; se l’identificatore è una
parola composta, per maggior comprensibilità conviene far iniziare le parole successive con la maiuscola (per esempio
numeroRighe). Il linguaggio VBA non è case sensitive.
Ogni linguaggio usa delle parole riservate e degli identificatori.
Le parole riservate sono parole predefinite del linguaggio che hanno un significato particolare e possono essere usate solo
per lo scopo previsto e non come identificatori che sono tutte le altre parole utilizzate nel programma, tutti i nomi a scelta del
programmatore, per esempio per i nomi delle variabili.
Gli identificatori devono sempre essere diversi dalle parole riservate.
Ogni identificatore inoltre deve essere univoco, cioè deve essere utilizzato per un solo scopo.
Suggerimenti per la codifica:
Oltre alle regole di codifica imposte dal linguaggio adottato, è bene seguire anche alcune altre semplici regole, che, pur non
essendo obbligatorie, permettono di semplificare la lettura e comprensione del codice, di cosa esso effettivamente fa della sua
esecuzione;
per esempio:
scegliere nomi significativi per tutti gli identificatori (variabili, procedure ecc.), in modo che il nome ne ricordi e spieghi l’uso;
scrivere le istruzioni con il metodo dell’indentazione in modo da evidenziare le strutture di controllo del flusso del
programma e i vari blocchi di istruzioni.
Le strutture di controllo del flusso si identificano nelle istruzioni per il controllo del flusso che corrisponde alla sequenza di
esecuzione delle istruzioni, ad esempio istruzioni di ciclo - loop - WHILE o istruzioni condizionali IF THEN ELSE , i blocchi di
istruzioni detti anche corpi o istruzioni composte sono insiemi di più istruzioni semplici visti come un’unica istruzione.
Ebcdic, Ascii: sono due diversi codici per la codifica di caratteri, ad ogni carattere alfanumerico o simbolo rappresentabile è
associato un particolare numero compreso tra 0 e 255. Il codice Ascii in genere è usato nei personal computer, il codice
Ebcdic nei mainframe computer più grandi
Prima di passare alle fasi successive dell’implementazione trattiamo alcuni concetti relativi ai linguaggi di programmazione.
Abbiamo detto che un programma non è altro che un algoritmo codificato in un linguaggio di programmazione.
Ma quale linguaggio scegliere per la codifica di un algoritmo?
Il linguaggio naturale sarebbe facilmente comprensibile ma non è eseguibile da una macchina.
Il linguaggio macchina è eseguibile ma di difficile comprensione.
Il linguaggio naturale e il linguaggio macchina si collocano in posizioni opposte, soddisfacendo uno solo dei requisiti.
I linguaggi di programmazione ad alto livello sono progettati proprio per colmare tale divario.
Sono linguaggi adatti a implementare algoritmi pur rimanendo comprensibili all’uomo.
La fatica di tradurre un programma nel linguaggio macchina è affidata a particolari programmi, i compilatori, che traducono
programmi scritti nel linguaggio di più alto livello in programmi equivalenti nel linguaggio macchina, oppure agli interpreti.
Il linguaggio macchina dipende dall'architettura hardware del computer (dalla macchina appunto). Varia a seconda del
processore. Un programma scritto in linguaggio macchina per un'architettura, non funziona in un'altra architettura. Per
funzionare il programma deve essere riscritto ex novo. Invece se per scrivere il nostro programma usiamo un linguaggio ad
alto livello, ci basterà compilarlo con il compilatore adatto alla macchina che abbiamo, per poterlo eseguire su di essa,
lasciando inalterato il codice sorgente (almeno per un ottima percentuale del codice).
Il linguaggio macchina (o codice macchina) è il linguaggio in cui sono scritti i programmi direttamente eseguibili per
computer: può venire classificato come linguaggio di programmazione, sebbene quest'ultima espressione sia più spesso
riservata per indicare i linguaggi di alto livello con cui si scrivono programmi non direttamente eseguibili, ma che richiedono
una traduzione in linguaggio macchina. Il computer riesce a capire due soli stati 0 e 1 non passa corrente o passa corrente,
essendo costituito da circuiti elettronici. Quindi il linguaggio macchina è basato su un alfabeto detto binario in quanto
comprende due soli simboli, generalmente indicati con 0 e 1: un simbolo di questo alfabeto viene detto bit.
Dobbiamo sottolineare che questo comunque non è limitativo perché accorpando piu bit in sequenza possiamo codificare
qualsiasi informazione vogliamo, basterà allungare a seconda della necessità la sequenza di bit che useremo.
Il processore o CPU è quella componente hardware di un computer che è in grado di eseguire i programmi scritti in
linguaggio macchina. In altre parole in linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un
processore è in grado di compiere (instruction set) in cui i codici di programmi da eseguire devono essere tradotti.
Uno dei punto di forza del linguaggio macchina è sicuramente la velocità di esecuzione del programma. Il processore legge ed
esegue i comandi. Non deve perdere tempo a interpretarli. D'altra parte, essendo scritto in linguaggio binario, il codice
macchina è decisamente poco comprensibile per l'uomo. Ecco un esempio pratico di codice macchina:
Addirittura agli albori della programmazione questo codice si concretizzava in una o più schede perforate (0,1).
Per programmare in linguaggio macchina bisogna conoscere i registri del processore, il funzionamento dei comandi di basso
livello, l'hardware del processore, ecc. Soltanto i programmatori più esperti hanno le conoscenze per farlo.
Le istruzioni del linguaggio macchina sono istruzioni minimali e a bassissimo livello, agendo su componenti direttamente
collegabili all’hardware appunto come i registri, che fanno operazioni molto semplici, per cui scrivere direttamente un
programma in linguaggio macchina risulta assai difficile e complesso, anche per scrivere un programma che fa relativamente
poco occorrono molte righe di codice.
I linguaggi naturali non sono altro che quelli che usiamo normalmente come l’italiano, l’inglese etc…
Per definire un linguaggio naturale si parte dalla definizione di un alfabeto
Ad esempio in italiano ci sono 21 lettere, in inglese 26, . . .
Con i caratteri dell’alfabeto possiamo formare un insieme di sequenze, dette parole
Non tutte le sequenze sono parole del linguaggio naturale
La grammatica del linguaggio fornisce le regole per decidere quali sequenze sono parole del linguaggio
parole corrette grammaticalmente
Con le parole, corrette, possiamo formare un insieme di parole, dette frasi
Non tutte le sequenze sono frasi del linguaggio naturale
La sintassi del linguaggio fornisce le regole per decidere quali sequenze sono frasi del linguaggio frasi corrette
sintatticamente, o sintatticamente ben formate
In italiano la regola base della sintassi dice che le frasi sono costruire con sequenze di parole che seguono la struttura
soggetto verbo complemento
soggetto, verbo e complemento non sono altro che dei nomi, cioè denotano, alcuni particolari e ben precisi sottoinsiemi
dell’insieme di tutte le parole del linguaggio
ad esempio la sequenza di parole il lo la non è quindi una frase della lingua italiana
ad esempio la sequenza di parole gatto mangia topo è una frase della lingua italiana, ovvero è sintatticamente ben formata
Solo alcune delle frasi del linguaggio, cioè di quelle ben formate sono anche valide, cioè hanno un significato
La semantica del linguaggio stabilisce quali tra le frasi ben formate sono anche valide e quindi si occupa dell’interpretazione
(del significato) delle frasi ad esempio la frase il gatto mangia il topo è una frase ben formata che è anche valida, cioè ha un
significato
La sintassi di un linguaggio si occupa della forma delle frasi del linguaggio, ovvero delle regole che permettono di costruire
frasi ben formate del linguaggio
La semantica di un linguaggio si occupa dell’interpretazione del linguaggio, ovvero del significato delle frasi corrette
sintatticamente
Esempio di frasi corrette sintatticamente in italiano, ma non tutte valide dal punto di vista del significato (prive di significato)
il gatto mangia il topo
il topo mangia il monte
Ricordiamo anche che usando un qualsiasi linguaggio (naturale o di programmazione) possiamo formare una frase corretta
sintatticamente e che ha anche un significato ma che però non corrisponde a ciò che volevamo dire come nell’esempio del bar
di Parigi e del budino.
Come i linguaggi naturali anche i linguaggi di programmazione seguono le proprie regole di sintassi e semantica solo in
maniera più rigida, siamo obbligati a rispettarle molto attentamente se no il compilatore non compila o il pc non esegue
correttamente e o come vorremmo il nostro programma. Il computer è molto rigido da questo punto di vista: o scriviamo le
cose come vogliono queste regole o se no non riusciamo a far girare i nostri programmi dobbiamo scrivere le cose con la
massima precisione, basta sbagliare una virgola e il pc non capisce e non dico virgola a caso, basta infatti omettere un punto e
virgola (che in alcuni linguaggi fa da separatore per le istruzioni) perché il compilatore non capisca e ci segnali errore.
Quando usiamo il linguaggio naturale, avendo in genere come interlocutore un uomo invece che una macchina, l'altro
interlocutore con il suo cervello riesce a correggere alcuni errori che facciamo parlando o scrivendo e capisce lo stesso (anche
se rischio ambiguità potrebbe capire male consigliabile utilizzare i feedback), il computer o macchina calcolatrice che in
genere usiamo noi (senza entrare nel campo dell’ intelligenza artificiale) non è in grado di fare questo passaggio di correzione
automatica e quindi la vita tra interlocutori umani è più semplice anche se forse più rischiosa nel generare malintesi, perché
alla fine possiamo permetterci (come normalmente in effetti facciamo di dire o scrivere cavolate non rispettando sintassi o
semantica e il nostro interlocutore correggerà mentalmente tali errori e capirà (speriamo) bene mentre quando gli
interlocutori sono programmatore e macchina le regole vanno rispettate precisamente bisogna rispettare il formalismo
dettato dalle regole se no la macchina non fa nulla o non fa ciò che vogliamo.
Possiamo quindi riassumere le tipologie di errori che dovremo eliminare dai nostri programmi:
errori sintattici (di sintassi) segnalati in fase di compilazione (o di scrittura del codice se il linguaggio è interpretato)
questi errori non ci permettono di eseguire il programma ci bloccano in fase di compilazione o scrittura/interpretazione
errori semantici (di semantica) che si verificano durante l’esecuzione del nostro programma (a run time), anche se il
programma è corretto sintatticamente in quanto la compilazione ha dato ok o l’interprete non ci ha segnalato errori in fase di
scrittura del codice possiamo avere due tipi di errori semantici:
quelli dovuti al fatto cha abbiamo scritto qualcosa che ha un significato però diverso da quello che volevamo scrivere cioè
abbiamo implementato una logica diversa da quella voluta, in tal caso il programma viene eseguito correttamente arriva alla
sua naturale conclusione ma da risultato inatteso diverso dal voluto oppure
quelli per cui il programma in fase di esecuzione non si conclude normalmente, non arriva alla fine naturalmente prevista nel
flusso delle istruzioni ma si interrompe in modo anomalo in tal caso abbiamo scritto un programma corretto sintatticamente
ma privo di significato.
Ritornando a quanto detto sopra riguardo al budino di riso e al caffè appare ora chiaro che possiamo distinguere ancora due
tipi di errori semantici (di significato o logici)
uno che si verifica quando la frase è sintatticamente corretta ma non esprime quello che volevamo esprimere (dunque
possiamo eseguire il programma che arriva alla sua naturale conclusione ma fa una cosa diversa da quella che volevamo)
il programma ha significato è calcolabile ma c’è un errore di significato (semantico) in relazione a ciò che volevamo
esprimere. (significato/logica di calcolo diversi da quanto voluto)
un altro che invece si verifica quando la frase non ha proprio significato il programma non può calcolare quello che gli
chiediamo di calcolare (quando il nostro programma genera un errore e non arriva alla terminazione della sua elaborazione
come quando scriviamo un ciclo per cui non si verifica mai la condizione di uscita dal ciclo per cui va in loop oppure quando si
va con le nostre istruzioni a sporcare un’area di memoria protetta). (privo di significato logica errata dal punto di vista del
calcolo, funzione non calcolabile, il programma non può eseguire il calcolo e si interrompe in modo anomalo).
Sottolineiamo un po' il collegamento che esiste nel campo dei linguaggi di programmazione tra i concetti di semantica
significato funzione programma calcolabilità logica e matematica.
Intanto abbiamo già visto come un programma riceve dei dati in input (dati noti) e restituisce dei dati in output (dati che in
qualche modo rappresentano il risultato, la soluzione al nostro problema) dunque è assimilabile ad una funzione e come essa
si può calcolare. Pensiamo ad una funzione algebrica ad esempio 3x +1, dalle nostre nozioni di matematica sappiamo che tale
funzione è sempre calcolabile per ogni x, e diciamo che ha sempre significato (avere significato corrisponde ad essere
calcolabile) mentre la funzione (4x+4)/x diciamo che non ha significato o equivalentemente non è calcolabile (non si può
calcolare il risultato di questa espressione) per x=0. La semantica, che è definita come la scienza dei significati, applicata ai
programmi studia il significato dei programmi, bene il significato dei programmi è definito proprio come il risultato (calcolo)
che essi producono con il loro calcolo, un programma con un errore semantico (si può compilare e eseguire) ma genera o una
situazione di impossibilita di calcolo (mancanza di significato del programma), crash del programma che non termina
secondo la conclusione naturale del flusso di istruzioni definito dell'algoritmo oppure termina secondo tale flusso ma da un
risultato diverso dall'atteso, cioè il significato del programma che abbiamo scritto ed eseguito è diverso da quello del
programma che avremmo voluto scrivere e soprattutto eseguire.
Gli errori logici di questo secondo tipo, se non intercettati nella fase di test, una volta in produzione sono molto insidiosi
perché apparentemente tutto funziona bene, il nostro programma arriva alla fine naturale, prevista dal nostro flusso
(sequenza) di istruzioni ma ha prodotto un risultato diverso dal voluto stiamo facendo nella realtà della produzione degli
errori nascosti, delle cose non volute, ad esempio se il programma aggiorna i saldi dei conti correnti avremo clienti contenti,
quelli per cui il saldo aumenta anche se non dovrebbe visti i movimenti di conto e clienti scontenti quelli per cui il saldo
diminuisce anche se non dovrebbe visti i movimenti di conto, quelli scontenti ci faranno reclamo e ci allerteranno circa
l’errore ma se abbiamo solo errori che rendono contenti i clienti questi o scappano e cosi ci fanno capire che c’è qualcosa che
non va o non ci avvisano e noi perdiamo soldi. Le cose che dobbiamo fare per prevenire questi errori insidiosissimi è studiare
bene la logica risolutiva dell’algoritmo, tradurla attentamente nel linguaggio di programmazione, testare testare testare il
nostro programma in ambiente di prova, fare anche prove in ambiente di produzione dove e come possibile e verificare che in
tutti i casi provati il nostro programma genera sempre e solo i risultati attesi voluti.
Si chiama anche Sistema di Elaborazione perché costituito da varie Risorse classificabili principalmente in:
Hardware e Software
Il termine hardware (ferraglia) indica tutte le componenti fisiche ed elettroniche di un computer, che possono essere toccate
con mano.
Come collaborano ora le due componenti hardware e software per risolvere i nostri problemi:
semplicemente i nostri programmi in linguaggio ad alto livello inizialmente contenuti nella memoria di massa più grande ma
ad accesso più lento rispetto alla RAM, tramite il traduttore (compilatore/interprete) vengono tradotti in linguaggio
macchina (in istruzioni eseguibili dal nostro processore) quindi tali istruzioni vengono caricate un po' alla volta nella
memoria centrale più piccola ma più veloce della memoria di massa e vengono eseguite dal processore.