Los lenguajes de pro­gra­ma­ción comunes suelen permitir di­fe­re­n­tes pa­ra­di­g­mas de pro­gra­ma­ción. Dentro de estos, se hace una di­s­ti­n­ción apro­xi­ma­da entre los pa­ra­di­g­mas de pro­gra­ma­ción de­cla­ra­ti­va y de pro­gra­ma­ción im­pe­ra­ti­va. Si­m­pli­fi­ca­n­do mucho, estos pa­ra­di­g­mas co­n­s­ti­tu­yen los métodos fu­n­da­me­n­ta­les de pro­gra­ma­ción. Una su­b­ca­te­go­ría de la es­tra­te­gia de­cla­ra­ti­va es la llamada pro­gra­ma­ción funcional, que se utiliza en pa­r­ti­cu­lar en el de­sa­rro­llo de los si­guie­n­tes programas o códigos:

  • Apli­ca­cio­nes técnicas y ma­te­má­ti­cas
  • In­te­li­ge­n­cia Ar­ti­fi­cial (IA)
  • Co­m­pi­la­do­res y ana­li­za­do­res
  • Al­go­ri­t­mos

¿Qué hace que los lenguajes de pro­gra­ma­ción funcional sean tan in­te­re­sa­n­tes para este tipo de apli­ca­cio­nes in­fo­r­má­ti­cas? Y ¿en qué se di­fe­re­n­cia de otros conceptos como la pro­gra­ma­ción orientada a objetos?

¿Qué es la pro­gra­ma­ción funcional?

El nombre ya lo sugiere: la pro­gra­ma­ción funcional o fu­n­c­tio­nal pro­gra­m­mi­ng se centra en las funciones. En un programa funcional, todos los elementos pueden en­te­n­de­r­se como funciones y el código puede eje­cu­tar­se mediante llamadas de función se­cue­n­cia­les. Por el contrario, no se asignan valores de forma in­de­pe­n­die­n­te. Una función se imagina mejor como una variante especial de un su­b­pro­gra­ma. Esta es re­uti­li­za­ble y, a di­fe­re­n­cia de un pro­ce­di­mie­n­to, devuelve di­re­c­ta­me­n­te un resultado.

Por supuesto, en muchos lenguajes de pro­gra­ma­ción su­pe­rio­res hay funciones que se definen y después se aplican. Por esto, esta no es la ca­ra­c­te­rí­s­ti­ca especial de la pro­gra­ma­ción funcional. Lo que hace que la es­tra­te­gia funcional sea tan im­po­r­ta­n­te para la in­fo­r­má­ti­ca y a la vez tan versátil es el hecho de que las funciones dentro de este paradigma de pro­gra­ma­ción pueden adoptar di­fe­re­n­tes “formas”: estas pueden enlazarse entre sí como los datos y uti­li­zar­se como parámetro y como resultado de la función. Este tra­ta­mie­n­to especial de las funciones permite a los pro­gra­ma­do­res im­ple­me­n­tar y procesar tareas co­mpu­tacio­na­les muy complejas (es­pe­cia­l­me­n­te las de na­tu­ra­le­za simbólica).

Por qué la pro­gra­ma­ción funcional es más relevante hoy que nunca

Aunque las raíces de la pro­gra­ma­ción funcional se remontan a la década de 1930 (como parte de la in­ve­s­ti­ga­ción ma­te­má­ti­ca básica), la es­tra­te­gia funcional sigue gozando de gran po­pu­la­ri­dad, es­pe­cia­l­me­n­te en los campos técnico y ma­te­má­ti­co. Esto se debe a diversos motivos:

  • amplias opciones de tra­n­s­fo­r­ma­ción al­ge­brai­ca de programas,
  • amplias po­si­bi­li­da­des de síntesis al­ge­brai­ca de programas,
  • sencillas opciones de análisis semántico gracias a la renuncia a los “estados internos en el proceso de cálculo” y los “efectos se­cu­n­da­rios”,
  • des­apa­ri­ción de estados internos (a di­fe­re­n­cia de la pro­gra­ma­ción im­pe­ra­ti­va, no se requieren estados internos de un proceso de cálculo),
  • renuncia a los efectos se­cu­n­da­rios (los cambios de estado co­rre­s­po­n­die­n­tes a los estados internos, los llamados efectos se­cu­n­da­rios, también se pueden eliminar en las tareas fu­n­cio­na­les).

