Funzione (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Annullate le modifiche di 79.3.123.93 (discussione), riportata alla versione precedente di 82.55.21.38
Nessun oggetto della modifica
Riga 2:
{{F|programmazione|febbraio 2013}}
{{C|argomento=informatica|mese=febbraio 2015|motivo=Non tutti i linguaggi fortemente tipizzati richiedono dichiarazioni di tipo. Cfr. [[Discussione:Funzione (informatica)#Linguaggi fortemente tipati e linguaggi esplicitamente tipati|discussione]].}}
In [[informatica]], nell'ambito della [[programmazione (informatica)|programmazione]], una '''funzione''' (detta anche '''subroutine''', '''routine''', '''procedura''', '''sottoprogramma''' o '''metodo''') è un particolare costrutto [[sintassi (informatica)|sintattico]], in qualche [[linguaggio di programmazione]], che permette di raggruppare, all'interno di [[Programma (informatica)|programma]], una sequenza di [[Istruzione (informatica)|istruzioni]] in un unico blocco di istruzioni espletando così una determinata e in generale più complessa operazione, azione o [[Elaborazione dati|elaborazione]] sui dati del programma stesso in modo tale che a partire da determinati [[input]] restituisca determinati [[output]].
 
L'importanza, la praticità e i vantaggi di una funzione stanno nel fatto che può essere "chiamata" ("richiamata", "invocata" o "attivata") in diversi punti del programma di cui fa parte ogni volta in cui si ha la necessità di farlo come se fosse una singola istruzione senza la necessità di doverne riscrivere ogni volta il relativo [[codice sorgente|codice]] implementando dunque il cosiddetto [[riuso di codice]], cui si aggiunge una più facile [[manutenibilità]] del codice all'interno del programma ed una più facile [[ingegneria del software|progettazione]] del [[software]] secondo la classica filosofia del ''[[Divide et impera (informatica)|divide et impera]]''.
Riga 9:
 
==Descrizione==
Una funzione dovrebbe eseguire una determinata operazione o risolvere un determinato problema (o al limite tutto il problema) all'interno dell'[[algoritmo]] risolutivo, contribuendo così alla [[fattorizzazione (software)|fattorizzazione]] del [[software]]. Ad esempio, una subroutine progettata per disporre in ordine crescente un insieme di numeri interi può essere richiamata in tutti i contesti in cui questa operazione sia utile o necessaria, e supplisce alla mancanza di una vera e propria "istruzione" dedicata allo scopo, consentendo al contempo di descrivere il corrispondente [[algoritmo di ordinamento]] in un unico punto del programma.
Ad esempio, una subroutine progettata per disporre in ordine crescente un insieme di numeri interi può essere richiamata in tutti i contesti in cui questa operazione sia utile o necessaria, e supplisce alla mancanza di una vera e propria "istruzione" dedicata allo scopo, consentendo al contempo di descrivere il corrispondente [[algoritmo di ordinamento]] in un unico punto del programma.
 
Le subroutine che implementano funzionalità di base spesso richiamate nel [[codice sorgente]] dal programmatore sono raccolte all'interno delle cosiddette [[libreria (informatica)|librerie]].
Riga 26 ⟶ 25:
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 ritornerà in output all'utente o ad altre funzioni che la invocano; quando una funzione non ritorna nulla (es. ritorno di tipo ''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 instanziate o definite nel blocco saranno necessariamente variabili locali cioè con visibilità solo all'interno del blocco stesso.
 
Una funzione è una porzione di codice che può essere invocata da qualsiasi punto di un programma.. Per l'invocazione occorre tipicamente richiamarne almeno il nome passando i valori degli eventuali parametri, cui si aggiungono eventualmente altri dettagli dipendenti dal particolare linguaggio di programmazione in uso (es. notazione punto nei linguaggi ad oggetti).
 
Un funzione può a sua volta richiamare un'altra funzione, restando in attesa che questa termini. Si parla in questo caso di '''funzione invocante''' e '''funzione invocata''', o '''funzione chiamante''' e '''funzione chiamata'''. È anche possibile che una funzione richiami direttamente o indirettamente sé stessa. In questo caso, si dice che in un dato momento sono in esecuzione più '''istanze''' di una stessa funzione. Questa possibilità è essenziale per la [[ricorsione|programmazione ricorsiva]].
Riga 80 ⟶ 79:
 
==== 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 ed 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.
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 ed 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 92 ⟶ 90:
Una chiamata di funzione è quindi un'[[espressione (informatica)|espressione]], che viene valutata per ottenere un valore. La valutazione di una 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.
 
Nei linguaggi funzionali il tipo di dato restituito può essere una funzione, che il chiamante potrà invocare.