Erlang ( / ɜr l æ ŋ / UR -lang ) es una de propósito general , concurrente , funcional lenguaje de programación , y una recolección de basura sistema de tiempo de ejecución . El término Erlang se usa indistintamente con Erlang / OTP, o Open Telecom Platform (OTP), que consiste en el sistema de tiempo de ejecución de Erlang , varios componentes listos para usar (OTP) escritos principalmente en Erlang y un conjunto de principios de diseño para Erlang. programas. [3]
Paradigmas | Multi-paradigma : concurrente , funcional |
---|---|
Diseñada por |
|
Desarrollador | Ericsson |
Apareció por primera vez | 1986 |
Lanzamiento estable | 24.0.2 [1] / 1 de junio de 2021 |
Disciplina de mecanografía | Dinámico , fuerte |
Licencia | Licencia Apache 2.0 |
Extensiones de nombre de archivo | .erl, .hrl |
Sitio web | www |
Implementaciones importantes | |
Erlang | |
Influenciado por | |
Lisp , PLEX , [2] Prolog , Smalltalk | |
Influenciado | |
Akka , Clojure [ cita requerida ] , Dart , Elixir , F # , Opa , Oz , Reia , Rust , Scala | |
|
El sistema de tiempo de ejecución de Erlang está diseñado para sistemas con estas características:
- Repartido
- Tolerante a fallos
- Suave en tiempo real
- Alta disponibilidad , sin parar aplicaciones
- Intercambio en caliente , donde el código se puede cambiar sin detener un sistema. [4]
El lenguaje de programación Erlang tiene datos inmutables , coincidencia de patrones y programación funcional . [5] El subconjunto secuencial del lenguaje Erlang admite la evaluación entusiasta , la asignación única y la mecanografía dinámica .
Una aplicación Erlang normal se construye a partir de cientos de pequeños procesos Erlang.
Fue originalmente software propietario dentro de Ericsson , desarrollado por Joe Armstrong , Robert Virding, y Mike Williams en 1986, [6] , pero fue liberado como software libre y de código abierto en 1998. [7] [8] Erlang / OTP está soportado y mantenido por la unidad de producto Open Telecom Platform (OTP) en Ericsson .
Historia
El nombre Erlang , atribuido a Bjarne Däcker, ha sido asumido por quienes trabajan en los conmutadores de telefonía (para quienes se diseñó el idioma) como una referencia al matemático e ingeniero danés Agner Krarup Erlang y una abreviatura silábica de "Ericsson Language". [6] [9] [ aclaración necesaria ] Erlang fue diseñado con el objetivo de mejorar el desarrollo de aplicaciones de telefonía. [ cita requerida ] La versión inicial de Erlang se implementó en Prolog y fue influenciada por el lenguaje de programación PLEX usado en intercambios anteriores de Ericsson. En 1988, Erlang había demostrado que era adecuado para la creación de prototipos de centrales telefónicas, pero el intérprete de Prolog era demasiado lento. Un grupo dentro de Ericsson estimó que debería ser 40 veces más rápido para ser adecuado para el uso de producción. En 1992, se inició el trabajo en la máquina virtual BEAM (VM) que compila Erlang en C utilizando una combinación de código compilado de forma nativa y código enhebrado para lograr un equilibrio entre el rendimiento y el espacio en disco. [10] Según Armstrong, el lenguaje pasó de un producto de laboratorio a aplicaciones reales tras el colapso de la central telefónica AX de próxima generación llamada AX-N en 1995. Como resultado, Erlang fue elegido para el siguiente modo de transferencia asincrónica (ATM). intercambiar AXD . [6]
En 1998 Ericsson anunció el conmutador AXD301, que contenía más de un millón de líneas de Erlang y reportó lograr una alta disponibilidad de nueve "9" . [11] Poco después, Ericsson Radio Systems prohibió el uso interno de Erlang para nuevos productos, citando una preferencia por lenguajes no propietarios. La prohibición hizo que Armstrong y otros abandonaran Ericsson. [12] La implementación fue de código abierto a finales de año. [6] Ericsson finalmente levantó la prohibición y volvió a contratar a Armstrong en 2004. [12]
En 2006, se agregó soporte de multiprocesamiento simétrico nativo al sistema en tiempo de ejecución y a la VM. [6]
Procesos
Las aplicaciones de Erlang se construyen a partir de procesos Erlang muy ligeros en el sistema de tiempo de ejecución de Erlang. Los procesos de Erlang pueden verse como objetos "vivos" ( programación orientada a objetos ), con encapsulación de datos y paso de mensajes , pero capaces de cambiar el comportamiento durante el tiempo de ejecución. El sistema de tiempo de ejecución de Erlang proporciona un aislamiento de proceso estricto entre los procesos de Erlang (esto incluye la recolección de datos y basura, separados individualmente por cada proceso de Erlang) y una comunicación transparente entre procesos en diferentes nodos de Erlang (en diferentes hosts).
Joe Armstrong, co-inventor de Erlang, resumió los principios de los procesos en su tesis doctoral : [13]
- Todo es un proceso.
- Los procesos están fuertemente aislados.
- La creación y destrucción de procesos es una operación liviana.
- El paso de mensajes es la única forma en que los procesos interactúan.
- Los procesos tienen nombres únicos.
- Si conoce el nombre de un proceso, puede enviarle un mensaje.
- Los procesos no comparten recursos.
- El manejo de errores no es local.
- Los procesos hacen lo que se supone que deben hacer o fallan.
Joe Armstrong comentó en una entrevista con Rackspace en 2013: "Si Java es ' escribir una vez, ejecutar en cualquier lugar ', entonces Erlang es 'escribir una vez, ejecutar para siempre'". [14]
Uso
En 2014, Ericsson informó que Erlang estaba siendo utilizado en sus nodos de soporte y en redes móviles GPRS , 3G y LTE en todo el mundo y también por Nortel y T-Mobile . [15]
Como expresó Tim Bray , director de Tecnologías Web en Sun Microsystems , en su discurso de apertura en la Convención de Código Abierto de O'Reilly (OSCON) en julio de 2008:
Si alguien viniera a mí y quisiera pagarme mucho dinero para construir un sistema de manejo de mensajes a gran escala que realmente tuviera que estar activo todo el tiempo, nunca podría permitirse el lujo de dejar de funcionar durante años seguidos, sin dudarlo elegiría a Erlang para construirlo.
Erlang es el lenguaje de programación utilizado para codificar WhatsApp . [dieciséis]
Desde su lanzamiento como código abierto, Erlang se ha extendido más allá de las telecomunicaciones, estableciéndose en otras verticales como FinTech, Gaming, Healthcare, Automotive, IoT y Blockchain. Además de WhatsApp, hay otras empresas que figuran como casos de éxito de Erlang: Vocalink (una empresa de MasterCard), Goldman Sachs , Nintendo , AdRoll, Grindr , BT Mobile , Samsung , OpenX , SITA . [17] [18]
Ejemplos de programación funcional
Factorial
Un algoritmo factorial implementado en Erlang:
- módulo ( hecho ). % Este es el archivo 'fact.erl', el módulo y el nombre del archivo deben coincidir - exportar ([ fac / 1 ]). % Esto exporta la función 'fac' de arity 1 (1 parámetro, sin tipo, sin nombre)fac ( 0 ) -> 1 ; % Si 0, devuelve 1, de lo contrario (observe el punto y coma; que significa 'más') fac ( N ) cuando N > 0 , is_integer ( N ) -> N * fac ( N - 1 ). % Determinar recursivamente, luego devolver el resultado % (observe el punto. Que significa 'endif' o 'función final') %% Esta función fallará si se da cualquier otro número que no sea un entero no negativo. %% Ilustra la filosofía "Let it crash" de Erlang.
secuencia Fibonacci
Un algoritmo recursivo de cola que produce la secuencia de Fibonacci :
%% La declaración del módulo debe coincidir con el nombre de archivo "series.erl" - módulo ( serie ).%% La declaración de exportación contiene una lista de todas aquellas funciones que forman %% la API pública del módulo. En este caso, este módulo expone una única función %% llamada fib que toma 1 argumento (IE tiene una aridad de 1) %% La sintaxis general para -export es una lista que contiene el nombre y %% arity de cada función pública - export ([ fib / 1 ]).%% ------------------------------------------------ --------------------- %% API pública %% ----------------------- ----------------------------------------------%% Manejar casos en los que fib / 1 recibe valores específicos %% El orden en el que se declaran estas firmas de funciones es una %% parte vital de la funcionalidad de este módulo%% Si fib / 1 se pasa precisamente el entero 0, entonces devuelve 0 fib ( 0 ) -> 0 ;%% Si fib / 1 recibe un número negativo, devuelve el átomo err_neg_val %% Normalmente, esta codificación defensiva no se recomienda debido a la filosofía de Erlang 'Let %% it Crash'; sin embargo, en este caso deberíamos evitar explícitamente %% una situación que bloquee el motor de ejecución de Erlang fib ( N ) cuando N < 0 -> err_neg_val ;%% Si fib / 1 se pasa un número entero menor que 3, entonces devuelve 1 %% Las dos firmas de función anteriores manejan todos los casos donde N <1, %% por lo que esta firma de función maneja casos donde N = 1 o N = 2 fib ( N ) cuando N < 3 -> 1 ;%% Para todos los demás valores, llame a la función privada fib_int / 3 para realizar %% el cálculo fib ( N ) -> fib_int ( N , 0 , 1 ).%% ------------------------------------------------ --------------------- %% API privada %% ----------------------- ----------------------------------------------%% Si fib_int / 3 recibe un 1 como su primer argumento, entonces hemos terminado, entonces %% devuelve el valor en el argumento B. Ya que no estamos interesados en el valor %% del segundo argumento, lo denotamos usando _ para indicar un valor %% "no importa" fib_int ( 1 , _, B ) -> B ;%% Para todas las demás combinaciones de argumentos, llame de forma recursiva a fib_int / 3 %% donde cada llamada hace lo siguiente: %% - contador de decremento N %% - Toma el valor de fibonacci anterior en el argumento B y pásalo como %% argumento A %% - Calcule el valor del número de fibonacci actual y páselo %% como argumento B fib_int ( N , A , B ) -> fib_int ( N - 1 , B , A + B ).
Aquí está el mismo programa sin los comentarios explicativos:
- módulo ( serie ). - exportar ([ fib / 1 ]).fib ( 0 ) -> 0 ; fib ( N ) cuando N < 0 -> err_neg_val ; fib ( N ) cuando N < 3 -> 1 ; fib ( N ) -> fib_int ( N , 0 , 1 ).fib_int ( 1 , _, B ) -> B ; fib_int ( N , A , B ) -> fib_int ( N - 1 , B , A + B ).
Ordenación rápida
Clasificación rápida en Erlang, utilizando la comprensión de listas : [19]
%% qsort: qsort (Lista) %% Ordenar una lista de elementos - módulo ( qsort ). % Este es el archivo 'qsort.erl' - exportar ([ qsort / 1 ]). % Se exporta una función 'qsort' con 1 parámetro (sin tipo, sin nombre)qsort ([]) -> []; % Si la lista [] está vacía, devuelve una lista vacía (nada que ordenar) qsort ([ Pivot | Rest ]) -> % Redacta una lista con 'Front' para todos los elementos que deberían estar antes de 'Pivot' % then ' Pivote 'luego' Atrás 'para todos los elementos que deberían estar después de' Pivot ' qsort ([ Front || Front <- Rest , Front < Pivot ]) ++ [ Pivot ] ++ qsort ([ Back || Back <- Rest , Atrás > = Pivote ]).
El ejemplo anterior invoca recursivamente la función qsort
hasta que no queda nada por ordenar. La expresión [Front || Front <- Rest, Front < Pivot]
es una lista de comprensión , lo que significa "Construya una lista de elementos Front
tal que Front
sea miembro de Rest
y Front
sea menor que Pivot
". ++
es el operador de concatenación de listas.
Se puede utilizar una función de comparación para estructuras más complicadas en aras de la legibilidad.
El siguiente código ordenaría las listas según su longitud:
% Este es el archivo 'listsort.erl' (el compilador está hecho de esta manera) - módulo ( listsort ). % Exportar 'by_length' con 1 parámetro (no importa el tipo y el nombre) - exportar ([ by_length / 1 ]).by_length ( Lists ) -> % Usa 'qsort / 2' y proporciona una función anónima como parámetro qsort ( Lists , fun ( A , B ) -> length ( A ) < length ( B ) end ).qsort ([], _) -> []; % Si la lista está vacía, devuelva una lista vacía (ignore el segundo parámetro) qsort ([ Pivot | Rest ], Smaller ) -> % Lista de particiones con elementos 'Smaller' delante de 'Pivot' y elementos no-'Smaller ' % después de 'Pivot' y ordena las sublistas. qsort ([ X || X <- Descanso , Más pequeño ( X , Pivot )], Más pequeño ) ++ [ Pivot ] ++ qsort ([ Y || Y <- Descanso , no ( Más pequeño ( Y , Pivot ))], Más pequeño ).
A Pivot
se toma del primer parámetro dado a qsort()
y el resto Lists
se nombra Rest
. Tenga en cuenta que la expresión
[ X || X <- Descanso , más pequeño ( X , pivote )]
no es diferente en forma de
[ Frente || Delantero <- Descanso , Delantero < Pivote ]
(en el ejemplo anterior) excepto por el uso de una función de comparación en la última parte, que dice "Construya una lista de elementos X
tal que X
sea miembro Rest
y Smaller
sea verdadero", que Smaller
se definió anteriormente como
diversión ( A , B ) -> longitud ( A ) < longitud ( B ) final
La función anónima se nombra Smaller
en la lista de parámetros de la segunda definición de qsort
para que pueda ser referenciada por ese nombre dentro de esa función. No se nombra en la primera definición de qsort
, que trata con el caso base de una lista vacía y, por lo tanto, no necesita esta función, y mucho menos un nombre para ella.
Tipos de datos
Erlang tiene ocho tipos de datos primitivos :
- Enteros
- Los números enteros se escriben como secuencias de dígitos decimales, por ejemplo, 12, 12375 y -23427 son números enteros. La aritmética de enteros es exacta y solo está limitada por la memoria disponible en la máquina. (Esto se llama aritmética de precisión arbitraria ).
- Átomos
- Los átomos se utilizan dentro de un programa para denotar valores distinguidos. Se escriben como cadenas de caracteres alfanuméricos consecutivos, el primer carácter en minúsculas. Los átomos pueden contener cualquier carácter si están encerrados entre comillas simples y existe una convención de escape que permite usar cualquier carácter dentro de un átomo. Los átomos nunca se recolectan como basura y deben usarse con precaución, especialmente si se usa la generación dinámica de átomos.
- Flotadores
- Los números de coma flotante utilizan la representación IEEE 754 de 64 bits .
- Referencias
- Las referencias son símbolos únicos a nivel mundial cuya única propiedad es que se pueden comparar por igualdad. Se crean evaluando el primitivo Erlang
make_ref()
. - Binarios
- Un binario es una secuencia de bytes. Los binarios proporcionan una forma eficiente de almacenar datos binarios. Existen primitivas de Erlang para componer y descomponer binarios y para una entrada / salida eficiente de binarios.
- Pids
- Pid es la abreviatura de identificador de proceso : un Pid es creado por la primitiva de Erlang. Los
spawn(...)
Pids son referencias a procesos de Erlang. - Puertos
- Los puertos se utilizan para comunicarse con el mundo externo. Los puertos se crean con la función incorporada
open_port
. Los mensajes se pueden enviar y recibir de los puertos, pero estos mensajes deben obedecer el llamado "protocolo de puerto". - Diversiones
- Las diversiones son cierres de funciones . Diversiones son creados por expresiones de la forma:
fun(...) -> ... end
.
Y tres tipos de datos compuestos:
- Tuplas
- Las tuplas son contenedores para un número fijo de tipos de datos de Erlang. La sintaxis
{D1,D2,...,Dn}
denota una tupla cuyos argumentos sonD1, D2, ... Dn.
Los argumentos pueden ser tipos de datos primitivos o tipos de datos compuestos. Se puede acceder a cualquier elemento de una tupla en tiempo constante. - Liza
- Las listas son contenedores para un número variable de tipos de datos de Erlang. La sintaxis
[Dh|Dt]
denota una lista cuyo primer elemento esDh
, y cuyos elementos restantes son la listaDt
. La sintaxis[]
denota una lista vacía. La sintaxis[D1,D2,..,Dn]
es la abreviatura de[D1|[D2|..|[Dn|[]]]]
. Se puede acceder al primer elemento de una lista en tiempo constante. El primer elemento de una lista se denomina cabeza de lista. El resto de la lista cuando su cabeza se ha eliminado se llama la cola de la lista. - Mapas
- Los mapas contienen un número variable de asociaciones clave-valor. La sintaxis es
#{Key1=>Value1,...,KeyN=>ValueN}
.
Se proporcionan dos formas de azúcar sintáctico :
- Instrumentos de cuerda
- Las cadenas se escriben como listas de caracteres doblemente citadas. Este es el azúcar sintáctico para una lista de puntos de código Unicode enteros para los caracteres de la cadena. Así, por ejemplo, la cadena "gato" es la abreviatura de
[99,97,116]
. [20] - Registros
- Los registros proporcionan una forma conveniente de asociar una etiqueta con cada uno de los elementos de una tupla. Esto permite referirse a un elemento de una tupla por nombre y no por posición. Un precompilador toma la definición de registro y la reemplaza con la referencia de tupla apropiada.
Erlang no tiene un método para definir clases, aunque hay bibliotecas externas disponibles. [21]
Estilo de codificación "Let it crash"
Erlang está diseñado con un mecanismo que facilita que los procesos externos monitoreen fallas (o fallas de hardware), en lugar de un mecanismo en proceso como el manejo de excepciones utilizado en muchos otros lenguajes de programación. Los bloqueos se informan como otros mensajes, que es la única forma en que los procesos pueden comunicarse entre sí, [22] y los subprocesos pueden generarse de forma económica. [ cita requerida ] La filosofía de "dejar que se bloquee" prefiere que un proceso se reinicie por completo en lugar de intentar recuperarse de una falla grave. [23] Aunque todavía requiere el manejo de errores, esta filosofía da como resultado menos código dedicado a la programación defensiva donde el código de manejo de errores es altamente contextual y específico. [22]
Árboles de supervisor
Una aplicación típica de Erlang está escrita en forma de árbol supervisor. Esta arquitectura se basa en una jerarquía de procesos en la que el proceso de nivel superior se conoce como "supervisor". Luego, el supervisor genera múltiples procesos secundarios que actúan como trabajadores o como supervisores de nivel inferior. Dichas jerarquías pueden existir a profundidades arbitrarias y han demostrado proporcionar un entorno altamente escalable y tolerante a fallas dentro del cual se puede implementar la funcionalidad de la aplicación.
Dentro de un árbol de supervisores, todos los procesos supervisores son responsables de administrar el ciclo de vida de sus procesos secundarios, y esto incluye manejar situaciones en las que esos procesos secundarios fallan. Cualquier proceso puede convertirse en supervisor si primero genera un proceso hijo y luego llama erlang:monitor/2
a ese proceso. Si el proceso monitoreado falla, el supervisor recibirá un mensaje que contiene una tupla cuyo primer miembro es el átomo 'DOWN'
. El supervisor es responsable, en primer lugar, de escuchar dichos mensajes y, en segundo lugar, de tomar las medidas adecuadas para corregir la condición de error.
Orientación a la concurrencia y la distribución
La principal fortaleza de Erlang es la compatibilidad con la concurrencia . Tiene un pequeño pero poderoso conjunto de primitivas para crear procesos y comunicarse entre ellos. Erlang es conceptualmente similar al lenguaje occam , aunque reformula las ideas de la comunicación de procesos secuenciales (CSP) en un marco funcional y utiliza el paso de mensajes asincrónico. [24] Los procesos son el medio principal para estructurar una aplicación Erlang. No son procesos ni subprocesos del sistema operativo , sino procesos ligeros programados por BEAM. Al igual que los procesos del sistema operativo (pero a diferencia de los subprocesos del sistema operativo), no comparten ningún estado entre sí. La sobrecarga mínima estimada para cada uno es de 300 palabras . [25] Por lo tanto, se pueden crear muchos procesos sin degradar el rendimiento. En 2005, se realizó con éxito una evaluación comparativa con 20 millones de procesos con Erlang de 64 bits en una máquina con 16 GB de memoria de acceso aleatorio (RAM; total 800 bytes / proceso). [26] Erlang ha admitido el multiprocesamiento simétrico desde la versión R11B de mayo de 2006.
Si bien los subprocesos necesitan soporte de biblioteca externa en la mayoría de los idiomas, Erlang proporciona funciones a nivel de idioma para crear y administrar procesos con el objetivo de simplificar la programación concurrente. Aunque toda la simultaneidad es explícita en Erlang, los procesos se comunican mediante el paso de mensajes en lugar de variables compartidas, lo que elimina la necesidad de bloqueos explícitos (la máquina virtual todavía usa un esquema de bloqueo internamente). [27]
La comunicación entre procesos funciona a través de un sistema de paso de mensajes asíncrono de nada compartido : cada proceso tiene un "buzón", una cola de mensajes que han sido enviados por otros procesos y que aún no se han consumido. Un proceso utiliza la primitiva para recuperar mensajes que coinciden con los patrones deseados. Una rutina de manejo de mensajes prueba los mensajes a su vez contra cada patrón, hasta que uno de ellos coincide. Cuando el mensaje se consume y se elimina del buzón, el proceso reanuda la ejecución. Un mensaje puede comprender cualquier estructura de Erlang, incluidas las primitivas (números enteros, flotantes, caracteres, átomos), tuplas, listas y funciones. receive
El siguiente ejemplo de código muestra el soporte integrado para procesos distribuidos:
% Cree un proceso e invoque la función web: start_server (Port, MaxConnections) ServerProcess = spawn ( web , start_server , [ Port , MaxConnections ]), % Cree un proceso remoto e invoque la función % web: start_server (Port, MaxConnections) en la máquina RemoteNode RemoteProcess = spawn ( RemoteNode , web , start_server , [ Port , MaxConnections ]), % Enviar un mensaje a ServerProcess (asincrónicamente). El mensaje consta de una tupla % con el átomo "pausa" y el número "10". ServerProcess ! { pausa , 10 }, % Recibir mensajes enviados a este proceso recibir un_mensaje -> hacer_algo ; { data , DataContent } -> handle ( DataContent ); { hola , Texto } -> io : format ( "Recibí el mensaje de saludo: ~ s " , [ Texto ]); { adiós , Texto } -> io : format ( "Recibí el mensaje de despedida: ~ s " , [ Texto ]) fin .
Como muestra el ejemplo, los procesos pueden crearse en nodos remotos y la comunicación con ellos es transparente en el sentido de que la comunicación con los procesos remotos funciona exactamente como la comunicación con los procesos locales.
La concurrencia admite el método principal de manejo de errores en Erlang. Cuando un proceso falla, sale ordenadamente y envía un mensaje al proceso de control que luego puede tomar acción, como iniciar un nuevo proceso que asume la tarea del proceso anterior. [28] [29]
Implementación
La implementación de referencia oficial de Erlang usa BEAM. [30] BEAM está incluido en la distribución oficial de Erlang, llamada Erlang / OTP. BEAM ejecuta un código de bytes que se convierte en código enhebrado en el momento de la carga. También incluye un compilador de código nativo en la mayoría de las plataformas, desarrollado por High Performance Erlang Project (HiPE) en la Universidad de Uppsala . Desde octubre de 2001, el sistema HiPE está completamente integrado en el sistema de código abierto Erlang / OTP de Ericsson. [31] También admite la interpretación, directamente desde el código fuente mediante un árbol de sintaxis abstracta , mediante un script a partir de la versión R11B-5 de Erlang.
Módulos y carga de código activo
Erlang admite la actualización dinámica de software a nivel de idioma . Para implementar esto, el código se carga y administra como unidades de "módulo"; el módulo es una unidad de compilación . El sistema puede mantener dos versiones de un módulo en la memoria al mismo tiempo, y los procesos pueden ejecutar simultáneamente el código de cada uno. Las versiones se denominan versión "nueva" y "antigua". Un proceso no se moverá a la nueva versión hasta que realice una llamada externa a su módulo.
Un ejemplo del mecanismo de carga de código activo:
%% Un proceso cuyo único trabajo es mantener un contador. %% Primera versión - módulo ( contador ). - exportar ([ inicio / 0 , conmutador de código / 1 ]). inicio () -> bucle ( 0 ). bucle ( suma ) -> recibir { incremento , recuento } -> bucle ( suma + recuento ); { contador , Pid } -> ¡ Pid ! { contador , suma }, bucle ( suma ); code_switch -> ? MÓDULO : codewitch ( Suma ) % Forzar el uso de 'codewitch / 1' desde el final de la última versión del MÓDULO . conmutador de código ( Suma ) -> bucle ( Suma ).
Para la segunda versión, agregamos la posibilidad de restablecer el conteo a cero.
%% Segunda versión - módulo ( contador ). - exportar ([ inicio / 0 , conmutador de código / 1 ]). inicio () -> bucle ( 0 ). bucle ( suma ) -> recibir { incremento , recuento } -> bucle ( suma + recuento ); restablecer -> bucle ( 0 ); { contador , Pid } -> ¡ Pid ! { contador , suma }, bucle ( suma ); code_switch -> ? MÓDULO : interruptor de código ( Suma ) final . conmutador de código ( Suma ) -> bucle ( Suma ).
Solo cuando recibe un mensaje que consiste en el átomo code_switch
, el bucle ejecutará una llamada externa al conmutador de código / 1 ( ?MODULE
es una macro de preprocesador para el módulo actual). Si hay una nueva versión del módulo contador en la memoria, entonces se llamará a su función de interruptor de código / 1. La práctica de tener un punto de entrada específico en una nueva versión permite al programador transformar el estado al que se necesita en la versión más nueva. En el ejemplo, el estado se mantiene como un número entero.
En la práctica, los sistemas se construyen utilizando principios de diseño de Open Telecom Platform, lo que conduce a más diseños actualizables de código. La carga exitosa de códigos calientes es exigente. El código debe redactarse con cuidado para hacer uso de las instalaciones de Erlang.
Distribución
En 1998, Ericsson lanzó Erlang como software gratuito y de código abierto para garantizar su independencia de un solo proveedor y aumentar el conocimiento del idioma. Erlang, junto con las bibliotecas y la base de datos distribuida en tiempo real Mnesia , forma la colección de bibliotecas OTP. Ericsson y algunas otras empresas apoyan comercialmente a Erlang.
Desde el lanzamiento de código abierto, Erlang ha sido utilizado por varias empresas en todo el mundo, incluidas Nortel y T-Mobile . [32] Aunque Erlang fue diseñado para llenar un nicho y ha permanecido como un lenguaje oscuro durante la mayor parte de su existencia, su popularidad está creciendo debido a la demanda de servicios concurrentes. [33] [34] Erlang ha encontrado algún uso en el campo de servidores de juegos de rol en línea multijugador masivo (MMORPG). [35]
Ver también
- Elixir : un lenguaje de programación funcional, concurrente y de propósito general que se ejecuta en BEAM
- Luerl - Lua on the BEAM, diseñado e implementado por uno de los creadores de Erlang.
- Lisp Flavored Erlang (LFE): un lenguaje de programación basado en Lisp que se ejecuta en BEAM
- Mix (herramienta de construcción)
- Phoenix (marco web)
Referencias
- ^ "Versión 24.0.2" . 1 de junio de 2021 . Consultado el 21 de junio de 2021 .
- ^ Conferencias, NDC (4 de junio de 2014). "Joe Armstrong - Programación funcional del largo camino hacia la iluminación: una narrativa histórica y personal" . Vimeo.
- ^ "Erlang - Introducción" . erlang.org .
- ^ Armstrong, Joe; Däcker, Bjarne; Lindgren, Thomas; Millroth, Håkan. "Erlang de código abierto - Libro blanco" . Archivado desde el original el 25 de octubre de 2011 . Consultado el 31 de julio de 2011 .
- ^ Gira del Hitchhiker del BEAM - Robert Virding http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- ^ a b c d e Armstrong, Joe (2007). Historia de Erlang . HOPL III: Actas de la tercera conferencia ACM SIGPLAN sobre Historia de los lenguajes de programación . ISBN 978-1-59593-766-7.
- ^ "Cómo los gigantes tecnológicos difundieron el amor por la programación de código abierto - CIO.com" .
- ^ "Erlang / OTP lanzado como código abierto, 1998-12-08" . Archivado desde el original el 9 de octubre de 1999.
- ^ "¿Erlang, el matemático?" .
- ^ Armstrong, Joe (agosto de 1997). "El desarrollo de Erlang". Avisos ACM SIGPLAN . 32 (8): 196-203. doi : 10.1145 / 258948.258967 . ISBN 0897919181. S2CID 6821037 .
- ^ "Programación orientada a la concurrencia en Erlang" (PDF) . 9 de noviembre de 2002.
- ^ a b "pregunta sobre el futuro de Erlang" . 6 de julio de 2010.
- ^ http://erlang.org/download/armstrong_thesis_2003.pdf
- ^ McGreggor, Duncan (26 de marzo de 2013). Rackspace echa un vistazo al lenguaje de programación Erlang para computación distribuida (video). Estudios Rackspace, SFO . Consultado el 24 de abril de 2019 .
- ^ "Ericsson" . Ericsson.com . 4 de diciembre de 2014 . Consultado el 7 de abril de 2018 .
- ^ "Inside Erlang, el raro lenguaje de programación detrás del éxito de WhatsApp" . fastcompany.com . 21 de febrero de 2014 . Consultado el 12 de noviembre de 2019 .
- ^ "¿Qué empresas utilizan Erlang y por qué? #MyTopdogStatus" . erlang-solutions.com . 11 de septiembre de 2019 . Consultado el 15 de marzo de 2020 .
- ^ "¿Qué nuevas empresas están usando Erlang y Elixir? #MyTopdogStatus" . erlang-solutions.com . 2 de marzo de 2020 . Consultado el 24 de junio de 2020 .
- ^ "Erlang - Comprensiones de listas" . erlang.org .
- ^ "Literales de cadenas y caracteres" . Consultado el 2 de mayo de 2015 .
- ^ "ect - Erlang Class Transformation - agregar programación orientada a objetos a Erlang - Google Project Hosting" . Consultado el 2 de mayo de 2015 .
- ^ a b Verraes, Mathias (9 de diciembre de 2014). "Let It Crash" . Blog de Mathias Verraes . Consultado el 10 de febrero de 2021 .
- ^ "Patrones de diseño reactivo -" . www.reactivedesignpatterns.com . Consultado el 10 de febrero de 2021 .
- ^ Armstrong, Joe (septiembre de 2010). "Erlang" . Comunicaciones de la ACM . 53 (9): 68–75. doi : 10.1145 / 1810891.1810910 .
Erlang es conceptualmente similar al lenguaje de programación occam, aunque reformula las ideas de CSP en un marco funcional y utiliza el paso de mensajes asincrónico.
- ^ "Guía de eficiencia de Erlang - Procesos" . Archivado desde el original el 27 de febrero de 2015.
- ^ Wiger, Ulf (14 de noviembre de 2005). "Erlang de prueba de estrés" . comp.lang.functional.misc . Consultado el 25 de agosto de 2006 .
- ^ "Cola de mensajes sin bloqueo" . Consultado el 23 de diciembre de 2013 .
- ^ Armstrong, Joe. "Robustez de Erlang" . Archivado desde el original el 23 de abril de 2015 . Consultado el 15 de julio de 2010 .
- ^ "Principios de supervisión de Erlang" . Archivado desde el original el 6 de febrero de 2015 . Consultado el 15 de julio de 2010 .
- ^ "Erlang - Compilación y carga de código" . erlang.org . Consultado el 21 de diciembre de 2017 .
- ^ "Erlang de alto rendimiento" . Consultado el 26 de marzo de 2011 .
- ^ "¿Quién usa Erlang para el desarrollo de productos?" . Preguntas frecuentes sobre Erlang . Consultado el 16 de julio de 2007 .
El mayor usuario de Erlang es (¡sorpresa!) Ericsson. Ericsson lo usa para escribir software utilizado en sistemas de telecomunicaciones. Muchas docenas de proyectos lo han utilizado, uno particularmente grande es el conmutador ATM AXD301 extremadamente escalable. Otros usuarios comerciales enumerados como parte de las preguntas frecuentes incluyen: Nortel, Deutsche Flugsicherung (la organización nacional alemana de control del tráfico aéreo ) y T-Mobile.
- ^ "Programación de Erlang" . Consultado el 13 de diciembre de 2008 .
Prácticamente todos los lenguajes utilizan la simultaneidad de estado compartido. Esto es muy difícil y conduce a problemas terribles cuando maneja fallas y escala el sistema ... Algunas startups bastante rápidas en el mundo financiero se han aferrado a Erlang; por ejemplo, el sueco www.kreditor.se.
- ^ "Erlang, el próximo Java" . Archivado desde el original el 11 de octubre de 2007 . Consultado el 8 de octubre de 2008 .
No creo que otros idiomas puedan alcanzar a Erlang en el corto plazo. Será fácil para ellos agregar características de lenguaje para parecerse a Erlang. Les llevará mucho tiempo construir una máquina virtual de tan alta calidad y las bibliotecas maduras para la concurrencia y la confiabilidad. Entonces, Erlang está listo para el éxito. Si desea crear una aplicación multinúcleo en los próximos años, debería mirar a Erlang.
- ^ Clarke, Gavin (5 de febrero de 2011). "Se necesitan veterinarios de Battlestar Galactica para juegos de rol en línea" . Música y medios . El Reg . Consultado el 8 de febrero de 2011 .
Otras lecturas
- Armstrong, Joe (2003). "Realización de sistemas distribuidos fiables ante la presencia de errores de software" (PDF) . Tesis de Doctorado. The Royal Institute of Technology, Estocolmo, Suecia. Archivado desde el original el 23 de marzo de 2015 . Consultado el 13 de febrero de 2016 . Cite journal requiere
|journal=
( ayuda )CS1 maint: bot: estado de URL original desconocido ( enlace ) - Armstrong, Joe (2007). "Una historia de Erlang". Actas de la tercera conferencia ACM SIGPLAN sobre Historia de los lenguajes de programación - HOPL III . págs. 6–1. doi : 10.1145 / 1238844.1238850 . ISBN 978-1-59593-766-7. S2CID 555765 .
- Historia temprana de Erlang por Bjarne Däcker
- Mattsson, H .; Nilsson, H .; Wikstrom, C. (1999). "Mnesia - Un DBMS robusto distribuido para aplicaciones de telecomunicaciones". Primer taller internacional sobre aspectos prácticos de los lenguajes declarativos (PADL '99) : 152–163.
- Armstrong, Joe; Virding, Robert; Williams, Mike; Wikstrom, Claes (16 de enero de 1996). Programación concurrente en Erlang (2ª ed.). Prentice Hall . pag. 358. ISBN 978-0-13-508301-7. Archivado desde el original el 6 de marzo de 2012.
- Armstrong, Joe (11 de julio de 2007). Programming Erlang: Software for a Concurrent World (1ª ed.). Estantería pragmática . pag. 536 . ISBN 978-1-934356-00-5.
- Thompson, Simon J .; Cesarini, Francesco (19 de junio de 2009). Programación Erlang: un enfoque concurrente para el desarrollo de software (1ª ed.). Sebastopol, California: O'Reilly Media , Inc. pág. 496. ISBN 978-0-596-51818-9.
- Logan, Martin; Merritt, Eric; Carlsson, Richard (28 de mayo de 2010). Erlang y OTP en acción (1ª ed.). Greenwich, CT: Publicaciones Manning . pag. 500. ISBN 978-1-933988-78-8.
- Martin, Brown (10 de mayo de 2011). "Introducción a la programación en Erlang, Parte 1: Conceptos básicos" . developerWorks . IBM . Consultado el 10 de mayo de 2011 .
- Martin, Brown (17 de mayo de 2011). "Introducción a la programación en Erlang, Parte 2: Utilizar funciones y funciones avanzadas" . developerWorks . IBM . Consultado el 17 de mayo de 2011 .
- Wiger, Ulf (30 de marzo de 2001). "Aumento de cuatro veces en productividad y calidad: programación funcional de fuerza industrial en productos de clase de telecomunicaciones" (PDF) . FEmSYS 2001 Despliegue sobre arquitecturas distribuidas . Ericsson Telecom AB . Consultado el 16 de septiembre de 2014 .
enlaces externos
- Página web oficial