miércoles, 30 de noviembre de 2016

Factorial recursivo en Erlang: Tratamiento de casos y guardias

%Programa del factorial en Erlang....

-module(facto). % Archivo facto.erl, no se acepta de otro modo.
-export([fact/1]). % Función factorial a ser visible externamente.
% Toda función invocar desde fuera del módulo debe declararse aquí,
% en donde la notación fact/1 señala que fact es una función con un solo
% argumento.

fact(0) -> 1; %primer caso, notar la flecha y el punto y coma...
fact(N) when (N>0)
            and is_integer(N) -> N*fact(N-1). %segundo caso, notar el when
% que actúa como filtro con dos condiciones y la versión recursiva
% finalizada con un punto.
% Se dice que fact/1 fue definido recursivamente por dos cláusulas.
% La recursión es lineal, pero el espacio también se consume linealmente.

Propuesta de programación concurrente

La siguiente es una propuesta de programación concurrente sintetizada
del libro de Armstrong, Erlang Programming:


a) Identifique qué procesos serían los necesarios para llevar a cabo
una tarea distribuida.

b) Asigne una función de entrada al proceso: la función debe tanto
implementar actividades básicas del proceso como actividades de recepción
y envío de mensajes.

c) Vea si es necesario que los procesos tengan un nombre asignado.

d) Vea si se requieren procesos en una organización jerárquica o no.

e) Por cada necesidad de comunicación entre procesos, identifique qué
mensajes se deberían intercambiar. Para esto,
   e.1) Envíe un mensaje desde el proceso con nombre A.
   e.2) Escriba un proceso B que reciba el mensaje de A.
   e.3) Vea si A requiere retroalimentación de parte de B.
   e.4) Mantenga abierto o cierre este esquema de zig-zag.

f) Incremente bajo revisión, nuevas funciones, mensajes y respuestas.

Notemos que no hay una parte de "terminación" de este esquema de desarrollo.
Parafraseando al gran escritor francés Paul Valery: "La programación de un
sistema distribuido nunca se termina, solo se abandona."



martes, 29 de noviembre de 2016

Programación concurrente

En un sentido bien definido, en la actualidad la programación ha dejado en gran medida de ser secuencial para tornarse en altamente concurrente. En algunos inicios azarosos, la concurrencia se simulaba mediante hilos, que a su vez solicitaban tiempo de proceso en procesadores unitarea. Ahora la tecnología exige una y otra vez que se elaboren sistemas distribuidos. Y la mejor forma de elaborar algo es teniendo las herramientas correctas. Erlang es una herramienta correcta para cierto tipo de concurrencia, la que sigue un modelo basado en paso de mensajes, con asincronía, y con procesos (no hilos) ligeros.


En los sistemas distribuidos deben existir al menos dos componentes que se
coordinen (o no se coordinen en absoluto) para que el sistema funcione. Esto equivale a pensar al programar en al menos dos puntos de vista: el de uno o el otro componente. Y no podría darse tal pensamiento si un componente no interactúa con el otro (caso de no coordinación entre sí, el cual es cómputo en
paralelo). Por eso es tan exigente programar concurrentemente. Pero aún más,
el sistema al desarrollarse rara vez tendrá un comportamiento determinístico:
no es fácil ver qué sucederá en el futuro del sistema. Y por último, las fallas
pueden venir desde diversos puntos que no fueron en su momento considerados.

La propuesta de este blog nace para compartir algunas experiencias en programación concurrente. Empezaremos haciendo un proyecto sencillo: un servidor que
"despache" números factoriales y de Fibonacci. Pasaremos por varias otras etapas, y llegaremos a la formulación (suficiente para nuestros propósitos)
de simular un conjunto de robots que limpian concurrentemente cierta área
de piso. El resultado debe convencernos que Erlang es un buen lenguaje
para este tipo de tareas, y ahí donde sea necesario manejaremos algún tipo
de recursos compartidos, viendo qué se puede hacer para evitar que los recursos se bloqueen, se mal usen, o se corrompan.

Bienvenida

Estimados Andrés, Gerardo y Rodrigo: les anuncio que éste será nuestro
blog (tipo cuaderno de notas) que nos servirá para compartir experiencias
de programación concurrente en Erlang. Siéntase libres para poner entradas
y hacer notas donde gusten.