Programmazione funzionale: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
Riga 62:
* i linguaggi non funzionali guadagnavano velocità, almeno in parte, nel lasciare al programmatore alcuni compiti di livello più basso.
 
Questi compiti di basso livello erano il [[w:bound checking|bound-checking]], ovvero controllare i valori assunti dagli indici dei [[w:buffer|buffer]] per evitare [[w:overflow]|overflow]], il [[w:garbage collection|garbage collection]], per la gestione della memoria e simili. Questi compiti sono parti essenziali dei programmi moderni e la loro sbagliata gestione è causa di buona parte dei [[w:bug|bug]] del software, quali [[w:memory leak|memory leak]] e vari tipi di overflow.
 
Proprio per la necessità del mondo informatico moderno di sviluppare programmi velocemente e esenti da bug, anche a scapito di un po' di efficienza, anche i linguaggi imperativi moderni stanno includendo queste tecniche di gestione automatica dei compiti di basso livello. Ciò fa sì che oggi le performance dei linguaggi funzionali e dei linguaggi imperativi convergano. Per programmi che passano la maggior parte del tempo facendo computazioni numeriche, alcuni linguaggi funzionali (come l'[[w:Objective Caml|Ocaml]] e il [[w:Clean (linguaggio di programmazione)|Clean]]) possono avvicinarsi alla velocità del C, mentre per programmi che gestiscono grandi [[w:Matrice (matematica)|matrici]] e [[w:Database|basi di dati]] multidimensionali, i linguaggi funzionali [[w:Programmazione ad array|ad array]] (come il [[w:J (linguaggio di programmazione)|J]] e il [[w:K (linguaggio di programmazione)|K]]) sono solitamente più veloci dei programmi C non ottimizzati. Comunque, i linguaggi puramente funzionali possono diventare considerevolmente più lenti di quelli imperativi quando manipolano grandi strutture dati, per via dell'utilizzo della memoria meno efficiente.