La pro­gra­ma­ción funcional ofrece un alto grado de ab­s­tra­c­ción, ya que está basada en el concepto ma­te­má­ti­co y el principio de función. Cuando se aplica de forma correcta, este tipo de pro­gra­ma­ción crea un código muy preciso. A partir de tantas unidades pequeñas, re­uti­li­za­bles y altamente es­pe­cia­li­za­das como sea posible, se crea un programa para la solución de una tarea su­s­ta­n­cia­l­me­n­te mayor.

Por esto, hay numerosas razones prácticas por las que la pro­gra­ma­ción funcional y los lenguajes de fu­n­c­tio­nal pro­gra­m­mi­ng que trabajan con este principio siguen ocupando una posición especial dentro de la in­fo­r­má­ti­ca actual, es­pe­cia­l­me­n­te cuando se trata de tareas ma­te­má­ti­cas y al­go­ri­t­mos complejos. A la vez, la es­pe­cia­li­za­ción de las áreas de apli­ca­ción co­n­tri­bu­ye a que los lenguajes de pro­gra­ma­ción funcional ocupen un nicho pa­r­ti­cu­lar.

Resumen: los lenguajes de pro­gra­ma­ción funcional más im­po­r­ta­n­tes

Entre los lenguajes de pro­gra­ma­ción funcional más im­po­r­ta­n­tes se en­cue­n­tran los si­guie­n­tes:

  • LISP
  • ML
  • Haskell
  • OCaml
  • F#
  • Erlang
  • Clojure
  • Scala

Asimismo, hay lenguajes de pro­gra­ma­ción conocidos que permiten la pro­gra­ma­ción funcional entre sus pa­ra­di­g­mas:

  • Perl
  • Ruby
  • Visual Basic .NET
  • Dylan
  • EC­MA­S­cri­pt

Tabla de ventajas e in­co­n­ve­nie­n­tes de la pro­gra­ma­ción funcional

Ventajas In­co­n­ve­nie­n­tes
Los programas no tienen estados Los datos (por ejemplo, las variables) no se pueden modificar
Muy adecuados para la pa­ra­le­li­za­ción No se permite el acceso eficiente a grandes ca­n­ti­da­des de datos
El código se puede testar fá­ci­l­me­n­te No se re­co­mie­n­da para co­ne­xio­nes a bases de datos y se­r­vi­do­res
Código fá­ci­l­me­n­te ve­ri­fi­ca­ble, incluso las funciones sin estado se pueden verificar No es adecuado para muchas re­cu­r­sio­nes de la misma pila
Fácil de combinar con la pro­gra­ma­ción im­pe­ra­ti­va y orientada a objetos La pro­gra­ma­ción re­cu­rre­n­te puede dar lugar a errores graves
Código más preciso y más corto No apto para todas las tareas

La tabla da una buena visión general de si el paradigma funcional es la es­tra­te­gia apropiada para programar un proyecto de software o no, aunque, muy a menudo, la elección de un estilo de pro­gra­ma­ción depende de las pre­fe­re­n­cias pe­r­so­na­les del de­sa­rro­lla­dor. Por ejemplo, la pro­gra­ma­ción orientada a objetos como al­te­r­na­ti­va a la es­tra­te­gia funcional es muy popular para muchos pro­gra­ma­do­res. A co­n­ti­nua­ción, co­m­pa­ra­re­mos bre­ve­me­n­te las dos es­tra­te­gias, in­clu­ye­n­do un ejemplo práctico final.

