La automazione
Dalle macchine semplici alle macchine programmabili
Scheda 3
Il calcolatore
1. Dalla calcolatrice al calcolatore
2. Ambienti di programmazione
3. Automatizziamo qualche procedimento di calcolo in JavaScript
4. Ancora due esempi in JS (approfondimenti)
5. Esercizi
Sintesi
1. Dalla calcolatrice al calcolatore
Alle calcolatrici non programmabili possiamo far eseguire solo singole operazioni di:
• addizione, moltiplicazione, … ,
• calcolo di altre funzioni il cui programma è stato incorporato dal costruttore,
• immagazzinamento o estrazione di dati dalla memoria-utente.
A un calcolatore (o computer o macchina calcolatrice programmabile) possiamo far gestire l'esecuzione di un generico algoritmo che gli possiamo descrivere.
Consideriamo ad esempio il calcolo della ripartizione percentuale di una serie di dati. Usando una CT possiamo procedere in questo modo:
(1) batto 100 | |
(2) batto (1.1) | |
(3) batto totale | |
(4) batto | faccio calcolare il fattore di proporzionalità per cui moltiplicare i dati |
(5) batto ( o o ) | lo faccio mettere nella memoria |
(6) batto dato | |
(7) batto | |
(8) batto ( o ) | |
(9) batto | faccio calcolare il fattore la percentuale di dato rispetto a totale |
(10) ritorno a (6) |
Come si vede, è l'utente che deve gestire l'esecuzione dell'algoritmo (1.1), cioè comandare alla CT man mano quale operazione compiere.
I calcolatori sono invece in grado di "leggere" e tradurre automaticamente in una sequenza di operazioni-macchina (calcoli, memorizzazioni, …) un programma che illustri l'intero procedimento, cioè una descrizione dell'algoritmo (1.1) fatta in un opportuno linguaggio "comprensibile" dal calcolatore.
Molti computer tascabili (o pocket computer) e tutti i calcolatori di maggiori dimensioni sono in grado di eseguire il seguente programma (1.2) scritto in linguaggio Basic:
(1.2) |
10 INPUT T 20 K=100/T 30 INPUT D 40 PRINT D*K 50 GOTO 30 |
l'utente deve battere totale
l'utente deve battere dato |
È facile comprendere il significato di questo programma, che ha la forma di una sequenza di istruzioni numerate. PRINT in inglese significa "stampa"; GOTO deriva dall'inglese "go to", che significa "vai a". La parola "input", che abbiamo già usato, indica qualcosa che entra in una macchina (energia, informazioni, …); in questo caso INPUT viene usato per dire al calcolatore di attendere che l'utente batta un numero. Se non hai idea di come funzioni il programma puoi cliccare qui.
Per poter eseguire un
programma come (1.2), il computer deve essere in grado di memorizzare
il testo del programma, cioè,
nel caso di (1.2), la seguente sequenza di caratteri, dove con "◊"
e
10◊INPUT◊T20◊K=100/T30◊INPUT◊D40◊PRINT◊D*K50◊GOTO◊30
Come le usuali CT memorizzano i numeri sotto forma di sequenze di bit, così un computer memorizza sotto forma di una sequenza di bit anche il testo del programma, utilizzando uno specifico codice.
Deve, inoltre, essere in grado di leggere (la sequenza di bit con cui ha codificato) il programma e decidere, man mano, quale operazione eseguire: una memorizzazione, un richiamo dalla memoria, un calcolo o una visualizzazione (operazioni che nelle CT non programmabili vengono comandate direttamente da tastiera), o un trasferimento dell'esecuzione a un altro punto del programma.
Per fare tutto ciò il computer deve avere:
• un
"programma incorporato" per codificare il "programma battuto dall'utente",
• un
dispositivo di memorizzazione in cui registrare il il programma codificato,
• un certo numero di
memorie-utente da associare alle variabili (T, K, D,
) e
• un
ulteriore "programma incorporato" per tradurre
il programma codificato nell'azionamento dei vari
dispositivi di calcolo, memorizzazione, … .
Il Basic risale al 1964. Esistono linguaggi di programmazione più sofisticati. Sotto a sinistra, si vede come il programma (1.2) può essere riscritto usando il QBasic.. A destra è presentata una stesura del programma in un altro linguaggio, una versione di Pascal (il nome, Pascal, deriva da quello del famoso filosofo e scienziato francese - vedi - che, nella prima metà del 1600, inventò una delle prime calcolatrici da tavolo, per fare addizioni e sottrazioni).
(1.3) |
|
|
Esistono, infine, linguaggi di programmazione incorporati in tutti i
browser. Con essi sono redatti i programmi che
usiamo per cercare l'orario di un treno, prenotare un posto al cinema,
.
Uno dei più usati tra essi è JavaScript (in breve, JS). Il programma
precedente assume la forma a cui puoi accedere da qui,
visualizzata a lato.
Questo è quanto vede l'utente, per calcolare |
Sotto è illustrato come è stato realizzato il programma, che potete visualizzare usando un opportuno comando del browser ("visualizza sorgente pagina", "html", o altro, a seconda del browser che state impiegando).
<head> <script language="javascript"> function Calc() {document.C.r.value = Number(document.C.d.value)*100/Number(document.C.t.value)} </script> </head> (1.4) <center>Metti gli input nelle prime due caselle e clicca<br> <form name="C"> totale <input type="text" name="t" value="0" size=24> dato <input type="text" name="d" value="0" size=24> <input type="button" name="pulsante" value="%" onClick="Calc()"><br> percentuale = <input type="text" name="r" value="0" size=24> </form> </center> |
Potete provare ad usare il programma (e ad esplorarne la struttura). Più avanti vi sarà spiegato come usare questo semplice e comodo linguaggio di programmazione.
2. Ambienti di programmazione
Un computer è in grado di tradurre in operazioni-macchina un programma scritto in un qualunque linguaggio di programmazione, a patto che gli venga fornito in "input" anche un opportuno programma traduttore. La CPU di un computer può eseguire direttamente solo un programma che le arrivi sotto forma di una sequenza di bit che, a gruppi, rappresentino direttamente le operazioni-macchina da effettuare.
Il linguaggio
(che ha come alfabeto i simboli 0 e 1) in cui sono scritti questi programmi
è detto linguaggio macchina.
I linguaggi di programmazione evoluti (come quelli
usati sopra)
non descrivono direttamente singole operazioni-macchina, ma,
come abbiamo visto, impartiscono comandi più sofisticati (a cui corrispondono più comandi del linguaggio-macchina), usano come caratteri quasi tutti i simboli della tastiera e indicano i comandi con nomi che ne richiamano il significato; per questo vengono detti
linguaggi evoluti (o di alto livello).
Per usarli il computer deve essere dotato di
un ambiente di programmazione, cioè un programma che contiene come sottoprogrammi:
un programma redattore
(editor) per registrare i caratteri battuti dall'utente;
in genere è presente anche un help che richiama uso e significato dei comandi, propone esempi,
.
Un editor è una applicazione per
leggere/elaborare testi (come NotePad/BloccoNote in Windows) che
registra i documenti codificando i vari caratteri (lettere, cifre, virgole, spazi bianchi, e altri simboli) attraverso byte, ossia sequenze di 8 bit (i caratteri codificabili in questo modo sono 256; infatti le diverse sequenze di 8 cifre che riesco a costruire con 0 e 1 sono
2·2·2·2·2·2·2·2 =
256). Il codice impiegato è chiamato ASCII (pronuncia: aski).
Ad esempio "P" è codificato con 01010000, l'"a capo" con 00001101.
un
programma traduttore per tradurre il programma in linguaggio evoluto
in una sequenza di bit che sia la versione in linguaggio macchina del
programma.
Ecco come viene trasformata da un programma taduttore l'assegnazione (scritta in un linguaggio Basic) corrispondente alla formula a fianco: |
3 2 ·-x w = + x·5 9 - 1 |
ASSEGNAZIONE: W = (2^3*-X)/(9-1)+X*5 variabili->REGISTRI: R0 = (2^3*-R1)/(9-1)+R1*5 + Traduzione in _________/ \_________ istruzioni elementari: / * R2 = 2 ^ 3 _____/ \_____ ____/ \____ R3 = - R1 * - X 5 R4 = R2 * R3 __/ \__ __/ \__ R5 = 9 - 1 ^ - 9 1 Grafo ad albero R6 = R4 / R5 / \ | corrispondente R7 = R1 * 5 2 3 X R0 = R6 + R7 |
Ecco i passaggi con cui da tale grafo si può risalire alla scrittura nel linguaggio di programmazione, partendo dai nodi a sinistra in basso:
2^3 → 2^3*x → (2^3*x)/(9-1) → (2^3*x)/(9-1)+x*5
|
(a) Scrivi un'assegnazione che corrisponda alla
seguente sequenza di assegnazioni elementari: R2 = 1/3 R3 = R1^R2 R0 = R3+R1 (b) Scrivi le assegnazioni elementari e traccia il grafo che corrispondono alla assegnazione |
In un ambiente di programmazione la
traduzione in linguaggio macchina può essere avviata operando con il mouse
o premendo una opportuna combinazione di tasti. La nuova versione viene memorizzata
temporaneamente; quando l'esecuzione finisce essa viene persa. Questo è, per
esempio, quanto accade con il JavaScript.
In altri casi la traduzione in linguaggio macchina
viene memorizzata (in un file eseguibile)
e può essere avviata successivamente, anche al di fuori
dell'ambiente di programmazione.
Questo tipo di traduzione viene detta compilazione.
Ad esempio in Windows tutti i file con estensione EXE sono dei programmi compilati.
Nello
stendere un programma in un linguaggio evoluto dobbiamo tener presenti
delle regole di scrittura che garantiscano che il testo battuto sia
effettivamente traducibile in linguaggio macchina. L'insieme di
queste regole di scrittura viene detto sintassi.
Anche
nella lingua naturale esistono delle regole sintattiche. Ad esempio
uno dei modi in cui si può comporre una frase in italiano
è: articolo+nome+verbo dove articolo,
nome e verbo devono essere raccordati in numero
(sing./plu.) e, eventualmente, in genere (m/f), e rispettare
altre eventuali condizioni (es.: davanti ai nomi maschili singolari se
iniziano con z, x, gn, pn, ps, s
seguita da consonante o i seguita da vocale si può mettere
uno non un; negli altri casi si può mettere un,
non uno). Ma si tratta di regole che spesso presentano eccezioni e su cui spesso
esistono opinioni contrastanti (ad es.qualcuno sostiene che davanti a
pn - pneumatico, pneumotorace,
- occorre, o si può,
usare un). In realtà non si tratta di "regole" ma di modelli che usiamo per orientarci nella
produzione/interpretazione dei messaggi verbali.
Poi,
anche se ci esprimiamo in modo un po' sgrammaticato, in genere ci
capiamo allo stesso (di fronte al cartello «attendi - lo cane
morzica» non abbiamo difficoltà a interpretarlo come
«Attenti: il cane morsica»).
Nel
caso dei linguaggi di programmazione le regole sintattiche sono invece
definite senza ambiguità ed eccezioni (per questo si parla di
linguaggi formali) e devono essere rispettate
rigorosamente. L'help indica le regole da rispettare per costruire
i programmi. Ad es. le seguenti istruzioni dei programmi del 1º
paragrafo:
k = 100/Tot document.C.r.value = Number(document.C.d.value)*100/Number(document.C.t.value) k := 100/Tot
sono tutte assegnazioni, che secondo i rispettivi help
debbono avere nei primi due casi
la forma
variable = expression
variable := expression
In altri linguaggi le assegnazioni debbono avere forme diverse:
variable <− expression
variable << expression
set variable = expression
variable : expression
3. Automatizziamo qualche procedimento di calcolo in JavaScript
Vediamo ora qualche semplice programma realizzato in JavaScript.
Incominciamo da quello considerato alla fine di §1, di cui abbiamo già
riportato un esempio d'uso e il testo. Ha
la struttura di una pagina Web: è un documento in HTML
(hypertext markup language: linguaggio per contrassegnare ipertesti).
Abbiamo visto come esso appare visualizzato da un browser (applicazione
per interpretare i documenti Html) e ne abbiamo visto il documento "sorgente",
cioè il testo (redatto con un qualunque editor) comprendente il contenuto verbale
del documento e i tag (contrassegni), ossia i comandi racchiusi tra parentesi angolari
(< e >) che contengono indicazioni sui formati in cui visualizzare il contenuto
verbale, le eventuali immagini da inserire, i collegamenti ad altri documenti,
,
e indicano le azioni da eseguire, descritte tra i comandi "script".
I tag "head" ("intestazione"),
La parte del documento organizzata in caselle (modulo) è tra i tag "form"; forma un oggetto (ossia un componente) a cui, con la proprietà name è dato nome "C". Le caselle sono dei sotto-oggetti del modulo specificati con i tag "input"; a ciascuna viene dato un nome (t, d, pulsante, r) ed altre proprietà: a tre, specificate come "type" text, è assegnata "size" (dimensione) 24 (sono delle celle che possono accogliere 24 caratteri); sull'altra casella, specificata come "type" button, torniamo tra poco; "value" assegna un eventuale valore iniziale agli oggetti precedenti; nel caso del "bottone" si tratta del nome che apparirà su di esso.
Nel caso del sotto-oggetto
di tipo "button" l'attributo "onClick" specifica che se si verifica l'evento "pulsante
cliccato" viene avviata l'azione (o metodo) "Calc()"
descritta dalla omonima function (così
in Javascript vegono chiamati i sottoprogrammi).
Il programma in senso stretto è racchiuso tra i comandi
"script" (che in questo caso è descritto non nel corpo della pagina-web, ma nella intestazione)
ed è costituito
solamente dalla function Calc().
Il contenuto della function è delimitato da "{" e "}",
e in questo è contenuto da una sola assegnazione.
Essa legge i contenuti (ossia i valori: value) delle caselle
di nome "d" e "t" del modulo di nome "C" e calcola il valore da mettere nella casella "r". Nelle assegnazioni
è presente document: in questo modo viene indicata la pagina web attualmente visualizzata. In breve:
document.C.d.value indica la proprietà "value" della proprietà (o sotto-oggetto)
"d" della proprietà (o sotto-oggetto) "C" dell'oggetto "document".
Number serve per specificare che gli oggetti contenuti nelle caselle sono
da intendere come "numeri", non come "testi": la somma di 3 e 4 viene intesa, altrimenti,
come 34 invece che come 7.
Ricordiamo, infine, che nelle istruzioni di JS lettere diverse solo
per la dimensione (come "a" e "A") sono considerate diverse.
Vediamo alcuni esempi di programmi in JS.
• Se provi a cliccare qui
si avvia la calcolatrice, di cui a lato è illustrato un possibile funzionamento:
metto 3 e 4 nelle caselle di input, scelgo la divisione e nella casella di output
ottengo il risulato 0.75.
Nelle quattro caselle in basso posso copiare e incollare input o output dalle
caselle precedenti. La struttura di questo documento, sotto riprodotto, è simile a quella del documento precedente: − ci sono quattro bottoni che comandano quattro diversi sottoprogrammi ("function"); − in fondo sono aggiunte quattro caselle in cui si possono copiare i valori, ma che non sono richiamate da altri punti del programma. |
• Cliccando qui
viene avviato un programma per calcolare la somma e la media di una quantità qualunque di dati:
l'utente batte un dato, clicca "+" e, automaticamente, vengono aggiornati i valori del
"contatore", della "somma" e della "media". Il bottone "azzera" annulla i valori introdotti. Si noti che la media, nel caso esemplificato, viene visualizzata come 13.3 34 invece che come 13.3 33: i calcoli vengono effettuati in base 2 e, come vedrai meglio più avanti, l'ultima cifra, nel caso di un risultato approssimato, può differire dal valore corretto. |
4. Ancora due esempi in JS (approfondimenti)
source("http://macosa.dima.unige.it/r.R") divisors(1580) # 1 2 4 5 10 20 79 158 316 395 790 1580
Ancora due esempi in JavaScript. • Il comando in R sopra riportato consente di trovare tutti i numeri interi positivi per cui è divisibile un dato numero intero positivo (1580 nel caso esemplificato). Il programmino in JS a cui accedi da qui consente di fare la stessa cosa. A destra ne è illustrato un esempio d'uso. |
| Trova i numeri primi per cui sono divisibili 12345678 e 123456789. |
• Provate ad eseguire
lo script illustrato a lato, relativo al
"gioco del 3k+1",
a cui potete accedere da
qui,
per rendervene conto. Il gioco è spiegato nello script stesso.
Esso termina quando si arriva ad 1. Si arriva sempre ad 1 o ci sono numeri a partire dai quali il gioco non termina? Provate! |
| Vi sono input minori di 31 che danno un output maggiore di 106? |
Se volete approfondire le conoscenze su JavaScript, cliccate qui
5. Esercizi
|
Abbiamo descritto una funzione H nel modo indicato a lato.
Cerca di descrivere | 2 + 3x 5 H(x) = 3 + - 7 -2x |
|
Scrivi il termine rappresentato dal grafo ad albero seguente sia in una scrittura
"a più piani" che in una scrittura "ad 1 piano" (qui RAD indica la radice quadrata).
|
|
Qui trovi l'algoritmo per R che corrisponde al programma (1.3) per il QBasic.
Prova ad eseguirlo. |
|
A lato è illustrato come si può trovare la lunghezza dell'ipotenusa di
un triangolo rettangolo note le lunghezze dei cateti (teorema di Pitagora). In questo modo possiamo
determinare la distanza di un punto Se non disponessi di un tale programma potresti realizzare un programmino in JS che si comporti nel modo esemplificato sotto a destra. Fallo. |
d(x,y) <- sqrt(x^2+y^2) d(1,1) 1.414214 d(1,2) 2.236068 d(sqrt(2),sqrt(2)) 2 d(-2,-2) 2.828427 |
1) Segna con l'evidenziatore, nelle parti della scheda indicate, frasi e/o formule che descrivono il significato dei seguenti termini: programma traduttore (§2), sintassi (§2), tag (§3), form (§3). 2) Su un foglio da "quadernone", nella prima facciata, esemplifica l'uso di ciascuno dei concetti sopra elencati mediante una frase in cui esso venga impiegato. 3) Nella seconda facciata riassumi in modo discorsivo (senza formule, come in una descrizione "al telefono") il contenuto della scheda (non fare un elenco di argomenti, ma cerca di far capire il "filo del discorso"). |