Está en la página 1de 4

ERLANG

INTRODUCCION

AL INICIO

Erlang y Elixir son dos lenguajes de programacion diseñados para abordar la concurrencia en
sistemas. Erlang, se usa para aplicaciones cirticas y tolerantes a fallos, por el otro lado Elixir,
ofrece una sintaxis mas moderna y amigable.

Erlang

Es un lenguaje funcional con proposito general que esta orientado para construir sistemas
escalables, que sean tolerantes a fallos y concurrentes

Y es muy ampliamente conocido por tener la capacidad de crear aplicaciones que pueden
manejar eficientemente una gran cantidad de tareas concurrentes y mantener su estabilidad
incluso en circunstancias desfavorables. Su enfoque en la concurrencia y la tolerancia a fallos es
parte integral del diseño de Erlang por lo tanto lo hace adecuado para aplicaciones como
sistemas de telecomunicaciones, servidores web y sistemas distribuidos en la tolerancia a fallos

Erlang fue diseñado con un objetivo especifico en mente: aportar una mejor formade
programar aplicaciones de telefonía.

SINTAXIS

EJEMPLO 1

Define un módulo llamado "solution".

Exporta la función start/0, lo que significa que puede ser llamada desde fuera del módulo.

Define la función start/0, que es la función principal del programa.

En la función start/0, llama a la función say_hello/1 con el argumento 5.

La función say_hello/1:

Si el argumento es 0, devuelve el valor 0.

Si el argumento no es 0, imprime "Hello, World" seguido de una nueva línea utilizando


io:format/1.

Llama a la función say_hello/1 nuevamente con el argumento decrementado en 1 (realiza una


llamada recursiva).

En resumen, el programa imprimirá el mensaje "Hello, World" cinco veces, una vez por cada
llamada recursiva de la función say_hello/1, reduciendo el valor del argumento en 1 en cada
llamada, hasta que el argumento llegue a 0.

EJEMPLO 2

Explicación paso a paso:

Se define un módulo llamado "solution" y se exporta la función start/0.


La función start/0 inicia tres impresoras como procesos concurrentes utilizando spawn/1.

Envía mensajes a cada impresora (P1, P2 y P3) para que impriman (P1 ! print, etc.).

Utiliza la construcción receive para esperar un mensaje de confirmación de que una impresora
ha completado la tarea de impresión.

Si se recibe el mensaje {printed, PrinterNumber}, muestra un mensaje indicando que la tarea


fue impresa por la impresora correspondiente.

Si no se recibe ningún mensaje en 5 segundos, muestra un mensaje de que se agotó el tiempo


de espera.

La función printer/1 define el comportamiento de cada impresora (proceso):

Espera recibir el mensaje print.

Imprime mensajes simulando la impresión.

Envía un mensaje a sí misma para indicar que la tarea ha sido impresa.

En resumen, este programa Erlang simula la impresión de tareas en múltiples impresoras


utilizando procesos concurrentes, mostrando mensajes de progreso y finalización de la
impresión.

Los objetivos de diseño de Erlang reflejan el dominio del problema inicial:

Concurrencia: Manejar miles de eventos simultáneos, como llamadas telefónicas.

Robustez: La disponibilidad en telecomunicaciones es crucial, por lo que los errores deben ser
controlados para no interrumpir otras partes del sistema. Idealmente, no debería haber
errores.

Distribución: El sistema debe ser distribuido en varias computadoras, ya sea por la naturaleza
inherente de la aplicación o para robustez y eficiencia.

Estas preocupaciones han resultado en las siguientes características clave:

Paradigma de paso de mensajes para la concurrencia: Erlang elige el enfoque de paso de


mensajes para la concurrencia en lugar de compartir memoria, evitando problemas como
bloqueos o condiciones de carrera. Los procesos en Erlang se comunican enviando mensajes
entre sí de forma asíncrona.

Recuperación de errores: Erlang permite la recuperación de errores al permitir que los


procesos padres reciban mensajes cuando un proceso hijo sale inesperadamente. La
inmutabilidad de la memoria ayuda a aislar errores y facilita el rastreo.