¿Tendencia o no tendencia? Co­m­pa­ra­ción de la pro­gra­ma­ción funcional y la orientada a objetos

Al igual que en la moda, en la pro­gra­ma­ción hay te­n­de­n­cias: desde hace ya tiempo, la pro­gra­ma­ción orientada a objetos es muy popular, es­pe­cia­l­me­n­te en el de­sa­rro­llo de apli­ca­cio­nes web y vi­deo­jue­gos. En co­m­pa­ra­ción con la pro­gra­ma­ción funcional, esta es­tra­te­gia no describe los elementos in­di­vi­dua­les como funciones, sino como objetos y clases. En co­m­bi­na­ción con un sistema de herencia, esto tiene la ventaja de que todos los co­m­po­ne­n­tes se pueden re­uti­li­zar y ampliar en todo momento y sin problemas. Por otra parte, el código funcional es mucho más sencillo, más claro y es­pe­cia­l­me­n­te ventajoso cuando se requiere un código testable y ve­ri­fi­ca­ble.

No obstante, en principio no hay que elegir ne­ce­sa­ria­me­n­te entre la pro­gra­ma­ción orientada a objetos y la pro­gra­ma­ción funcional: muchos lenguajes de pro­gra­ma­ción modernos permiten utilizar los dos estilos de pro­gra­ma­ción, con lo que pueden co­m­bi­nar­se con facilidad y dan al usuario las ventajas de los dos pa­ra­di­g­mas.

Pro­gra­ma­ción funcional uti­li­za­n­do el ejemplo de un ana­li­za­dor

Los ana­li­za­do­res o parsers son elementos ese­n­cia­les para todos los programas de ordenador. Como di­re­c­to­res de los co­m­pi­la­do­res que traducen el lenguaje de pro­gra­ma­ción al lenguaje de las máquinas, son a menudo in­di­s­pe­n­sa­bles.

Un ana­li­za­dor puede im­ple­me­n­tar­se sobre la base de varios pa­ra­di­g­mas de pro­gra­ma­ción –por ejemplo, también con un lenguaje orientado a objetos. Sin embargo, la es­tra­te­gia funcional ofrece una serie de ventajas útiles cuando se trata del diseño de código de un ana­li­za­dor.

  • No hay variables globales y ca­m­bia­n­tes. En co­n­se­cue­n­cia, no hay errores de pro­gra­ma­ción derivados del llamado “estado global mutable” (estado mo­di­fi­ca­ble por todo el código), como puede ser el caso de los proyectos orie­n­ta­dos a objetos. Para un ana­li­za­dor, este elemento del programa central es una ventaja.
  • Gracias a las funciones de orden superior y a la claridad del código de programa, se pueden gestionar fá­ci­l­me­n­te incluso grandes co­le­c­cio­nes de datos. Esto es muy ventajoso para un ana­li­za­dor, que na­tu­ra­l­me­n­te tiene que procesar grandes ca­n­ti­da­des de datos.
  • Los ana­li­za­do­res son elementos del programa que se ejecutan muy a menudo. De este modo, beneficia a todo el programa que este elemento central esté pro­gra­ma­do con precisión y funcione efi­cie­n­te­me­n­te, lo que logra la pro­gra­ma­ción funcional.
  • Un error en el proceso de análisis suele ser fatal y se debe evitar todo lo posible. Sin embargo, durante la ejecución de un programa, aparecen siempre numerosas de­pe­n­de­n­cias se­má­n­ti­cas, que pueden ocasionar errores graves, pero a menudo solo después de un tiempo de ejecución pro­lo­n­ga­do. La im­ple­me­n­ta­ción correcta de una pro­gra­ma­ción funcional puede ayudar a minimizar o prevenir co­m­ple­ta­me­n­te estos graves errores de ejecución.
Ir al menú principal