Funzione (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Elisione obbligatoria
Riga 18:
 
== Funzionamento ==
Quasi tutti i [[linguaggio di programmazione|linguaggi di programmazione]] supportano le funzioni, fornendo una propria sintassi per '''definire''' una funzione, ovvero scriverne il codice, ede una per richiederne l'esecuzione ('''invocazione''' o '''chiamata''' della funzione).
 
In generale la sintassi comune della definizione di una funzione prevede:
* un identificativo o '''nome''';
* per [[Tipizzazione forte|linguaggi tipizzati]] un '''[[tipo di ritorno]]''' ovvero una specifica sul [[tipo di dato]] che essa restituirà in output all'utente o ad altre funzioni che la invocano; quando una funzione non restituisce nulla (es. funzioni con tipo retituitorestituito ''void'') la funzione avrà svolto altre elaborazioni agendo ad esempio sullo stato delle [[variabile (informatica)|variabili]] del programma o visualizzando a video qualcosa senza restituire nulla. In linguaggi non tipizzati o a [[tipizzazione debole]] invece non è presente il tipo di ritorno.
* la specifica (non sempre necessaria) dei cosiddetti '''[[Parametro (programmazione)|parametri]]''' o ''operandi'' i cui valori saranno poi passati in fase di invocazione e su cui la funzione opererà in fase di elaborazione; anche in assenza di parametri il corpo della funzione potrà svolgere la sua elaborazione con altre istruzioni ad esempio agendo sullo stato delle variabili del programma o visualizzando a video qualcosa.
* il '''corpo''' della funzione ovvero il nucleo dell'elaborazione costituita dal blocco, opportunamente delimitato, di una o più istruzioni, ciascuna terminata dal comando di terminazione, [[iterazione|cicli iterativi]], [[selezione (informatica)|strutture condizionali]] ecc., il tutto concluso con la variabile eventualmente ritornata in output. Variabili definite nel blocco saranno necessariamente variabili locali cioè con visibilità solo all'interno del blocco stesso.
Riga 37:
Una funzione può definire variabili, dette locali, che sono visibili solo durante l'esecuzione di ''una particolare istanza'' della funzione ovvero sono definite e allocate all'interno del blocco o corpo della funzione e sono deallocate al termine dell'esecuzione del blocco stesso o funzione stessa. Se più istanze di una funzione sono in esecuzione contemporaneamente, ciascuna avrà la sua copia di ciascuna variabile locale.
 
Per conoscere le modalità con cui le dichiarazioni effettuate localmente ada una funzione possano interagire con altre funzioni (o sottoblocchi di codice), è necessario avere una conoscenza approfondita delle modalità con cui l'[[ambiente (programmazione)|ambiente]] viene gestito dallo specifico linguaggio.
 
=== Parametri formali ed effettivi ===
Riga 61:
 
==== Variabili globali ====
Il metodo più semplice di passare parametri ada una funzione è l'utilizzo di [[variabile (informatica)|variabili]] globali, ovvero visibili da qualsiasi parte del programma. Questa pratica, quando attuata indiscriminatamente, è fortemente scoraggiata, perché può portare ada una scarsa leggibilità semantica del codice, con conseguenze spesso inaspettate. Pertanto l'uso di variabili globali viene considerata una forma impropria di passaggio di parametri.
 
==== Passaggio per valore ====
Riga 76:
 
==== Passaggio per nome ====
Questo meccanismo (nella letteratura in inglese indicato come "''pass by name''"), di difficile realizzazione nei linguaggi compilati, è soprattutto usato nelle [[Macro (informatica)|macro]]. Il passaggio per nome è tuttavia stato usato nell'[[ALGOL|ALGOL 68]] e nel [[Simula]]. A differenza degli altri tipi di passaggio di parametro, in cui viene creato il legame tra il parametro effettivo ed il parametro formale, in questo caso si crea un legame tra il parametro formale ede una chiusura, formata dal parametro effettivo insieme al proprio ambiente di valutazione, che è fissato al momento della chiamata. Inoltre bisogna fare attenzione che con questo tipo di passaggio di parametro, il parametro effettivo viene valutato ogni volta che il parametro formale viene incontrato durante l'esecuzione.
 
==== Passaggio per condivisione ====
Riga 85:
Una funzione può restituire un valore ([[tipo di dato|tipizzato]]) al chiamante. Questa modalità di passaggio di dati è unidirezionale, dal chiamato al chiamante.
 
Una chiamata di funzione è quindi un'[[espressione (informatica)|espressione]], che viene valutata per ottenere un valore. La valutazione di una un'espressione che contenga una chiamata di funzione comporta l'esecuzione della funzione stessa.
 
In alcuni linguaggi, il termine '''procedura''' indica una funzione senza valore di ritorno, in altri si usa un tipo di dato apposito, detto<code>void</code>, per il valore restituito, a significare che la funzione non restituisce alcun valore.