funzione (in un linguaggio di programmazione)
funzione (in un linguaggio di programmazione) parola riservata di un linguaggio di programmazione indicante una particolare procedura operativa, disponibile nel linguaggio stesso, che agendo su una o più variabili del programma produce il loro nuovo valore. Alcune funzioni del linguaggio di programmazione traggono origine dalle comuni funzioni matematiche, anche se, dati i limiti dell’implementazione, possono esserne una restrizione, perché non possono, per esempio, essere definite su tutti i numeri reali, ma solo sui numeri rappresentati nell’elaboratore (→ aritmetica finita (di macchina)). Per esempio, si indica con abs(x) la funzione che calcola il valore assoluto della variabile x, determinando il suo nuovo valore; oppure con sqrt(a) la radice quadrata della variabile a. Altre funzioni agiscono su tipi di dato non numerico, quali per esempio le funzioni booleane o le funzioni che operano con stringhe; per esempio la funzione conc(a, b) dove a e b sono due stringhe, dà come risultato la stringa ottenuta giustapponendo l’una all’altra le due stringhe date. La funzione l (x), dove x è una stringa, è invece una funzione S → N (dall’insieme delle stringhe all’insieme dei numeri naturali) che associa a ogni stringa la sua lunghezza data dal numero di caratteri che la compongono.
Oltre alle funzioni predefinite, il programmatore può costruire all’interno dell’ambiente di calcolo tutte le funzioni utili all’implementazione di un particolare algoritmo. Una funzione, se non è già presente nel linguaggio, ha le seguenti caratteristiche:
• è definita con un nome convenzionale nella sezione dichiarativa del programma;
• è richiamata nel programma principale, dove figura come parte di una istruzione.
Per esempio, si può definire una funzione che dia il segno di ciascun numero reale; essa corrisponde alla seguente funzione matematica definita per casi:
Questa funzione, detta segno, fornisce l’informazione relativa al segno di un qualsiasi numero reale x. Da un punto di vista matematico, sgn è una funzione R → Z, del tipo molti → 1, definita per ogni x reale, e la cui immagine è il sottoinsieme di Z formato dai tre possibili valori che essa assume: {−1, 0, +1}. In tutti i linguaggi di programmazione, il dominio e il codominio della funzione devono essere dichiarati esplicitamente nella sezione dichiarativa del programma. Nell’ambiente di calcolo del computer il dominio di sgn(x) è di tipo real, mentre il codominio è di tipo integer.
Si possono realizzare anche funzioni a n variabili, definite sul prodotto cartesiano di n insiemi, su ciascuno dei quali si può definire un qualsiasi tipo di dato. La funzione ammette in ingresso differenti tipi di dato; in uscita, fornisce uno o più dati, ma di un solo tipo. La dichiarazione preliminare della funzione ha le seguenti caratteristiche:
• il nome della funzione è seguito, tra parentesi, dal nome delle variabili indipendenti e dall’indicazione del tipo di dato cui appartengono la funzione e le singole variabili;
• l’algoritmo che definisce la funzione le assegna il valore calcolato, in modo tale che la funzione stessa diventa a sua volta una variabile.
Una funzione, così come una → procedura, è, quindi, assimilabile a un vero sottoprogramma di un linguaggio strutturato e può essere richiamata più volte nel corso dell’esecuzione del programma principale. Tuttavia, con i termini funzione e procedura si indicano due oggetti algoritmici distinti, le cui differenze sintattiche sono giustificate dal loro diverso utilizzo; in particolare:
• una funzione modifica lo stato di una o più variabili e fornisce sempre uno o più risultati in uscita, in funzione dei valori delle variabili in ingresso;
• la procedura, pur modificando lo stato di una o più variabili, può anche non fornire alcun valore in uscita, ma produrre invece un effetto, un’azione o un cambiamento di stato (come può essere la procedura che effettua la stampa di un documento);
• una funzione richiamata nel programma principale non può essere considerata come una istruzione indipendente, ma è un vero e proprio algoritmo di calcolo utilizzabile all’interno di un’istruzione;
• una procedura può essere scritta come un’istruzione isolata.
Per esempio, la procedura per la stampa può essere scritta come print(a), così indicando che deve essere stampato il contenuto della variabile a su una particolare unità di output del computer.
Una riga di programma contenente soltanto la scrittura sgn(z) viene invece considerata dal compilatore come errore sintattico, perché essa da sola non può costituire un’istruzione. È invece corretto inserire la funzione in una istruzione di assegnazione del tipo:
Per evidenziare che si tratta di un’istruzione di assegnazione si è qui utilizzato 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. L’ordine impartito all’automa esecutore viene interpretato come segue:
1) applica a z l’algoritmo definito dalla funzione sgn;
2) calcola il valore sgn(z);
3) assegna alla variabile a il valore calcolato da sgn(z).
Sul modo di utilizzare le funzioni, è opportuno osservare che:
• se una funzione dipende da più variabili (anche di diverso tipo), i valori sostituiti quando essa è richiamata nel programma principale devono corrispondere nello stesso ordine alle variabili scritte nella definizione;
• quando si richiama una funzione essa va considerata come una comune variabile: può comparire in una istruzione di assegnazione, di lettura, di scrittura, o all’interno di una espressione e può essere modificata più volte nel corso del calcolo, senza contenere l’indicazione delle variabili in ingresso.
Per esempio, se si vuole costruire una funzione che calcoli il fattoriale di un numero naturale, la sequenza delle istruzioni in un linguaggio di progetto può essere la seguente:
La funzione variabile fatt conterrà all’uscita dal ciclo iterativo ripeti ... finché il valore cercato, usualmente indicato con n!. Se successivamente nel programma principale si prevede un’istruzione in cui la variabile reale comb debba calcolare il numero di combinazioni di 5 elementi di classe 2
si potrà dunque scrivere:
È utile osservare che, eseguendo una funzione nel programma principale, l’automa esecutore passa dall’ambiente di calcolo esterno che richiama la funzione a quello interno della funzione, dove organizza le aree di memoria destinate ai parametri, alle variabili locali definite nella funzione e al nome della funzione utilizzata come elemento di comunicazione tra i due ambienti. Sulle modalità in cui può avvenire il passaggio dei valori dal programma principale alla funzione richiamata si veda → procedura.