Professional Documents
Culture Documents
Dirigido por eventos. El flujo del programa est determinado por sucesos
externos (por ejemplo, una accin del usuario).
lo que no puede decirse que uno sea necesariamente mejor que otro.
Paradigma Funcional
Introduccin
El objetivo del paradigma funcional es conseguir lenguajes expresivos y matemticamente
elegantes, en los que no sea necesario bajar al nivel de la mquina para describir
el proceso llevado a cabo por el programa, y evitando el concepto de estado del cmputo.
La secuencia de computaciones llevadas a cabo por el programa se regira nica y
exclusivamente por la reescritura de definiciones ms amplias a otras cada vez ms
concretas y definidas, usando lo que se denominan definiciones dirigidas.
Todo esto con el objetivo de familiarizar a los estudiantes con un lenguaje elegante en el
cual se pueda manejar ms fcilmente y as los programas sean menos extensos y
complejos.
Otro de los objetivos primordiales de dicho paradigma es buscar satisfacer las
necesidades del usuario con respecto a operaciones matemticas y convertirse en un
lenguaje ms expresivo.
Historia
Sus orgenes provienen del Clculo Lambda (o -clculo),
una teora matemtica elaborada por Alonso Church como apoyo a sus estudios sobre
Computabilidad. Un lenguaje funcional es, a grandes rasgos, un azcar sintctico del
Clculo Lambda.
Clculo Lambda
Los orgenes tericos del modelo funcional se remontan a la dcada del 30, mas
precisamente al ao 1934, cuando Alonso Church introdujo un modelo matemtico
de computacin llamado lambda calculo.
A pesar de que en esta poca las computadoras aun no existan el lambda clculo se
puede considerar como el primer lenguaje funcional de la historia y sus fundamentos
fueron la base de toda la teora de la programacin funcional y de los lenguajes
funcionales desarrollados posteriormente. Se puede decir que los lenguajes funcionales
modernos son versiones de lambda clculo con numerosas ayudas sintcticas.
Aunque cuando aparece el clculo lambda, an no existan las computadoras, resulta ser
una herramienta simple que se adelanta a su poca, que abarca dos operaciones:
a.
Definir alguna(s) funcin(es) de un solo argumento y con un cuerpo especfico,
denotado por la siguiente terminologa:
b.
i.
ii.
lx.B, en donde:
x: Define el parmetro o argumento formal.
a.
iii.
iv.
Es decir f(x) = B.
REDUCCION:
Consiste en aplicar alguna de las funciones creadas, sobre un argumento real (A);
resultado de sustituir las ocurrencias del argumento formal (x), que aparezcan en el
cuerpo (B) de la funcin, con el argumento (A),
es decir: (lx.B)
Ejemplo:
(lx.(x+5))3, indica que en la expresin x + 5, debemos sustituir el valor de x por 3.
Cuando ya no es posible reducir una funcin, se dice que sta se encuentra en su estado
normal, o sea hemos encontrado el valor de la funcin, que depender nicamente de los
argumentos y siempre tendr la consistencia de regresar el mismo valor para los mismos
argumentos.
Lo anterior es la transferencia referencial y al no contar con variables globales, permiten
al sistema la ejecucin de procesos en forma paralela para incrementar su eficiencia.
Sobre estos simples conceptos est basada la programacin funcional, aunque existen
otros, usados para identificarla y aumentan su potencial en el desarrollo de aplicaciones.
Caractersticas
Los programas escritos en un lenguaje funcional estn constituidos nicamente por
definiciones de funciones, entendiendo stas no como subprogramas clsicos de un
lenguaje imperativo, sino como funciones puramente matemticas, en las que se verifican
ciertas propiedades como la transparencia referencial (el significado de una expresin
depende nicamente del significado de sus subexpresiones), y por tanto, la carencia total
de efectos laterales.
Otras caractersticas propias de estos lenguajes son la no existencia de asignaciones de
variables y la falta de construcciones estructuradas como la secuencia o la iteracin (lo
que obliga en la prctica a que todas las repeticiones de instrucciones se lleven a cabo por
medio de funciones recursivas).
Existen dos grandes categoras de lenguajes funcionales: los funcionales puros y los
hbridos. La diferencia entre ambos estriba en que los lenguajes funcionales hbridos son
menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes
procedimentales, como las secuencias de instrucciones o la asignacin de variables.
En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva,
conservando a la vez su transparencia referencial, algo que no se cumple siempre con un
lenguaje funcional hbrido.
Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes
funcionales hbridos ms conocidos son Lisp, Scheme, Ocaml y Standard ML (estos dos
ltimos, descendientes del lenguaje ML).
La programacin funcional, es un modelo basado en la evaluacin de funciones
matemticas, entendidas como mecanismos para aplicar ciertas operaciones sobre
algunos valores o argumentos, para obtener un resultado o valor de la funcin para tales
argumentos.
Sin embargo, tanto argumentos como resultado de una funcin, pueden ser otra funcin,
o incluso la misma, tal como una forma de recursividad, que constituye una poderosa
herramienta de la programacin funcional
Lenguajes Funcionales
Los matemticos desde hace un buen tiempo estn resolviendo problemas usando el
concepto de funcin. Una funcin convierte ciertos datos en resultados. Si supiramos
cmo evaluar una funcin, usando la computadora, podramos resolver automticamente
muchos problemas.
As pensaron algunos matemticos, que no le tenan miedo a la mquina, e inventaron los
lenguajes de programacin funcionales. Adems, aprovecharon la posibilidad que tienen
las funciones para manipular datos simblicos, y no solamente numricos, y
la propiedad de las funciones que les permite componer, creando de esta manera, la
oportunidad para resolver problemas complejos a partir de las soluciones a otros ms
sencillos.
Tambin se incluy la posibilidad de definir funciones recursivamente.
Un lenguaje funcional ofrece conceptos que son muy entendibles y relativamente fciles
de manejar para todos los que no se durmieron en las clases de matemticas. El
lenguaje funcional ms antiguo, y seguramente el ms popular hasta la fecha, es LISP,
diseado por McCarthy [1] en la segunda mitad de los aos 50. Su rea de aplicacin es
principalmente laInteligencia Artificial. En la dcada de los 80 hubo una nueva ola
de inters por los lenguajes funcionales, aadiendo la tipificacin y algunos conceptos
modernos de modularizacin y polimorfismo, como es el caso del lenguaje ML.
Programar en un lenguaje funcional significa construir funciones a partir de las ya
existentes. Por lo tanto es importante conocer y comprender bien las funciones que
conforman la base del lenguaje, as como las que ya fueron definidas previamente. De esta
manera se pueden ir construyendo aplicaciones cada vez ms complejas.
La desventaja de este modelo es que resulta bastante alejado del modelo de la mquina
de von Neumann y, por lo tanto, la eficiencia de ejecucin de los intrpretes de lenguajes
funcionales no es comparable con la ejecucin de los programas imperativos
precompilados. Para remediar la deficiencia, se est buscando utilizar arquitecturas
paralelas que mejoren eldesempeo de los programas funcionales, sin que hasta la fecha
estos intentos tengan un impacto real importante.
Los dos mecanismos bsicos presentados anteriormente se corresponden con los
conceptos de abstraccin funcional y aplicacin de funcin; si le agregamos un conjunto
de identificadores para representar variables se obtiene lo mnimo necesario para tener
un lenguaje de programacin funcional. Lambda calculo tiene el
mismo poder computacional que cualquier lenguaje imperativo tradicional.
Las ventajas de tener un lenguaje tan simple son:
Permite definiciones simples.
Aplicaciones
Compilacin de lenguajes funcionales.
Programacin funcional:
La crtica de John Backus a los "lenguajes convencionales de von Neumann" llam
la atencin hacia la programacin funcional (hacia 1978). El estilo de programacin
adoptado por Backus fue denominado FP (Functional Programming).
El componente bsico de los lenguajes funcionales es la nocin de funcin y
su estructura de control esencial la aplicacin de una funcin. Entre los lenguajes
funcionales se encuentran ISWIM, ML, LISP y todos sus derivados, como Scheme. Las
caractersticas fundamentales de los lenguajes funcionales de programacin son, segn
[SET92]:
1. El valor de una expresin depende slo de los valores de sus subexpresiones, si las
tiene. La programacin funcional pura es una programacin sin asignaciones. En
realidad, la mayora de los lenguajes funcionales son impuros, ya que permiten
asignaciones. Sin embargo, su estilo de programacin es diferente al de los lenguajes de
programacin imperativa.
2. Almacenamiento implcito. El programador no debe preocuparse en manejar el
almacenamiento de datos. Una consecuencia de esto es que la implementacin del
lenguaje debe realizar una "recoleccin de basura" para recuperar la memoria que se ha
usado y no se volver a utilizar.
3. Las funciones son valores de primera clase. Una funcin puede ser el valor de una
expresin, pasarse como argumento o colocarse en una estructura de datos. Esto permite
potentes operaciones.
Al decir que un lenguaje de programacin es funcional, se suele hacer referencia al
paradigma de programacin funcional.
En trminos general, al desarrollar software en el paradigma de programacin, en
contraste con el paradigma de programacin imperativo, se tiende a enfatizar ms la
evaluacin de expresiones que la ejecucin secuencial de comandos.
En el fondo, para ejecutar programas los computadores ejecutan, de manera secuencial,
instrucciones de cdigo de mquina. De cierta forma, sto hace que los lenguajes
imperativos sean ms cercanos a la manera en que funcionan los computadores, al forzar
a los programadores a formular sus algoritmos como una serie de pasos que se realizarn
de manera secuencial.
Los lenguajes funcionales, por otro lado, son ms cercanos a la manera en que funciona
la mente humana, pues tienden a permitirle a los programadores describir sus algoritmos
como expresiones que sern evaluadas.
Hay varias consecuencias del nfasis en la evaluacin de expresiones que son comunes a
la mayora de lenguajes funcionales:
Los procedimientos son ciudadanos de primera categora Los procedimientos y
funciones son objetos visibles que pueden ser almacenados dentro
de estructuras complejas, pasados como argumentos, construidos en tiempo de ejecucin y
manipulados al igual que otros tipos como los nmeros y las cadenas.
El modelo de Hewitt estaba orientado a objetos y con una fuerte influencia del Smalltalk.
De acuerdo con l, cada objeto era una entidad computacionalmente activa capaz de
recibir y de reaccionar a los mensajes. A estos objetos y los mensajes que intercambiaban,
Hewitt los llam actores. Dado que Sussman y Steele afrontaban dificultades para
entender algunos aspectos tericos y prcticos del trabajo de Hewitt, decidieron construir
un pequeo intrprete de este lenguaje usando MacLisp, a fin de poder experimentar con
l. Como Sussman haba estado estudiando Algol en aquella poca, le sugiri a Steele
comenzar con un dialecto de Lisp que tuviera reglas de mbito esttico (i.e., el valor de
una variable libre se toma de su ambiente de definicin).
Esta decisin les permiti crear actores con la misma facilidad con que se crean las
funciones en Lisp (y usando casi los mismos mecanismos). El paso de mensajes se podra
entonces expresar sintcticamente en la misma forma en que se invoca una funcin. La
nica diferencia entre un actor y una funcin era que una funcin regresaba un valor y
un actor no regresaba nada, sino que ms bien invocaba una continuacin, o sea, otro
actor que saba de su existencia.
Sussman y Steele se sintieron tan satisfechos con su mini-intrprete que decidieron
llamarlo "Schemer", pensando que con el tiempo se convertira en otro lenguaje que se
pudiera utilizar en inteligencia artificial, tal y como PLANNER, el lenguaje desarrollado
por Hewitt. Sin embargo, el sistema operativo ITS limitaba los nombres a 6 letras, por lo
que el apelativo del intrprete hubo de ser truncado a "Scheme", que es como se le conoce
hoy en da.
Persuadidos de que su intrprete pareca capturar muchas de las ideas que circulaban
entonces sobre lenguajes de programacin, Sussman y Steele decidieron publicar la
definicin de Scheme en la forma de un memo del laboratorio de inteligencia artificial del
MIT. Esta primera definicin del lenguaje era sumamente austera, con un mnimo de
primitivas (una por concepto), pero marc el inici de lo que se convertira en un lenguaje
de programacin sumamente popular en las esferas acadmicas.
En 1976, Sussman y Steele publicaron dos artculos en los que se hablaba sobre
semntica de los lenguajes de programacin usando Scheme: "Lambda: The Ultimate
Imperative" y "Lambda: The Ultimate Declarative", en los cuales los autores enfatizaran el
hecho de que Scheme poda soportar eficientemente los principales paradigmas de
programacin actuales (i.e., imperativo, funcional y orientado a objetos). Esta ltima
publicacin se convirti de hecho en la propuesta de tesis de maestra de Steele, que
culmin en el desarrollo de un compilador de Scheme llamado RABBIT.
Histricamente, Scheme contribuy a estrechar la brecha entre los tericos (que
estudiaban el Clculo Lambda y el modelo de actores) y los prcticos (implantadores y
usuarios de Lisp) en el rea de lenguajes de programacin. Adems, Scheme hizo la
semntica denotacional mucho ms accesible a los programadores y proporcion una
plataforma operacional que permitiera a los tericos realizar sus experimentos. Por su
reducido tamao, no haba necesidad de tener una versin centralizada del lenguaje que
tuviera que soportar un gran nmero de plataformas, como suceda con Lisp.
De tal forma, brotaron por todas partes implementaciones y dialectos de Scheme hacia
inicios de los 80. Un ejemplo es el Scheme 311, desarrollado en la Universidad de Indiana
varios aos antes de que alguien hiciera un intento por producir una implementacin
aislada del lenguaje (i.e., que no tuviera que montarse sobre Lisp).
Conclusin
Hoy en da Scheme es un lenguaje simple, pero poderoso; pequeo, pero flexible. Su
naturaleza lo hace ideal para la enseanza, incluso como primer lenguaje de
programacin, por su notable facilidad para incorporar diversos paradigmas con slo un
puado de primitivas.
Como lenguaje imperativo, conserva la pureza y elegancia que le proporcionan la
recursividad y las funciones de orden superior, superando as a muchos de los lenguajes
que hoy gozan de gran popularidad, tales como Pascal y C. Como lenguaje orientado a
objetos, hace alarde de un sistema de paso de mensajes y de manipulacin de objetos
equiparable nicamente al de Smalltalk. Su mecanismo de continuaciones proporciona
procedimientos de escape como ciudadanos de primer orden, condenando a la
obsolescencia a los mecanismos similares con que cuentan otros lenguajes.
El uso de streams permite implementar la evaluacin concisa, convirtiendo al lenguaje en
una herramienta idnea para cursos avanzados de lenguajes de programacin. Una de
sus pocas desventajas estriba en su carencia de tipos, aunque existen versiones de
Scheme que incorporan un sistema similar al de ML (por ejemplo, Scheme 48).
Desde una perspectiva ms pragmtica, podemos decir que su sintaxis es
extremadamente simple, lo que permite que el lenguaje pueda dominarse fcilmente en
slo 6 meses. Los estudiantes suelen preferirlo, sobre todo, cuando se trata del primer
lenguaje de programacin que aprenden, y los instructores lo elogian porque facilita la
enseanza de ideas de abstraccin y diseo de algoritmos, tan tiles para formar buenos
programadores.
Con la sabia filosofa de proporcionar slo una primitiva que haga lo que queremos en vez
de varias, como en otros lenguajes, Scheme se erige en la cima de los lenguajes preferidos
por las nuevas generaciones, ya no slo como una mera curiosidad cientfica, como se vi
a Lisp en otra poca, sino como una herramienta efectiva que sirve para aprender a
programar y a resolver problemas del mundo real.
Paradigma funcional
funcional tiene sus races en el clculo lambda, un sistema formal desarrollado en los
aos 1930 para investigar la definicin de funcin, la aplicacin de las funciones y la
recursin. Muchos lenguajes de programacin funcionales pueden ser vistos como
elaboraciones del clculo lambda.
En la prctica, la diferencia entre una funcin matemtica y la nocin de una "funcin"
utilizada en la programacin imperativa es que las funciones imperativas pueden tener
efectos secundarios, al cambiar el valor de clculos realizados previamente. Por esta razn
carecen de transparencia referencial, es decir, la misma expresin sintctica puede
resultar en valores diferentes en diferentes momentos dependiendo del estado del
programa siendo ejecutado. Con cdigo funcional, en contraste, el valor generado por una
funcin depende exclusivamente de los argumentos alimentados a la funcin. Al eliminar
los efectos secundarios se puede entender y predecir el comportamiento de un programa
mucho ms fcilmente, y esta es una de las principales motivaciones para utilizar la
programacin funcional.
Los lenguajes de programacin funcional, especialmente los que son puramente
funcionales, han sido enfatizados en el ambiente acadmico principalmente y no tanto en
el desarrollo de software comercial. Sin embargo, lenguajes de programacin importantes
tales como Scheme, Erlang, Rust, Objective Caml y Haskell, han sido utilizados en
aplicaciones comerciales e industriales por muchas organizaciones. La programacin
funcional tambin es utilizada en la industria a travs de lenguajes de dominio especfico
como R (estadstica), Mathematica (matemticas simblicas), J y K (anlisis financiero),
F# en Microsoft.NET y XSLT (XML). Lenguajes de uso especfico usados comnmente
como SQL y Lex/Yacc, utilizan algunos elementos de programacin funcional,
especialmente al procesar valores mutables. Las hojas de clculo tambin pueden ser
consideradas lenguajes de programacin funcional.
La programacin funcional tambin puede ser desarrollada en lenguajes que no estn
diseados especficamente para la programacin funcional. En el caso de Perl, por
ejemplo, que es un lenguaje de programacin imperativo, existe un libro que describe
como aplicar conceptos de programacin funcional. JavaScript, uno de los lenguajes ms
ampliamente utilizados en la actualidad, tambin incorpora capacidades de programacin
funcional. Python tambin incorpora particularidades de los lenguajes funcionales como
listas de comprensin y funciones de tratamiento de listas como matemtica de
conjuntos. Java en su versin 8, esta incorporando la programacin funcional, as como
el uso de las expresiones lambda.
Utilidad
El objetivo es conseguir lenguajes expresivos y matemticamente elegantes, en los que no
sea necesario bajar al nivel de la mquina para describir el proceso llevado a cabo por el
programa, y evitar el concepto de estado del cmputo. La secuencia de computaciones
Las funciones de orden superior permiten la aplicacin parcial, una tcnica en la que se
aplica una funcin a sus argumentos uno a la vez, con cada aplicacin devolver una
nueva funcin que acepta el siguiente argumento. Esto le permite a uno expresar, por
ejemplo, la funcin sucesor como el operador de suma aplicada parcialmente al nmero
natural uno.
Funciones puras
Las funciones puramente funcionales (o expresiones) no tienen efectos secundarios
(memoria o E/S). Esto significa que las funciones puras tienen varias propiedades tiles,
muchas de las cuales pueden ser utilizados para optimizar el cdigo:
Si una funcin pura se llama con parmetros que no causan efectos secundarios,
el resultado es constante con respecto a la lista de parmetros (a veces llamada
transparencia referencial), es decir, si la funcin pura se llama de nuevo con los
mismos parmetros, el mismo resultado ser devuelto (esto puede habilitar las
optimizaciones de almacenamiento en cach).
reconocida y optimizada mediante un compilador dentro del mismo cdigo utilizado, para
implementar las iteraciones en un lenguaje imperativo. El estndar del esquema del
lenguaje requiere implementaciones para conocer y optimizar la recursividad mediante
una cola. La optimizacin de la recursividad mediante una cola puede ser implementada
transformando el programa a un estilo de pase de continuidad durante la compilacin,
entre otros enfoques.
Los patrones comunes de recursividad puede ser factorizados usando funciones comunes
ms grandes, con catamorfismos y anamorfismos (pliegues y despliegues), siendo
estos los ejemplos ms evidentes. Tal y como las mayores funciones ms comunes tienen
un rol anlogo para construir estructuras de control se tienen los iteradores en los
lenguajes imperativos.
La mayora de los lenguajes de programacin funcional de propsito general permiten la
recursividad sin restricciones y superan el test de Turing, lo que hace que el programa
que se interrumpe no pueda tomar un decisin, lo que puede causar una falta de solidez
en el razonamiento ecuacional y generalmente requiere introducir inconsistencia dentro
de la lgica expresada por los tipos del sistema del lenguaje. Algunos lenguajes de
propsito especial como Coq permiten tan slo recursividad bien fundamentada y tienen
una normalizacin fuerte(clculos no finalizados pueden ser expresados tan slo con
flujos de valores infinitos llamados codata) En consecuencia, estos lenguajes fallan el test
de Turing y declarar funciones ciertas en ellos es imposible, pero pueden declarar una
amplia clase de clculos interesantes mientras evitan los problemas producidos por la
recursividad sin restricciones. La programacin funcional limitada a la recursividad bien
construida con unas cuantas restricciones ms se llama programacin funcional total.
Evaluacin estricta frente a la no estricta
Los lenguajes funcionales pueden ser clasificados por el hecho de usar evaluacin
estricta(eager) o no estricta(lazy), conceptos que hacen referencia a cmo los argumentos
de las funciones son procesados cuando una expresin est siendo evaluada. La
diferencia tcnica est en la notacin semntica de las expresiones que contienen clculos
fallidos o divergentes. Bajo la evaluacin estricta, la evaluacin de cualquier trmino que
contenga un sub-trmino fallido har que este sea de por s fallido.
Por ejemplo, la expresin:
print length([2+1, 3*2, 1/0, 5-4])
fallar bajo evaluacin estricta por la divisin por cero en el tercer elemento de la lista.
Utilizando evaluacin no estricta, el tamao de la funcin devolver un valor de 4( por
ejemplo el nmero de elementos de la lista) ya que evaluar esto no afectar al estar
evaluando los que componen la lista. En resumen, la evaluacin estricta evala por
completo los argumentos a menos que sus valores requieran evaluar la propia funcin que
se llama a s misma.
La implementacin de la estrategia comn para evaluacin no estricta en los lenguajes
funcionales es la de reduccin mediante un grafo. La evaluacin no estricta es utilizada
por defecto en multitud de lenguajes funcionales puros, incluidos Miranda, Clean y
Haskell.
Hughes (1984) defenda la evaluacin no estricta como un mecanismo para mejorar la
modularidad de los programas a travs de la separacin de tareas, a partir de la
implementacin de productores y consumidores de flujos de datos de forma fcil e
independiente. Launchbury (1993) describe algunas dificultades que tena la evaluacin
no estricta, particularmente al analizar los requisitos de almacenamiento de los
programas, y propone una semntica operacional para ayudar durante el anlisis. Harper
(2009) propone incluir ambas tcnicas (evaluacin estricta y no estricta) en el mismo
lenguaje, utilizando los tipos del sistema del lenguaje para distinguirlas.
Tipo de sistemas
Especialmente desde el desarrollo de tipos de inferencia de Hindley - Milner en la dcada
de 1970, los lenguajes de programacin funcionales han tendido a utilizar el clculo con
tipo lambda, en comparacin con el clculo lambda sin tipo utilizado en Lisp y sus
variantes (tales como el lenguaje scheme). El uso de tipos de datos algebraicos y la
coincidencia de patrones hace que la manipulacin de estructuras de datos complejas
convenientes y expresivos, la presencia de comprobaciones estrictas de tipos en tiempo de
compilacin hace que los programas sean ms fiable, mientras que la inferencia de tipos
libera al programador de la necesidad de declarar manualmente los tipos para el
compilador.
Algunos lenguajes funcionales orientados a la investigacin, tales
como Coq, Agda, Cayenne y Epigram se basan en la teora de tipo intuicionista, que
permite a los tipos a depender de los trminos. Estos tipos se denominan tipos
dependientes. Estos sistemas de tipo no tienen un tipo decidible inferencia y son difciles
de entender y programar con plantillas de citacin. Pero tipos dependientes pueden
expresar proposiciones arbitrarias en la lgica de predicados.
A travs del isomorfismo de Curry-Howard, entonces, mecanografiados a programas en
estas lenguas se convierten en una forma de escribir las pruebas matemticas formales
de las que un compilador puede generar cdigo de certificado. Si bien estas lenguas son
principalmente de inters en la investigacin acadmica (incluyendo las matemticas
formalizadas), han comenzado a ser utilizado en la ingeniera tambin. Compcert es un
compilador para un subconjunto del lenguaje de programacin C que se escribe en Coq y
verific formalmente. Una forma limitada de tipos dependientes llamados tipos de datos
algebraicos generalizados (GADTs) puede ser implementado de una manera que ofrece
Simulacin de estados
Hay tareas (como por ejemplo, el mantenimiento del saldo de una cuenta bancaria) que a
menudo parecen implementadas con estados. La programacin funcional pura acta
sobre esas tareas, tareas de entrada/salida de datos tales como entrada de datos por
parte del usuario y mostrar resultados por pantalla, de una forma diferente.
El lenguaje de programacin funcional Haskell lo implementa usando mnadas,
estructura que representa clculos que se describen como una secuencia de pasos,
derivada de la teora de categoras.
Las mnadas ofrecen una forma de abstraer ciertos tipos de patrones computacionales,
incluyendo (pero no limitado a) el diseo de operaciones con estados cambiantes (y otras
acciones secundarias tales como entrada/salida de datos) de una manera imperativa sin
perder la pureza. Mientras las mnadas existentes pueden ser fciles de aplicar en un
programa usando las plantillas y ejemplos adecuados, muchos estudiantes tienen
problemas para entenderlo conceptualmente, por ejemplo cuando se les pide definir
nuevas mnadas. (lo que a veces resulta necesario para ciertos tipos de libreras)2
Otra forma en la que los lenguajes funcionales pueden simular estados es rodeando una
estructura de datos que representa el estado actual como un parmetro para llamadas a
funciones. En cada llamada a funcin, se crea una copia de esta estructura de datos que
se diferencia con el resultado de la funcin. Esto se conoce como estilo de paso de
estado.
Los lenguajes funcionales no puros normalmente incluyen mtodos para gestionar el
cambio de estado ms directamente.Clojure por ejemplo, usa una gestin de referencias
que pueden ser actualizadas aplicando funciones puras al estado actual. Este tipo de
enfoque permite el cambio de estado, promoviendo el uso de funciones puras como la
mejor forma de realizar clculos.
Mtodos alternativos como Hoare logic, el cual es un sistema formal con un conjunto de
reglas lgicas que sirven para razonar con rigor acerca de la correccin de programas, y la
singularidad han sido desarrollados para realizar un seguimiento de los efectos
secundarios en los programas. Algunos lenguajes de investigacin modernos usan
sistemas de efectos para hacer explcita la presencia de efectos colaterales.
Cuestiones de eficiencia
Los lenguajes de programacin son tpicamente menos eficientes en el uso de CPU y
memoria que los lenguajes imperativos como pueden ser C y Pascal. Esto est relacionado
con el hecho de que algunas estructuras de datos de tamao indefinido como los vectores
tienen una programacin muy sencilla usando el hardware existente, el cual es
unamquina de Turing bastante evolucionada. Se puede acceder muy eficientemente a las
posiciones del array con CPUs con un alto grado de perfeccionamiento, haciendo pre
bsquedas eficientemente a travs de las memorias cach o manejado con
instrucciones SIMD. Y no es fcil crear componentes homlogos inmutables de propsito
general con la misma eficiencia. Para lenguajes puramente funcionales, el peor caso
descendente es el logartmico en el nmero de celdas de memoria usadas, porque las
estructuras de memoria que cambian de tamao pueden ser representadas por
estructuras de datos puramente funcionales con tiempo de acceso logartmico, como por
ejemplo un rbol equilibrado. Sin embargo, tales retrasos no son universales. Para
programas que realizan clculos numricos intensivos, los lenguajes funcionales tales
como OCaml y Clean son algo ms lentos que C. Para programas que manejan grandes
matrices y bases de datos multidimensionales, los vectores de los lenguajes funcionales,
como J y K, fueron diseados optimizando su velocidad.
La inalterabilidad de los datos puede llevar en muchos casos a ejecuciones eficientes
permitiendo al compilador hacer suposiciones que en un lenguaje imperativo resultaran
arriesgadas, aumentando las probabilidades para la expansin en lnea, que es una
optimizacin del compilador que sustituye en el lugar de la llamada a una funcin con el
cuerpo del destinatario de la llamada mejorando el uso del tiempo y espacio en tiempo de
ejecucin.
La evaluacin perezosa es una estrategia de evaluacin que retrasa el clculo de una
expresin hasta que su valor sea necesario, tambin puede mejorar la velocidad del
problema, incluso asintticamente, mientras que puede reducir la velocidad por un factor
constante, sin embargo puede producir prdidas de memoria si se usa de manera
incorrecta. Launchbury 1993 discute de manera terica los problemas relacionados con
las prdidas de memoria de evaluacin perezosa, y OSullivan et al. 2008 da algunos
consejos prcticos para el anlisis y la solucin de estos problemas. Sin embargo, las
implementaciones ms generales de evaluacin perezosa hace un uso extensivo de cdigo
sin referencia y los datos llevan a cabo un funcionamiento pobre en los procesadores
modernos con un alto grado de paralelismo y cachs multinivel, donde un fallo de
cach puede producir un coste de cientos de ciclos de reloj.
Lenguajes funcionales
Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes
funcionales hbridos ms conocidos
son Scala, Lisp, Clojure, Scheme, Ocaml, SAP y Standard ML (estos dos ltimos,
descendientes del lenguajeML). Erlang es otro lenguaje funcional de programacin
concurrente. Mathematica permite la programacin en mltiples estilos, pero promueve la
programacin funcional. R tambin es un lenguaje funcional dedicado a la
Ejemplo: Si se tiene la expresin "Sea x tal que f(x) = 2 , no se distingue con claridad si
se refiere a la definicin de la funcin constante de valor 2 o al punto x especfico en el
que una funcin f ya definida toma el valor 2. Las variables siempre se refieren a un valor
y no a una localizacin de memoria. No hay concepto de localizacin de memoria y por
tanto la expr. x=x+1 no tiene sentido.
La programacin funcional debe por esto eliminar el concepto de variable excepto como
nombre de un valor. Por lo anterior, se concibi que en la Programacin Funcional la
asignacin no fuera permitida como instruccin.
En programacin funcional pura no existen variables, slo existen constantes, parmetros
y valores, an cuando en la prctica la mayora de los lenguajes de programacin
funcionales no son puros pues retienen algunas nociones de variables y asignaciones.
Como no hay variables ni asignacin, tampoco existen los ciclos al estilo de los de los
lenguajes tradicionales ya que los mismos trabajan con una variable de control que se va
reasignando (decrementando o incrementando). Esto se logra en un lenguaje funcional
mediante la recursin.
begin
if (v=0) then return u
else
return MCD(v,u mod v);
end; {MCD}
Consecuencias de ausencia de variables y asignacin
Otra consecuencia de la ausencia de variables y de asignacin es el hecho de que el valor
de cualquier funcin depende solamente de los valores de sus parmetros y no de
llamados previos a otras o a la misma funcin, as como que el valor de cualquier funcin
no depende del orden de evaluacin de sus parmetros, lo cual se conoce por el nombre
de transparencia referencial, lo que facilita el empleo de la programacin funcional se
utiliza en aplicaciones concurrentes. El hecho de que en los lenguajes funcionales no
existen las variables y existe la transparencia referencial, hacen la semntica de los
programas funcionales particularmente conveniente:
Caractersticas
Las caractersticas ms generales de la programacin funcional se resumen en:
El valor de una expresin solo depende de los valores de sus subexpresiones, si las
tiene.
Se dice que una funcin (f x y z) tiene un efecto colateral si los valores de x, y, y/o z
cambian en el entorno de llamada durante la aplicacin de la funcin a sus argumentos,
o si alguna otra accin ocurre mientras se evala f.
Una funcin definida con todos los parmetros por valor y donde no se hacen
asignaciones a las variables globales, no tiene efectos colaterales.
La mayora de las implementaciones de LISP incorporan algunos efectos colaterales y
tipos de datos integrados. stos han sido incluidos para hacer ms sencillo un cdigo
fcilmente legible y las implementaciones eficientes.
Semntica limpia
Algunas de las caractersticas que hacen que un lenguaje sea til y confiable son en las
cuales el lenguaje significa lo que dice -no es ambiguo- y los resultados de un programa
pueden verificarse. En un lenguaje funcional f(3) siempre devolver el mismo resultado,
mientras que en un lenguaje imperativo, como Pascal, ste puede no ser el caso.
Las funciones son valores de primera clase. Eso significa que las funciones tienen
la misma jerarqua que cualquier otro valor. Una funcin puede ser el valor de una
expresin, puede pasarse como argumento y puede colocarse en una estructura de
datos.
Cuestiones finales
El estilo de la programacin funcional puede ser usado y lo est siendo cada vez ms en
lenguajes imperativos (Ejemplo: PASCAL) por las mismas razones por las cuales el uso de
los lenguajes funcionales se ha incrementado: la simplicidad de la semntica y la
resultante claridad de los programas. El requerimiento bsico para programar
funcionalmente en cualquier lenguaje es que el mismo permita la recursin as como un
mecanismo de funciones general y adecuado.
Un problema tpico en este estilo de programacin es el costo de ejecucin de los ciclos
mediante la recursin. Incluso con los procesadores modernos, que reducen
sustancialmente la sobrecarga de la llamada a procedimiento, las implementaciones
recursivas son ms lentas que las que usan los ciclos standard.
Programacin GUI
La programacin grfica o programacin de GUI es dura, sobre todo si vienes del
desarrollo web. Para empezar, todo elemento que conforma la interfaz de usuario de la
aplicacin debe de serdefinido con detalle. Su posicin, tamao, color, aspecto,
comportamiento, etc, etc. Por eso existen los IDEs y los Frameworks, para hacernos la
vida ms sencilla a los desarrolladores.
En segundo lugar, la programacin con GUI es difcil por que existen muchos detalles y
conceptos que dependen completamente del manejo de eventos. Cualquier Widget en la
interfaz de usuario tiene uno o ms eventos asociados y a su vez emite uno o ms eventos
hacia el mundo exterior. El hardware de entrada como el ratn y el teclado, tambin
generan eventos y esos eventos tambin pueden ser capturados por los widgets de la
interfaz de usuario.
La mayora de herramientas de creacin de interfaces grficas de usuario se distribuyen
como frameworks. Los frameworks implementan el bucle de eventos y la cola de
eventos para que no tengamos que implementarlos nosotros mismos. Eso est bien, pero
el mecanismo queda encerradodentro del framework y si no estamos acostumbrados a la
programacin dirigida por eventos algunos conceptos pueden resultar
realmente confusos.
Y no solo esos bucles quedan ocultos dentro del funcionamiento del framework, sino que
tambin quedan ocultas mecnicas bsicas que es necesario comprender para llegar a
tener un entendimiento claro de la magia detrs de este paradigma. Un ejemplo claro es
el patrn observer.
El patrn Observer
La idea principal detrs del patrn observer es que existe una entidad con estados
cambiantes y una o ms entidades observndola. Los observadores esperan a que la
entidad observada les informe de un cambio de estado a travs de un evento que puede
ser de su inters, por lo que los observadores se registran con la entidad observada.
Cuando ocurre un evento, la entidad observada mira en su lista de observadores y
notifica a aquellos que se registraron para recibir eventos de ese tipo. Los
observadores dejaron instrucciones detalladas de como puede la entidad observada
ponerse en contacto con ellos para recibir los eventos. A este patrn tambin se le
llama El Principio de Hollywood como parodia de la tpica frase de Hollywood te
llamaremos en cuanto tengamos un papel para ti.
El sistema de ranuras y seales de Qt y el sistema de seales de GTK son ambos
implementaciones del patrn de diseo Observer.
Eventos y MVC
En el patrn de diseo MVC los eventos y el patrn de diseo observer conforman
el ncleo durodel funcionamiento interno del sistema. En en patrn de diseo MVC,
el Modelo es un objeto que gestiona los datos y el comportamiento de la aplicacin, es
la entidad observable en el patrn observer.
Las Vistas se registran con el Modelo como observadores del mismo. Cuando
el Controlador realiza cambios en el Modelo, notifica esos cambios a sus observadores
registrados que modifican la interfaz de la aplicacin.
En el patrn de diseo MVC los objetos de evento incluyen grandes cantidades de
datos que viajan de una parte a otra de la aplicacin a travs del viejo y rado patrn de
manejadores de eventos.
Programacin asncrona
La programacin asncrona pretende llevar este patrn de diseo a todos los aspectos del
desarrollo de software por medio de mecanismos que articulan de una u otra forma el uso
de eventos, seales y callbacks en todas las llamadas a funciones y mtodos llevados a
cabo por la aplicacin utilizando adems mltiples hilos de ejecucin normalmente en
una pila o piscina de hilosgestionada por un bucle de eventos extremadamente complejo.
Algunos lenguajes como .NET lo incorporan como parte del lenguaje de facto (versin 3.0
o superiores). Otros lenguajes disponen de libreras, herramientas o frameworks que
implementan la programacin asncrona. As tenemos Twisted para Python, EventMachine
para Ruby, Node.js para JavaScript, y muchas otras que seguramente desconozco para
muchos otros lenguajes.
En esta pequea introduccin a la programacin dirigida por eventos hemos hecho un
repaso por la historia de este paradigma de programacin que lleva con nosotros mucho
tiempo aunque para algunos es casi desconocido. En prximas entregas hablaremos
sobre las diferentes herramientas a nuestra disposicin a la hora de programar de forma
asncrona en escenarios donde se requiere de un tiempo de respuesta y rendimiento
superior a lo normal.
Pointcut (Puntos de Corte) define los Consejos que se aplicarn a cada Punto de
Cruce. Se especifica mediante Expresiones Regulares o mediante patrones de
nombres (de clases, mtodos o campos), e incluso dinmicamente en tiempo de
ejecucin segn el valor de ciertos parmetros.
que hay ciertas decisiones de diseo que son difciles de capturar, debido a que
determinados problemas no se pueden encapsular claramente de igual forma que los que
habitualmente se resuelven con funciones u objetos.
Desarrollo en POA
AspectC++] es un compilador que permite desarrollar aspectos en C++.
AspectJ es una extensin Java del proyecto Eclipse para ayudar en el desarrollo orientado
a aspectos.
Aspect, un mdulo Perl disponible en CPAN para la Programacin Orientada a Aspectos
(en ingls).
PHP-AOP (AOP.io) es una lib que proporciona todo el paradigma de la POA en PHP.
phpAspect es una extensin PHP para implementar el paradigma de la POA, que,
mediante rboles de decisin XML, realiza el weaving del software para ser ejecutado
como PHP estndar.
FLOW3 es un framework MVC de PHP incluye un mdulo para poder realizar
Programacin orientada a Aspectos en nuevos desarrollos.
AOP con SpringFramework 2.5 es un Framework de Java que permite programar en el
paradigma de Aspectos utilizando Anotacin Java
Aspyct AOP es un mdulo de Python que permite incluir Programacin orientada a
Aspectos a programas ya existentes escritos en Python o a nuevos desarrollos.
Los objetos son inaccesibles, e impiden que otros objetos, los usuarios, o incluso los
programadores conozcan cmo est distribuda la informacin o qu informacin hay
disponible. Esta propiedad de los objetos se denomina ocultacin de la informacin.
Esto no quiere decir, sin embargo, que sea imposible conocer lo necesario respecto a un
objeto y a lo que contiene. Si as fuera no se podra hacer gran cosa con l. Lo que sucede
es que las peticiones de informacin a un objeto. deben realizarse a travs
de mensajes dirigidos a l, con la orden de realizar la operacin pertinente. La respuesta
a estas ordenes ser la informacin requerida, siempre que el objeto considere que quien
enva el mensaje est autorizado para obtenerla.
El hecho de que cada objeto sea una cpsula facilita enormemente que un objeto
determinado pueda ser transportado a otro punto de la organizacin, o incluso a otra
organizacin totalmente diferente que precise de l. Si el objeto ha sido bien construdo,
sus mtodos seguirn funcionando en el nuevo entorno sin problemas. Esta cualidad
hace que la OOP sea muy apta para la reutilizacin de programas.
Organizacin de los objetos
En principio, los objetos forman siempre una organizacin jerrquica, en el sentido de que
ciertos objetos son superiores a otros de cierto modo.
Existen varios tipos tipos de jerarquas: sern simples cuando su estructura pueda ser
representada por medio de un "arbol". En otros casos puede ser ms compleja.
En cualquier caso, sea la estructura simple o compleja, podrn distinguirse en ella tres
niveles de objetos.
-La raz de la jerarqua. Se trata de un objeto nico y especial. Este se caracterza por
estar en el nivel ms alto de la estructura y suele recibir un nombre muy genrico, que
indica su categora especial, como por ejemplo objeto madre, Raz o Entidad.
-Los objetos intermedios. Son aquellos que descienden directamente de la raz y que a su
vez tienen descendientes. Representan conjuntos o clases de objetos, que pueden ser muy
generales o muy especializados, segn la aplicacin. Normalmente reciben nombres
genricos que denotan al conjunto de objetos que representan, por ejemplo, VENTANA,
CUENTA, FICHERO. En un conjunto reciben el nombre de clases o tipos si descienden de
otra clase o subclase.
-Los objetos terminales. Son todos aquellos que descienden de una clase o subclase y no
tienen descendientes. Suelen llamarse casos particulares, instancias o tems porque
representan los elementos del conjunto representado por la clase o subclase a la que
pertenecen.
Veamos ahora en detalle los tres elementos mencionados en "Estructura de un Objeto".
1. RELACIONES
Las relaciones entre objetos son, precisamente, los enlaces que permiten a un objeto
relacionarse con aquellos que forman parte de la misma organizacin.
Las hay de dos tipos fundamentales:
-Relaciones jerrquicas. Son esenciales para la existencia misma de la aplicacin porque la
construyen. Son bidireccionales, es decir, un objeto es padre de otro cuando el primer
objeto se encuentra situado inmediatamente encima del segundo en la organizacin en la
que ambos forman parte; asimismo, si un objeto es padre de otro, el segundo es hijo del
primero (en la fig. 2, B es padre de D,E y F, es decir, D,E y F son hijos de B; en la fig. 3,
los objetos B y C son padres de F, que a su vez es hijo de ambos).
Una organizacin jerrquica simple puede definirse como aquella en la que un objeto
puede tener un solo padre, mientras que en una organizacion jerrquica compleja un hijo
puede tener varios padres).
-Relaciones semnticas. Se refieren a las relaciones que no tienen nada que ver con la
organizacin de la que forman parte los objetos que las establecen. Sus propiedades y
consecuencia solo dependen de los objetos en s mismos (de su significado) y no de su
posicin en la organizacin.
Se puede ver mejor con un ejemplo: supongamos que vamos a construir
un diccionario informatizado que permita al usuario obtener la definicin de una palabra
cualquiera. Supongamos que, en dicho diccionario, las palabras son objetos y que la
organizacin jerrquica es la que proviene de forma natural de la estructura de nuestros
conocimientos sobre el mundo.
La raz del diccionario podra llamarse TEMAS. De ste trmino genrico descendern tres
grandes ramas de objetos llamadas VIDA, MUNDO y HOMBRE. El primero (vida)
comprender las ciencias biolgicas: Biologa y Medicina. El segundo (mundo), las
ciencias de la naturaleza inerte: las Matemticas, la Fsica, la Qumica y la Geologa. El
tercero (hombre) comprender las ciencias humanas: la Geografa, la Historia, etc.
Veamos un ejemplo: estableceremos la relacin trabajo entre los objetos NEWTON y
OPTICA y la interpretaremos diciendo que significa que Newton trabaj en ptica (vase la
fig. 4). La relacin es, evidentemente, semntica, pus no establece ninguna connotacin
jerrquica entre NEWTON y OPTICA y su interpretacin depende exclusivamente
del significado de ambos objetos.
La existencia de esta relacin nos permitir responder a preguntas como:
Quin trabaj en ptica?
En qu trabaj Newton?
Quien trabaj en Fsica?
Las dos primeras se deducen inmediatamente de la existencia de la relacin trabajo. Para
la tercera observamos que si Newton trabaj en ptica automticamente sabemos que
trabaj en Fsica, por ser ptica una rama de la Fsica (en nuestro diccionario, el objeto
OPTICA es hijo del objeto FISICA). Entonces gracias a la OOP podemos responder a la
tercera pregunta sin necesidad de establecer una relacin entre NEWTON y FISICA,
apoyandonos slo en la relacin definida entre NEWTON y OPTICA y en que OPTICA es
hijo de FISICA. De este modo se elimina toda redundancia innecesaria y la cantidad de
informacin que tendremos que definir para todo el diccionario ser mnima.
2. PROPIEDADES
Todo objeto puede tener cierto nmero de propiedades, cada una de las cuales tendr, a
su vez, uno o varios valores. En OOP, las propiedades corresponden a las clsicas
"variables" de la programacin estructurada. Son, por lo tanto, datos encapsulados dentro
del objeto, junto con los mtodos (programas) y las relaciones (punteros a otros objetos).
Las propiedades de un objeto pueden tener un valor nico o pueden contener un conjunto
de valores mas o menos estructurados (matrices, vectores, listas, etc.). Adems, los
valores pueden ser de cualquier tipo (numrico, alfabtico, etc.) si el sistema de
programacin lo permite.
Pero existe una diferencia con las "variables", y es que las propiedades se pueden heredar
de unos objetos a otros. En consecuencia, un objeto puede tener una propiedad de
maneras diferentes:
-Propiedades propias. Estn formadas dentro de la cpsula del objeto.
-Propiedades heredadas. Estan definidas en un objeto diferente, antepasado de ste
(padre,"abuelo", etc.). A veces estas propiedades se llaman propiedades miembro porque
el objeto las posee por el mero hecho de ser miembro de una clase.
3. METODOS
Una operacin que realiza acceso a los datos. Podemos definir mtodo como
un programa procedimental o procedural escrito en cualquier lenguaje, que est asociado
a un objeto determinado y cuya ejecucin slo puede desencadenarse a travs de un
mensaje recibido por ste o por sus descendientes.
Son sinnimos de 'mtodo' todos aquellos trminos que se han aplicado tradicionalmente
a los programas, como procedimiento, funcin, rutina, etc. Sin embargo, es conveniente
utilizar el trmino 'mtodo' para que se distingan claramente las propiedades especiales
que adquiere un programa en el entorno OOP, que afectan fundamentalmente a la forma