Erlang/OTP | |
---|---|
Tipo de | Marco de software |
Desarrollador | Ericsson |
Escrito en | Erlang |
Sistema operativo | plataforma cruzada |
Primera edición | 1996 |
ultima versión | 25.0 [1] (18 de mayo de 2022 ) |
Licencia | Licencia Apache 2.0 |
Sitio web | erlang.org _ |
Open Telecom Platform , OTP , Erlang/OTP (“plataforma abierta de telecomunicaciones”) es un marco de software (framework) que contiene un conjunto de bibliotecas y patrones de diseño para crear aplicaciones distribuidas escalables en el lenguaje de programación Erlang [2] .
El marco fue creado por Ericsson como parte del proyecto de enrutadores ATM de la serie AXD en la unidad de producción del mismo nombre [3] y lanzado en 1996 [4] , incorporando muchos años de experiencia en la creación de sistemas tolerantes a fallas [3] .
La alta confiabilidad de las aplicaciones es posible gracias al mecanismo de manejo de excepciones simple pero poderoso en el que se construyeron las bibliotecas genéricas. Usando las bibliotecas del marco OTP, el desarrollador de Erlang programa el comportamiento deseado y las bibliotecas se encargan del manejo de excepciones. Este enfoque acorta el código y normalmente introduce menos errores [5] .
En su disertación, Joe Armstrong explica el enfoque para programar sistemas altamente confiables elegido en OTP por la necesidad de abstraer la concurrencia : una OTP depurada y probada se encarga de la ejecución paralela, mientras que los programadores de aplicaciones menos calificados pueden crear el resto de componentes de una manera más simple y estilo "secuencial" más familiar [6] .
La formalización de los patrones de diseño típicos de la programación competitiva son los comportamientos ( comportamientos ing. ), implementados como módulos de la biblioteca estándar de Erlang. Los módulos definen funcionalidad genérica para procesos de algún tipo. El programador sólo necesita crear su propio módulo con funciones de devolución de llamada , especificando la funcionalidad .
El comportamiento de OTP se construye a partir de procesos de trabajo y procesos de supervisión que conforman el árbol de supervisión .
Los módulos y los árboles de observación juntos forman una aplicación OTP (que no debe confundirse con una aplicación en el sentido de un producto de software terminado). Una aplicación OTP es un componente que implementa alguna funcionalidad que se puede iniciar y detener de forma independiente como un todo, y también se puede reutilizar en otros sistemas [7] . Un ejemplo de una aplicación incluida con Erlang/OTP es Mnesia .
La interacción del módulo de comportamiento y el módulo de función de devolución de llamada se produce de acuerdo con el esquema [8] :
Módulo de comportamiento ↔ Proceso ↔ Módulo de función de devolución de llamadaEl módulo de comportamiento contiene una funcionalidad común a los procesos de un determinado tipo, incluidas las operaciones características [8] :
El programador describe la funcionalidad específica en el módulo de función de devolución de llamada e incluye lo siguiente [8] :
Así, se pueden distinguir las siguientes partes en el comportamiento [9] :
Algún comportamiento es, por así decirlo, un modelo para un "tipo" particular de procesos (por ejemplo, procesos de tipo gen_fsm). Hablando de manera informal, los procesos del mismo "tipo" ejecutan aproximadamente el mismo código, lo que significa que "entienden" un determinado conjunto de mensajes. Los procesos del mismo "tipo" difieren solo en su estado individual. Se puede trazar una analogía bastante clara entre los procesos y los objetos OOP , con la posible diferencia de que los procesos se ejecutan de forma independiente y concurrente [11] .
El servidor genérico implementa el modelo cliente-servidor . El inicio del módulo de devolución de llamada para este comportamiento al menos podría verse así [9] :
- módulo ( miservidor ). - comportamiento ( gen_server ). - exportar ([ init / 1 , handle_call / 3 , handle_cast / 2 , handle_info / 2 , finish / 2 , code_change / 3 ]). % seguido de una descripción de las funciones relacionadas con la interfaz de comportamientoAdemás de las funciones de devolución de llamada, un módulo puede contener funciones API . En el caso, gen_serverdichas funciones podrían estar iniciando un proceso, así como enviando mensajes síncronos y asíncronos a este proceso. Las funciones API suelen ser contenedores para llamar a las funciones de biblioteca correspondientes. Continuando con el ejemplo anterior [12] :
- exportar ([ start_link / 1 , get_something / 0 , stop / 0 ]). start_link ( Puerto ) -> gen_server : start_link ({ local , ? SERVIDOR }, ? MÓDULO , [ Puerto ], []). % seguido de otras funciones declaradas en la directiva de exportaciónLa documentación de Erlang/OTP ofrece una descripción de las funciones del módulo de comportamiento y sus funciones de devolución de llamada asociadas en forma de tabla [13] .
Módulo de servidor genéricogen_server: | Módulo de devolución de llamada |
---|---|
start_link | init/1 |
call, multi_call | handle_call/3 |
cast, abcast | handle_cast/2 |
- | handle_info/2 |
- | terminate/2 |
- | code_change/3 |
Comportamiento para organizar el manejo de eventos, al igual que en gen_servertérminos de funcionalidad. Una diferencia importante es la capacidad gen_eventde gen_serveragregar o eliminar dinámicamente múltiples controladores de eventos, mientras que el servidor genérico recibe un módulo de funciones de devolución de llamada al inicio. Dado que los eventos son manejados por diferentes módulos, se debe tener cuidado al manejar el estado del bucle [14] .
Un comportamiento de uso poco frecuente que le permite organizar la lógica de su máquina de estado .
Las tareas del observador incluyen iniciar, detener y monitorear procesos secundarios, que a su vez pueden ser procesos de observador y otros tipos de procesos de trabajo [15] . El observador raíz, es decir, el observador de aplicaciones que observa otros procesos, generalmente recibe un nombre de la forma название_приложения_sup[16] .
En el contexto de OTP, una aplicación tiene un significado especial: es un componente de software (o servicio )[17] ), que consta de un conjunto de archivos de módulo y archivos de metadatos que tienen una estructura de archivos definida por acuerdo en el disco [18] . El sistema Erlang puede iniciar y detener una aplicación OTP como una sola entidad por nombre. Un módulo de comportamientoapplicationgeneralmente tiene un nombre de vistaимя_приложения_appy requiere solo dos funciones para exportarse:start/1ystop/1 [19] .
Erlang/OTP ofrece a los desarrolladores de aplicaciones las siguientes características [20] :
El lenguaje Elixir permite el uso de comportamientos y aplicaciones OTP. El siguiente ejemplo muestra un servidor que evalúa el valor de una función. Todas las funciones relacionadas con el servidor se delegan a GenServer [21] :
defmodule Dup.Server use GenServer def handle_call ( :calc_double , _from , x ) do { : reply , x , 2 * x } end endLa función handle_callrecibe del cliente (ignorado en este ejemplo) _from, así como el estado actual del servidor x. Devuelve el estado actual y duplica la variable de estado.