20 mar. 2014

Finiquitadas los principales paradigmas de programación imperativos, va siendo hora de adentrarnos en un campo totalmente distinto que ofrece otra serie de protocolos y filosofías de actuación a la hora de programar, la entrada de hoy apunta a la programación funcional, la cual basa sus principios en la resolución de operaciones aritméticas.


A diferencia de otros paradigmas, la programación funcional elige prescindir de datos de estado o mutables para centrarse en la resolución del problema mediante mecanismos puramente matemáticos basados en funciones, esto choca principalmente con las bases de los paradigmas imperativos, ya que éstos últimos se basan en la aplicación de dichos estados y de sus cambios para la automatización a la hora de resolver una operación.




Los intrínsecos mecanismos de la programación funcional arraigan directamente del revolucionario sistema de funciones recursivas lambda, ésta forma de cálculo fue usada por Alonzo Church y Stephen Kleene para resolver el mítico Entscheidungsproblem (Problema de decisión) un problema lógico de dictaminación acerca de teoremas, hoy día y tal y como describimos en la entrada sobre Java 8, lambda tiene múltiples aplicaciones que apuntan a los procedimientos de la programación funcional.


En definitiva éste paradigma compite con la principal debilidad de la programación imperativa, y es que salvo usando funciones, como concepto más allá del plano matemático, se evita con creces el famoso cúmulo de "efectos secundarios" referidos al hecho de que cambiar valores en manos de imperativa supone el cambio de los resultados incluso tras la realización del procedimiento, por lo que el uso de funciones aporta transparencia referencial al software en tiempo de ejecución, asegurando valores correctamente establecidos y sin cambios durante el transcurso del mismo.

No obstante, más por el costoso uso que por su alcance operativo, éste paradigma está popularmente etiquetado dentro del campo académico, no soliendo ser el predilecto de recomendación para el desarrollo comercial de aplicaciones, no siendo éste el caso de aplicaciones como Scheme, Haskell, Erlang, Objective Caml o Rust, Con excelentes resultados en aplicación industrial.

La programación funcional encuentra hueco en la industria gracias también a lenguajes de dominio específico como pueden ser Mathematica (usado en matemáticas simbólicas), R (estadística), J y K (finanzas), F# en Microsoft.NET o XSLT (XML). 

Lenguajes tan usados como Lex/Yacc y SQL, usan algoritmos propios de la programación funcional, por ejemplo, principalmente al tratar valores mutables. Incluso podemos considerar parte del pack a las hojas de cálculo.

En definitiva, en aplicaciones matemáticas, industriales, académicas, o en casos específicos como SGBDs, ésta forma de proceder es útil, sobre todo, si lo que se desea es escribir código aritmético sin necesidad de enfrentarse cara a cara con bajo nivel, evitando la mutación del estado de un resultado, e incluso, como fin autodidacta, no olvidemos que, a fin de cuentas algunos de los lenguajes qu precisan de parte de éste paradigma, son realmente útiles como es el caso de SQL.



Características principales:

Funciones de primera clase y de orden superior:

Funciones que, en definitiva, son subceptibles de poder implementar otras funciones, estableciéndolas de forma directa com oargumentos y/o devolverlas como resultado a otra.


Funciones puras

Carecen de los "efectos secundarios" propios de imperativa, permitiendo además mejorar el rendimiento del código, por ejemplo, elimina valores en desuso, aplica transparencia referencial (definida anteriormente), independencia de datos o uso de "poda" eliminando completamente efectos contraproducentes para la ejecución óptima del código.

Recursividad

Antes hemos mencionado la recursividad como una de las características de ésta filosofía procedimental, pero, ¿Qué es exactamente la recursividad?
Fácil, las funciones recursivas tienen la potestad de invocarse a sí mismas, lo cual supone condicionar la repetición de una función creando así patrones sencillos que lograría el efecto de un bucle.


Evaluación estricta de subtérminos

Si un subtérmino falla, el término no se aprovará

Pre-asunción de los tipos primitivos

Implementan la declaración de los mismos sin necesidad de que el programador lo haga tras su primera declaración

Adaptación multilenguaje

Puede aplicarse en múltiples lenguajes, e incluso en algunos que no han sido orientados de forma directa a ésta metodología

Lenguajes aplicables:

Lenguajes funcionales puros: Haskell y Miranda
Lenguajes funcionales híbridos: SAP, Scala, Lisp,Ocaml, Clojure, Scheme y Standard ML


Libros recomendados:

Introducción a la Programación funcional usando Haskell

Reacciones:

0 comentarios:

Publicar un comentario