Lenguaje de programación que se ejecuta en la máquina virtual Erlang
Elixir es un lenguaje de programación funcional , concurrente y de alto nivel para propósitos generales que se ejecuta en la máquina virtual BEAM , que también se utiliza para implementar el lenguaje de programación Erlang . [3] Elixir se basa en Erlang y comparte las mismas abstracciones para crear aplicaciones distribuidas y tolerantes a fallas . Elixir también proporciona herramientas y un diseño extensible . Este último está respaldado por metaprogramación en tiempo de compilación con macros y polimorfismo a través de protocolos. [4]
La comunidad organiza eventos anuales en Estados Unidos, [5] Europa, [6] y Japón, [7] así como eventos y conferencias locales menores. [8] [9]
Historia
José Valim creó el lenguaje de programación Elixir como un proyecto de investigación y desarrollo en Plataformatec. Sus objetivos eran permitir una mayor extensibilidad y productividad en la máquina virtual Erlang, manteniendo al mismo tiempo la compatibilidad con el ecosistema de Erlang. [10] [11]
Elixir está orientado a sitios y aplicaciones de gran escala. Utiliza características de Ruby , Erlang y Clojure para desarrollar un lenguaje de alta concurrencia y baja latencia. Fue diseñado para manejar grandes volúmenes de datos. Elixir también se utiliza en telecomunicaciones, comercio electrónico y finanzas. [12]
En 2021, se anunció el esfuerzo de Numerical Elixir con el objetivo de incorporar aprendizaje automático, redes neuronales, compilación de GPU, procesamiento de datos y cuadernos computacionales al ecosistema Elixir. [13]
Control de versiones
Cada una de las versiones menores admite un rango específico de versiones de Erlang/ OTP . [14] La versión de lanzamiento estable actual es 1.17.3 [1] .
Características
- Se compila en código de bytes para la máquina virtual BEAM de Erlang . [15] Interoperabilidad total con el código Erlang, sin impacto en el tiempo de ejecución .
- Escalabilidad y tolerancia a fallos, gracias a los mecanismos de concurrencia ligeros de Erlang [15]
- Herramientas integradas para administrar dependencias, compilación de código, ejecución de pruebas, formateo de código, depuración remota y más.
- Un REPL interactivo dentro de programas en ejecución, incluidos servidores web Phoenix , con recarga de código y acceso al estado interno
- Todo es una expresión [15]
- Coincidencia de patrones [15] para promover un código asertivo [16]
- Sugerencias de tipos para herramientas de análisis estático
- Datos inmutables, con énfasis, como otros lenguajes funcionales , en la recursión y funciones de orden superior en lugar de bucles basados en efectos secundarios.
- Programación concurrente sin compartir mediante paso de mensajes ( modelo de actor ) [17]
- Colecciones asincrónicas y perezosas con transmisiones
- Programación orientada al ferrocarril a través del
with
constructo [18] - Metaprogramación higiénica mediante acceso directo al árbol de sintaxis abstracta (AST). [15] Las bibliotecas a menudo implementan pequeños lenguajes específicos de dominio , como para bases de datos o pruebas.
- Ejecución de código en tiempo de compilación. El compilador Elixir también se ejecuta en BEAM, por lo que los módulos que se están compilando pueden ejecutar inmediatamente el código que ya se ha compilado.
- Polimorfismo a través de un mecanismo llamado protocolos. Despacho dinámico , como en Clojure , sin embargo, sin despacho múltiple porque los protocolos de Elixir despachan en un solo tipo.
- Soporte para documentación a través de cadenas de documentación similares a Python en el lenguaje de formato Markdown [15]
- Compatibilidad con Unicode y cadenas UTF-8
Ejemplos
Los siguientes ejemplos se pueden ejecutar en un iex
shell o guardar en un archivo y ejecutar desde la línea de comandos escribiendo .elixir <filename>
Ejemplo clásico de Hola mundo :
iex> IO . puts ( "¡Hola mundo!" ) ¡Hola mundo!
Operador de tubería:
iex> "Elixir" |> String .graphemes () |> Enum .frequency () % {"E" => 1, "i" => 2, "l " => 1, "r" => 1, "x" => 1} iex> %{ valores : 1 .. 5 } |> Mapa . get ( : valores ) |> Enumeración . map ( & &1 * 2 ) [2, 4, 6, 8, 10] iex> |> Enumeración . suma () 30
Coincidencia de patrones (también conocida como desestructuración):
iex> %{ izquierda : x } = %{ izquierda : 5 , derecha : 8 } iex> x 5 iex> { :ok , [ _ | resto ]} = { :ok , [ 1 , 2 , 3 ]} iex> resto [2, 3]
Coincidencia de patrones con múltiples cláusulas:
iex> case File . read ( "ruta/al/archivo" ) do iex> { :ok , contenido } -> IO . puts ( "archivo encontrado: #{ contenido } " ) iex> { :error , motivo } -> IO . puts ( "archivo faltante: #{ motivo } " ) iex> end
Comprensión de listas :
iex> para n <- 1 .. 5 , rem ( n , 2 ) == 1 , hacer : n * n [1, 9, 25]
Lectura asincrónica de archivos con secuencias:
1 .. 5 |> Tarea . async_stream ( & Archivo . read! ( " #{ &1 } . txt" )) |> Flujo . filter ( fn { :ok , contenido } -> Cadena . trim ( contenido ) != "" fin ) |> Enumeración . join ( " \n " )
Cuerpos con funciones múltiples y protectores :
def fib ( n ) cuando n está en [ 0 , 1 ], hacer : n def fib ( n ), hacer : fib ( n - 2 ) + fib ( n - 1 )
Bases de datos relacionales con la biblioteca Ecto:
esquema "clima" do campo :ciudad # Por defecto es tipo :cadena campo :temp_lo , :entero campo :temp_hi , :entero campo :prcp , :float , predeterminado : 0.0 fin Tiempo |> dónde ( ciudad : "Cracovia" ) |> ordenar_por ( :temp_lo ) |> límite ( 10 ) |> Repo . todo
Generando secuencialmente mil procesos:
para num <- 1 .. 1000 , hacer : spawn fn -> IO . puts ( " #{ num * 2 } " ) fin
Ejecutar una tarea de forma asincrónica :
tarea = Tarea . async fn -> realizar_acción_compleja () fin otra_acción_que_consume_tiempo () Tarea . esperar tarea
[ cita requerida ]
Véase también
Referencias
- ^ ab "Versión 1.17.3". 18 de septiembre de 2024. Consultado el 21 de septiembre de 2024 .
- ^ "elixir/LICENCIA en master · elixir-lang/elixir · GitHub". GitHub .
- ^ "Los lenguajes de programación más populares de 2018 - Blog de Elite Infoworld". 2018-03-30. Archivado desde el original el 2018-05-09 . Consultado el 2018-05-08 .
- ^ "Elíxir". José Valim . Consultado el 17 de febrero de 2013 .
- ^ "ElixirConf" . Consultado el 11 de julio de 2018 .
- ^ "ElixirConf" . Consultado el 11 de julio de 2018 .
- ^ "Erlang & Elixir Fest" . Consultado el 18 de febrero de 2019 .
- ^ "Elixir LDN" . Consultado el 12 de julio de 2018 .
- ^ "EMPEX - Conferencia Empire State Elixir" . Consultado el 12 de julio de 2018 .
- ^ Elixir - Un enfoque moderno de programación para la máquina virtual Erlang . Consultado el 17 de febrero de 2013 .
- ^ José Valim - Keynote de ElixirConf EU 2017. Archivado desde el original el 2021-11-17 . Consultado el 2017-07-14 .
- ^ "Detrás del código: El que creó Elixir" . Consultado el 25 de noviembre de 2019 .
- ^ "Elixir numérico (Nx)" . Consultado el 6 de mayo de 2024 .
- ^ Elixir es un lenguaje dinámico y funcional diseñado para crear aplicaciones escalables y mantenibles: elixir-lang/elixir, Elixir, 2019-04-21 , consultado el 2019-04-21
- ^ abcdef "Elixir" . Consultado el 7 de septiembre de 2014 .
- ^ "Cómo escribir código asertivo con Elixir". 24 de septiembre de 2014. Consultado el 5 de julio de 2018 .
- ^ Loder, Wolfgang (12 de mayo de 2015). Erlang y Elixir para programadores imperativos. "Capítulo 16: Conceptos de estructuración de código", título de la sección "Modelo de actor": Leanpub . Consultado el 7 de julio de 2015 .
{{cite book}}
: Mantenimiento de CS1: ubicación ( enlace ) - ^ Wlaschin, Scott (mayo de 2013). "Programación orientada a ferrocarriles". F# por diversión y ganancias . Archivado desde el original el 30 de enero de 2021. Consultado el 28 de febrero de 2021 .
Lectura adicional
- Simon St. Laurent; J. Eisenberg (22 de diciembre de 2016). Introducción a Elixir: Introducción a la programación funcional, segunda edición . O'Reilly Media . ASIN B01N9KCTIC. ISBN 978-1491956779.
- Sasa Juric (12 de enero de 2019). Elixir in Action 2.ª edición . Manning Publications . ASIN B0978KZTJG. ISBN 978-1617295027.