sábado, 13 de noviembre de 2010

Lenguaje Funcional Erlang

Erlang es un lenguaje funcional y concurrente que fue desarrollado por Ericcson para la aplicación de telecomunicaciones.
Aunque Ericcson era originalmente el propietario del lenguaje Erlang, en el año 1998 el lenguaje fue cedido como open source.

Erlang es un de los pocos lenguajes de programación declarativos que es exitoso en el mundo empresarial.
Además pertenece a los lenguajes orientados a mensajes, los cuales proporcionan concurrencia osuando procesos paralelos. La concurrencia, es que varios procesos se lleven a cabo (sean ejecutados) al mismo tiempo.

Hablando de Erlang como un lenguaje orientado a mensajes, la interacción que se da entre los threads (procesos) en dichos lenguajes, se lleva a cabo mediante el envío y la recepción de mensajes.

El equipo de Erlang desarrollo ciertas caracterisitcas en el lenguajes de acuerdo a los requisitos que tienen las aplicaciones de telecomunicaciones, las cuales son: alta disponibilidad, modificación del código sin detener la aplicación, y demás.

Bueno, tomando en cuenta estos requisitos, algunas de las caracteristicas desarrollados por el equipo de Erlang son:
  • Concurrencia
  • Lenguaje funcional
  • Tolerancia a fallos
  • Reemplazo de código en caliente
  • Comunicación entre los procesos mediante mensajes.
El soporte de concurrencia, se dice que es la mayor fortaleza de Erlang, y como ya lo mencione anteriormente, la concurrencia es cuando se llevan a cabo o se ejecutan varios procesos al mismo tiempo.

Además ,Erlang es un lenguaje funcional, ya que esta estructurado por definición de funciones.
Los programas en Erlang se componen de bloques funcionales, llamados funciones.
Podemos identificar una función en un programa en Erlang, mediante el nombre y la aridad de la función, dicha aridad es el número de datos de entrada, que se permitirán en la función. Es decir, la función volumen/3, permite solo 3 datos de entrada mientras que la función area/2, permite solo 2 datos de entrada.

Algo muy importante que hay que mencionar es que pueden coexisitir sin ningun problema dos funciones con el mismo nombre y diferente aridad, como por ejemplo: multiplicación/2 y multiplicación/3, ya que las dos funciones son diferentes.

La definición de una función es la siguiente:
nombre-función(Argumento1, Argumento2, ...)  ->
instruccion,
instruccion,
Resultado-a-devolver.
Las funciones se agrupan en módulos, los cuales son las unidades mínimas de compilación en Erlang. Cada módulo tiene un nombre, único en el programa y se almacena en un fichero fuente, y dicho fichero tiene el nombre del módulo.
Las primeras líneas del fichero contienen la definición del módulo y las funciones que se exportan; las funciones que no sean exportadas, no podrán ser utilizadas fuera de este mismo módulo.

En Erlang el módulo y su función o funciones se escriben de la manera siguiente:
-module(nombre_modulo).
-export([funcion1/2, funcion2/1, funcion3/4]).

También se pueden poner las funciones por separado, es decir, así:
-module(nombre_modulo).
-export([funcion1/2]).
-export([funcion2/1]).
-export([funcion3/4]).
Hay que poner atención en el . que hay al final del módulo y de las funciones exportadas.

En cuanto a la tolerancia a fallos, se puede mencionar que la idea en Erlang sobre estos errores o fallos que se pueden dar, es encontrar una buena forma de manejar dichos errores y problemas en lugar de prevenirlos.

En el reemplazo de código en caliente, puedo mencionar que la unidad mínima de reemplazo son los módulos.
Pueden estar cargadas en memoria al mismo tiempo dos versiones diferentes de un mismo módulo, pero cuando se realiza la llamada a una función, la versión que se utilizará será la última versión disponible del módulo.

Como lo mencione anteriormente la interacción o comunicación que hay entre los threads (procesos), se realiza mediante mensajes.

Bueno, a continuación les mostraré un sencillo ejemplo de un programa en Erlang, al que llame operaciones.
La extensión de los programas en Erlang es .erl
Además el nombre del módulo del programa deberá ser el mismo nombre del programa, en este caso el nombre del módulo es operaciones.

Código
-module(operaciones).
-export([suma/2]).
-export([resta/2]).
-export([multiplicacion/2]).
-export([division/2]).

suma(A,B) ->
A+B.

resta(C,D) ->
C-D.

multiplicacion(E,F) ->
E*F.

division(G,H) ->
G / H.
En sí, este programa realiza las operaciones básicas, como son la suma, la resta, la multiplicación y la división.

En la parte de:
-module(operaciones).
-export([suma/2]).
-export([resta/2]).
-export([multiplicacion/2]).
-export([division/2]).
estan introducidos el módulo y las diferentes funciones junto con su aridad, dichas funciones no pueden llevar acentos. Cada función tiene una aridad de 2, es decir cada función solo puede recibir 2 datos de entrada.
Al final de cada módulo y de cada función exportada deberá ir un punto .
Y en esta parte:
suma(A,B) ->
A+B.

resta(C,D) ->
C-D.

multiplicacion(E,F) ->
E*F.

division(G,H) ->
G / H.
se encuentra cada función con su instrucción.

Dentro de los () de cada función, van las variables, que serán los datos que el usuario introducirá, es decir, los datos de entrada. Estas variables solo pueden ir en mayúscula, y en todas las funciones se pueden poner las mismas variables, en este caso no lo hicé así.
Al final de cada instrucción, deberá ir también un punto .

Bueno para compilar este programa, iremos a la terminal y escribiremos erl (si ya lo tenemos instalado), y después teclearemos lo siguiente:
c(operaciones).
Es decir, se escribe c(nombre_del_programa)). (con punto al final).
Y si el programa esta totalmente bien, si ningún error, entonces nos aparecerá:
{ok,operaciones}
Y ahora si, ya podemos introducir datos, para que sean realizadas las distintas operaciones.
Por ejemplo, para una suma, se deberá introducir, lo siguiente:
operaciones:suma(A,B).
En donde A,B serán cualesquiera números.
Bueno, primero se pone el nombre del módulo (o nombre del programa, que es el mismo nombre del módulo), después :(dos puntos) y luego el nombre de la función (suma, resta, multiplicacion o division) y seguido dentro de paréntesis, se escriben los valores que queremos que sean sumados, restados, multiplicados o divididos.

En cuanto a la división también aparte del /, se puede escribir div, pero este solo funciona para enteros, es decir, si se quiere obtener la división de 3 entre 6, en vez de que el resultado sea 0.5, será 0, y al dividir 29 entre 2, en vez de que resulte 14.5, se obtiene 14. Así, que si se desean divisiones, en donde el resultado no será un entero, se recomienda utilizar el /.

Bueno, aquí les colocó la imagen de la ejecución de este programa, en donde realice cada una de las operaciones:

*Nota: Para salir de la ejecución del programa se escribe halt().

Bueno, aquí están las referencias en las que me base para realizar esta entrada.

Programación en Erlang
Erlang(1)
Erlang (Concurrencia)
Erlang(2)

Aquí les dejo el código.
operaciones.erl

Saludos.

3 comentarios:

Elisa dijo...

Tres puntos extra.

Lizeth Cardenas Moreno dijo...

Hola! queria saber en programa se desarrolla ?

Lizeth Cardenas Moreno dijo...
Este comentario ha sido eliminado por el autor.

Publicar un comentario