Una breve introduzione all' uso dei template, principalmente per la
programmazione in Assembly.
La "leggibilità" di un programma.
La chiave di una buona programmazione sta nella logica con cui si opera.
E questa si estende oltre quella delle pura sequenza di istruzioni, che
potranno essere ben chiare, in un determinato momento nella mente del
programmatore, ma devono poter assumere una forma fisica per poter essere
maneggiate.
Come esempio possiamo portare un brano musicale: fino a che è nella mente
del compositore, egli lo potrà fischiettare o suonare su uno
strumento, ma diventa una "composizione" solo quando le note sono
tarsferite sul pentagramma, con la struttura adeguata.
E va tenuto ben presente che, se una buona documentazione è indispensabile
perchè altri possano leggere la "composizione", lo è altrettanto
per lo stesso autore. Se è seccante trovare sul WEB un qualche listato, ma
non potersene fare nulla se non copiarlo pedissequamente perchè non si
capisce cosa diavolo ha scritto il programmatore, ancor più frustrante è
il tornare a leggere propri sorgenti scritti tempo addietro e chiedersi
perchè mai erano state inanellate certe sequenze di istruzioni: idea
geniale all' epoca della scrittura, ma, prive di spiegazione, diventate ora
rebus.
Più leggibili sono i programmi, meno tempo si spenderà per seguirne il
percorso logico e quindi per correggerne eventuali errori (debug), che,
altrimenti, una massa confusa di istruzioni renderebbe difficoltoso.
Una scrittura ordinata consente, poi, di recuperare parti del codice e ri
utilizzarle altrove, aggiunge con facilità nuove parti o modificare quelle
esistenti, ecc.
Ci si deve può chiedere che cosa rende un programma più leggibile di un
altro. In sostanza si tratta "semplicemente" della metrica.
E questo non è un valore astratto, tanto che chiunque, anche non
programmatore, riconosce un sorgente ben scritto, quando lo vede.
Se i programmi appaiono come i miei programmi migliori poi sono leggibili,
altrimenti non lo sono." Ovviamente, tale metrica è di poco valore dal
momento che cambia con ogni persona.
Possiamo anche dire che un programma "leggibile" è quello che un
programmatore sufficientemente competente può leggere e comprendere appieno
pur non essendone l' autore.
Purtroppo la cosa non è semplicissima, perchè va ricordato come il
programma non sia solo struttura e formattazione del testo, ma
principalmente struttura logica di istruzioni conseguenti: per questo non è
un eccesso parlare di "arte della programmazione" per intendere la
possibilità di ottenere il risultato voluto nel modo più elegante e
comprensibile. Ben pochi programmi non banali raggiungono questo status e
non molti sono gli esempi utili sul WEB. Comunque, sebbene i programmi
veramente illeggibili esistano, ci sono molti livelli di leggibilità ed è
importante che, per lo meno, ci si renda conto dell' importanza di questo
fattore e si miri in qualche modo al suo raggiungimento.
Un programma leggibile certamente è suddiviso in moduli: questo ne consente
una più facile gestione, comprensione e modifica. E, in particolare, l' uso
di un "modulo", di un "template", può essere un
supporto valido.
Template ?
Scrivendo un sorgente per un compilatore, in qualsiasi
linguaggio, ma ancor più in Assemly, su qualsiasi microcontroller, occorre
mantenere una struttura formale e logica quanti più possibile ordinata:
creare un programma è essenzialmente un processo di logica e solo
secondariamente un uso corretto delle risorse fornite dall' hardware e dall'
ambiente di sviluppo.
E un lavoro "logico" ha anche una "forma" logica, un
ordine e una cadenza sensati. Al limite, può diventare arte.
Se questa norma basilare non viene compresa, ci si può facilmente ritrovare
persi nella mancanza di struttura di quanto scritto e, di conseguenza,
faticare inutilmente nelle fasi di rilettura, verifica, debug di quanto
scritto.
Questo vale per chiunque, ma principalmente per chi inizia a confrontarsi
con la programmazione. In questi casi una qualche giuda è benvenuta e molto
più efficace che l' arrabattarsi da se.
Ci sono molti strumenti che possono venire in aiuto, tra cui ora voglia
evidenziare il "Template".
Template (in francese maquette, traducibile con
mascherina, stampo) è una struttura di base , uno scheletro, una guida, in
cui inserire il proprio programma.
Come dice il nome, ha la una funzione analoga al normografo o alle mascherine
per fare cerchi, ellissi e simboli tecnici che qualcuno ha forse utilizzato a
scuola (prima dei CAD...).
Sostanzialmente
si tratta di una struttura ordinata da replicare all' inizio della
scrittura del sorgente e che sarà via via riempita con le parti di codice
necessarie all' applicazione voluta.
Si
potrebbe obiettare che l' irrigidire in una forma pre definita la scrittura
del sorgente è limitativo, ma non è così. Al bambino che comincia a
scrivere, non viene dato un foglio A0 , ma una pagina con righe, per fornirgli
un supporto alla stesura dei segni. Così una carta quadrettata o
millimetrata non viene certo presa come una limitazione a quanto si potrà
scrivere o disegnare.
Certamente chi "ha una sua mano e sue preferenze", logicamente
derivate dall' esperienza (che non hanno niente a che vedere con idee
preconcette, confuse, disordine e mancanza di chiarezza, ovvero tutti quanto
è non-logico), potrà benissimo fare a meno di un template elementare o
creato da altri, ma proprio perchè in grado di realizzare da sè la
necessaria struttura..
Chi, invece, non ha raggiunto una sufficiente sicurezza, potrà iniziare
appoggiandosi alla carta quadrettata o millimetrata del Template approntato da
altri per poi crearsi un suo metodo e mandare in pensione i template generici;
ma a questo punto si accorgerà che un lavoro "logico" lo porterà
comunque a stendere una struttura "logica".
Chi ritiene che una struttura del genere sia un orpello inutile è il caso che
si faccia un esame di coscienza.
Vediamo qui un esempio di template generico, adattabile ad ogni genere di
processore.
Un Template generico
Abbiamo detto che lo scopo di un template è quello di fornire una guida alla
stesura di un sorgente ordinato e leggibile, completo dei commenti che
potranno essere utili alla rilettura, al debug, all' archiviazione.
Non c'è niente di peggio dei programmini e programmetti che infestano il
web con i loro listati dai quali non si capisce un accidenti di niente e che,
certamente, metterebbero in difficoltà lo stesso malaccorto autore se fosse
costretto a rivederli dopo qualche mese.
I principali problemi sono:
-
mancanza di informazioni su cosa fa il programma e come
-
mancanza di informazioni su come è collegato il microcontroller
-
mancanza di commenti sufficienti a capire cosa si sta facendo in una
determinata linea
-
mancanza di una forma leggibile del testo sorgente
a cui normalmente si aggiungono :
-
mancanza di struttura nel sorgente, dove sono mischiate a caso le
varie aree
-
aggiunta inutile di definizioni che si trovano già negli .inc del
processore
-
uso dissennato di valori assoluti al posto di label
Vediamo un esempio di listato sorgente insensato:
|
manca una qualsiasi intestazione
in cui sia descritto cosa fa il programma |
list
p=16f84 |
|
__CONFIG
0x3FF1 |
il CONFIG così espresso è
incomprensibile se non si consulta il foglio dati del microcontroller |
PORTA equ 05h
TRISA equ 85h
PORTB equ 06h
TRISB equ 86h
option equ 81 |
non ha senso specificare le
assegnazioni di elementi del processore che esistono già meglio
espressi nel file .inc, di cui basta effettuare l' include |
org 0
|
|
bsf 03,5 |
avendo omesso la definizione
STATUS equ 03h si ricorre ad un valore assoluto, che, senza linea di
commento, è a prima vista incomprensibile |
movlw
B'11111111'
movwf TRISA
movlw b'00000000'
movwf TRISB
bcf 03,5
bsf option,7
clrf PORTB
movf PORTA,0
movwf PORTB |
manca qualsiasi linea di commento
che dia una idea di cosa fanno le varie operazioni, sopratutto dove
vengono usati valori assoluti e non label |
goto $-3 |
l' uso di $ non è consigliato |
|
manca la direttiva END di chiusura
della compilazione |
Ma basterà variarne la scrittura per avere una cosa del tutto differente:
; Questo programma copia
lo stato dei pin di PORTA su PORTB
LIST P=16F84A
;definizione del processore usato
#INCLUDE
<P16F84A.INC> ;include delle definizioni
standard
; configuration
; Oscillatore con quarzo a 4 MHz
; Watchdog disabilitato
; PWRTE disabilitato
; Code protection disabilitato
__config _XT_OSC
& _WDT_OFF & _PWRTE _ON & _CP_OFF
org 00
;Inizio - vettore di reset
start
banksel TRISA
; select bank 1
setf TRISA
; all port A input
clrf TRISB
; all port B output
banksel OPTION_REG
; select bank 0
bsf
OPTION_REG,RBPU ; disable weak pull up
clrf PORTB
; azzera uscite
loop:
movf PORTA,w
; copia PORTA su PORTB
movwf PORTB
goto loop
; loop continuo
end
; assembler end
|
Ora la cosa, pur facendo le stesse funzioni della lista precedente, è ben
più chiara e leggibile. E, osserviamo che l' unica precauzione è stata
quella di scrivere il tutto in modo logico e ordinato.
Dunque, se provassimo ad usare un qualche genere di supporto, sopratutto
per cominciare a programmare, ci troveremmo certo meglio.
Il template è proprio come la mascherina del normografo, che, fino a quando
non diventiamo provetti calligrafi, ci aiuta a tracciare lettere quasi
perfette.
Va tenuto ben presente che anche con altri linguaggi, a partire dal
BASIC, ci si imbatte in sorgenti non certo perfetti ed è nota la difficoltà di comprendere un sorgente C non ben
strutturato e anche la possibilità di stendere sorgenti C assolutamente "fuzzy", dei
quali esiste perfino un ambito ludico col premio a chi ha scritto il sorgente
meno comprensibile.
Quindi, l' idea di una struttura "template" è applicabile allo
stesso modo anche per i linguaggi ad alto livello e non solo per l' Assembly.
|