Reemplazo de código en caliente: Para garantizar la disponibilidad, Erlang permite reemplazar


el código en ejecución, manteniendo una tabla global de métodos para los módulos cargados,
que se actualiza al reemplazar el código.

OTP es OPEN TELECOM PLATFORM -> OTP es un conjunto de herramientas, bibliotecas y


patrones de diseño construidos sobre Erlang. Con el fin de facilitar el desarrollo de sistemas
distribuidos robustos.
COMPILACIÓN

El proceso de ejecución de Erlang es bastante similar al de otros lenguajes de programación


orientados a máquinas virtuales. Un compilador convierte el código fuente de Erlang en un
bytecode de Erlang, que luego se interpreta en un emulador. Utilizando el compilador HiPE,
también es posible compilar el código fuente de Erlang directamente en código de máquina
nativo. Luego, el código nativo puede combinarse con el código emulado utilizando el sistema
en tiempo de ejecución de HiPE.

ERLANG/OTP Compiler: Este es el primer paso en el proceso. El compilador de ERLANG/OTP


toma el código fuente de Erlang y realiza la compilación inicial para generar el bytecode BEAM.

ERLANG/OTP Runtime System: En el segundo paso, el sistema en tiempo de ejecución de


ERLANG/OTP, que incluye el intérprete BEAM, carga y ejecuta el bytecode BEAM generado en
el paso anterior. Esto permite la ejecución del programa Erlang.

HiPE Core Erlang Compiler: El tercer paso es donde entra en juego el compilador HiPE. En lugar
de generar código nativo directamente, el compilador HiPE toma el bytecode BEAM generado
por el compilador ERLANG/OTP en el primer paso y lo traduce a "Core Erlang". El "Core Erlang"
es una representación intermedia simplificada que todavía es independiente de la arquitectura
y más fácil de optimizar.

Luego, el proceso continúa más allá de la Figura 2, con etapas adicionales que involucran la
generación de código de máquina nativo a partir de "Core Erlang" utilizando optimizaciones y
transformaciones específicas de HiPE.

En resumen, el "HiPE Core Erlang Compiler" actúa como un enlace clave en el proceso de
compilación del compilador HiPE. Traduce el bytecode BEAM a "Core Erlang" y permite aplicar
optimizaciones específicas para mejorar el rendimiento y generar un código de máquina nativo
más eficiente. Esto puede resultar en un mejor rendimiento general del programa Erlang en
términos de velocidad de ejecución y uso de recursos.

VM
Desde los primeros días de Erlang, han existido dos implementaciones de la Máquina Virtual
Erlang: la Máquina Abstracta de Joe (JAM) [8] y la Máquina Abstracta de Erlang de Bogdan/Bjrn
(BEAM). JAM fue la máquina virtual original de Erlang, inspirada en la Máquina Abstracta de
Warren (WAM) utilizada en Prolog.

JAM: JAM utilizó una máquina virtual basada en pila, similar a Java, donde los argumentos de
las funciones se pasan al empujarlos explícitamente en la pila y luego saltar a la primera
instrucción de la función. El propósito principal de JAM era iniciar el proceso de desarrollo de
Erlang.

BEAM: BEAM es la implementación actual de facto del sistema Erlang. BEAM fue inicialmente
un intento de compilar Erlang a través de C [9]. A diferencia de JAM, BEAM es una máquina
virtual de registro virtual, donde los registros de la máquina virtual se utilizan para llamadas a
funciones y paso de parámetros.

Al final de la parte de erlang


Erlang y Elixir son lenguajes de programación funcionales diseñados para construir sistemas
altamente escalables y concurrentes. Erlang, conocido por su robustez en telecomunicaciones,
se destaca por su modelo de concurrencia ligera y tolerancia a fallos. Elixir, basado en Erlang,
aporta una sintaxis mas amigable y herramientas modernas, aprovechando el poder del
compilador de Erlang para crear aplicaciones resilientes y eficientes en recursos.

También podría gustarte