procedura
procedura in generale il termine è utilizzato come sinonimo di metodo di calcolo, finito e decidibile. In informatica, il termine è utilizzato per indicare un algoritmo attivato da un programma principale per risolvere un particolare sottoproblema: è quindi, come anche si dice, un sottoprogramma. Nella scrittura di un programma nasce molto spesso l’esigenza di scomporre il problema principale, soprattutto se particolarmente complesso, in sottoproblemi parziali più semplici; questi ultimi a loro volta, possono essere di nuovo scomposti in altri ancora più semplici, fino ad arrivare alla più elementare scomposizione possibile; il programma principale risulterà quindi la composizione di svariati sottoprogrammi a esso collegati, secondo una struttura ad albero; questa metodologia di costruzione di un programma viene detta → metodo top-down.
Un sottoprogramma è spesso detto routine; quello di un livello appena inferiore al programma principale prende spesso il nome di routine principale, mentre quelli più interni vengono detti subroutine. Questa denominazione risulta tuttavia artificiosa e dipende dal contesto in cui la si usa: una routine principale è pur sempre una subroutine rispetto al programma principale. Per questo si è soliti più banalmente impiegare la parola subroutine per indicare le routine più brevi, semplici e più frequentemente richiamate da un programma principale. Le subroutine si suddividono in due categorie:
• le funzioni che, richiamate dal programma, modificano lo stato delle variabili a loro riferite come ingresso, fornendo un valore in uscita, generalmente in funzione (da cui il nome) di quello in entrata (→ funzione (in un linguaggio di programmazione));
• le procedure, appunto, che pur modificando le variabili, possono non fornire necessariamente alcun valore in uscita, bensì producono un’azione.
La procedura, così come la funzione, è richiamata dal programma principale, nel punto in cui è inserita, fornendo l’effetto desiderato, secondo la seguente sintassi: nome procedura (lista ordinata delle eventuali variabili). In tutti i linguaggi di programmazione vi sono alcune procedure predefinite, che sono utilizzate come normali istruzioni: per esempio, la procedura ClrScr (clear screen, cioè cancella lo schermo) ha come effetto quello di togliere dallo schermo tutte le informazioni visualizzate. Oltre a utilizzare le procedure predefinite nel linguaggio, il programmatore può costruirne altre che saranno definite nella parte dichiarativa del programma e richiamate e utilizzate nello stesso modo delle istruzioni.
Si supponga, per esempio, di voler scrivere un breve programma che calcoli la radice quadrata di un numero, utilizzando la funzione sqrt definita nel linguaggio. Poiché nell’insieme dei numeri reali non è definita la radice quadrata di un numero negativo, si vuole inserire nel programma una procedura che avverta con un messaggio d’errore nel caso in cui il dato in ingresso sia negativo e che, in tale caso, consideri il valore assoluto del numero (utilizzando la funzione abs). Il programma potrebbe allora essere il seguente:
Per evidenziare che si tratta di un’istruzione di assegnazione si è utilizzato, qui come negli altri lemmi di quest’opera, il simbolo ≔ per distinguerlo dal simbolo di uguaglianza. Tuttavia nella scrittura degli algoritmi in linguaggio di progetto si utilizza una scrittura semiformalizzata e spesso si utilizza il simbolo di uguale per indicare l’→ assegnazione di un valore a una variabile (questa convenzione è utilizzata anche nelle voci di quest’opera, quando vengono descritti algoritmi e procedure). La procedura messaggio, definita dal programmatore è scritta proprio come un vero e proprio programma, essendo composta dall’intestazione e da un blocco di istruzioni comprese tra inizia e finisci. Essa è dichiarata prima della parte esecutiva del programma (qui indicata con {programma principale}), e poi richiamata con il suo nome nel programma stesso, come una semplice istruzione ed è eseguita solo nel momento in cui è richiamata nel programma principale.
Una procedura può anche contenere una lista di variabili in input: viene allora definita come procedura con parametri (o parametrizzata). In molti linguaggi questi sono indicati tra parentesi accanto al nome scelto per la procedura stessa, eventualmente con l’indicazione del tipo a cui essi appartengono; nel richiamare la procedura i parametri saranno indicati tra parentesi nello stesso ordine con cui sono definiti. Non ha invece alcuna importanza il nome simbolico dei parametri poiché, in questo caso, è il valore della variabile che viene trasferito all’interno della procedura. Le variabili dichiarate dal programma principale sono sempre disponibili e riconoscibili ovunque, quindi anche all’interno della procedura: tali variabili prendono il nome di variabili globali; quelle dichiarate all’interno della procedura sono invece attive solo dal momento della chiamata da parte del programma principale fino a quando essa termina: per questo motivo vengono chiamate variabili locali; è possibile però che nella parte dichiarativa della procedura ci siano variabili con lo stesso nome di altre dichiarate nel programma principale; in questo caso afferiscono comunque a una diversa area di memoria, per cui tali variabili non sono sovrapponibili né sostituibili alle prime.
Se, per esempio, si vuole scrivere un programma che sommi, componente per componente, due vettori tridimensionali, il programma principale potrebbe essere il seguente:
Occorre allora definire tre procedure: due di esse (leggivettore e scrivivettore) dipendono da un solo parametro, l’altra (sommavettori) dipende da due parametri. Il programma completo può, quindi, essere (la variabile vett è definita come un array di reali, da cui l’indicazione del tipo di dati):
Quando si richiama una procedura con parametri avviene, quindi, un passaggio di variabili. I linguaggi algoritmici come il C, il Pascal, il Basic che per loro caratteristica utilizzano con frequenza le chiamate di procedura, sono perciò anche detti linguaggi procedurali.