Programmazione funzionale - Introduzione
I linguaggi di programmazione funzionale sono progettati appositamente per gestire il calcolo simbolico e le applicazioni di elaborazione di elenchi. La programmazione funzionale si basa su funzioni matematiche. Alcuni dei più diffusi linguaggi di programmazione funzionale includono: Lisp, Python, Erlang, Haskell, Clojure, ecc.
I linguaggi di programmazione funzionale sono classificati in due gruppi, ovvero:
Pure Functional Languages- Questi tipi di linguaggi funzionali supportano solo i paradigmi funzionali. Ad esempio - Haskell.
Impure Functional Languages- Questi tipi di linguaggi funzionali supportano i paradigmi funzionali e la programmazione in stile imperativo. Ad esempio - LISP.
Programmazione funzionale - Caratteristiche
Le caratteristiche più importanti della programmazione funzionale sono le seguenti:
I linguaggi di programmazione funzionale sono progettati sul concetto di funzioni matematiche che utilizzano espressioni condizionali e ricorsione per eseguire calcoli.
Supporti di programmazione funzionale higher-order functions e lazy evaluation Caratteristiche.
I linguaggi di programmazione funzionale non supportano i controlli di flusso come le istruzioni di ciclo e le istruzioni condizionali come le istruzioni If-Else e Switch. Usano direttamente le funzioni e le chiamate funzionali.
Come l'OOP, i linguaggi di programmazione funzionale supportano concetti popolari come astrazione, incapsulamento, ereditarietà e polimorfismo.
Programmazione funzionale - Vantaggi
La programmazione funzionale offre i seguenti vantaggi:
Bugs-Free Code - La programmazione funzionale non supporta state, quindi non ci sono risultati di effetti collaterali e possiamo scrivere codici senza errori.
Efficient Parallel Programming- I linguaggi di programmazione funzionale NON hanno uno stato mutevole, quindi non ci sono problemi di cambio di stato. Si possono programmare "Funzioni" per lavorare in parallelo come "istruzioni". Tali codici supportano una facile riusabilità e testabilità.
Efficiency- I programmi funzionali sono costituiti da unità indipendenti che possono essere eseguite contemporaneamente. Di conseguenza, tali programmi sono più efficienti.
Supports Nested Functions - La programmazione funzionale supporta le funzioni annidate.
Lazy Evaluation - La programmazione funzionale supporta costrutti funzionali pigri come liste pigre, mappe pigre, ecc.
Come svantaggio, la programmazione funzionale richiede un ampio spazio di memoria. Poiché non ha uno stato, è necessario creare ogni volta nuovi oggetti per eseguire azioni.
La Programmazione Funzionale viene utilizzata in situazioni in cui dobbiamo eseguire molte operazioni differenti sullo stesso insieme di dati.
Lisp viene utilizzato per applicazioni di intelligenza artificiale come l'apprendimento automatico, l'elaborazione del linguaggio, la modellazione del parlato e della visione, ecc.
Gli interpreti Lisp incorporati aggiungono programmabilità ad alcuni sistemi come Emacs.
Programmazione funzionale vs. programmazione orientata agli oggetti
La tabella seguente evidenzia le principali differenze tra programmazione funzionale e programmazione orientata agli oggetti:
Programmazione funzionale | OOP |
---|---|
Utilizza dati immutabili. | Utilizza dati mutabili. |
Segue il modello di programmazione dichiarativo. | Segue il modello di programmazione imperativo. |
Il focus è su: "Cosa stai facendo" | Il focus è su "Come stai" |
Supporta la programmazione parallela | Non adatto per la programmazione parallela |
Le sue funzioni non hanno effetti collaterali | I suoi metodi possono produrre gravi effetti collaterali. |
Il controllo del flusso viene eseguito utilizzando chiamate di funzione e chiamate di funzione con ricorsione | Il controllo del flusso viene eseguito utilizzando cicli e istruzioni condizionali. |
Utilizza il concetto di "ricorsione" per iterare i dati di raccolta. | Utilizza il concetto "Loop" per iterare i dati di raccolta. Ad esempio: For-each loop in Java |
L'ordine di esecuzione delle istruzioni non è così importante. | L'ordine di esecuzione delle istruzioni è molto importante. |
Supporta sia "Astrazione sui dati" che "Astrazione sul comportamento". | Supporta solo "Astrazione sui dati". |
Efficienza di un codice di programma
L'efficienza di un codice di programmazione è direttamente proporzionale all'efficienza algoritmica e alla velocità di esecuzione. Una buona efficienza garantisce prestazioni più elevate.
I fattori che influenzano l'efficienza di un programma includono:
- La velocità della macchina
- Velocità del compilatore
- Sistema operativo
- Scegliere il giusto linguaggio di programmazione
- La via dei dati in un programma è organizzata
- Algoritmo utilizzato per risolvere il problema
L'efficienza di un linguaggio di programmazione può essere migliorata eseguendo le seguenti attività:
Rimuovendo il codice non necessario o il codice che va all'elaborazione ridondante.
Facendo uso di memoria ottimale e archiviazione non volatile
Facendo uso di componenti riutilizzabili laddove applicabile.
Facendo uso della gestione degli errori e delle eccezioni a tutti i livelli del programma.
Creando codice di programmazione che garantisce l'integrità e la coerenza dei dati.
Sviluppando il codice del programma conforme alla logica e al flusso di progettazione.
Un codice di programmazione efficiente può ridurre il più possibile il consumo di risorse e il tempo di completamento con il minimo rischio per l'ambiente operativo.