Elixir (lenguaje de programación)
Elixir es un lenguaje de programación funcional, concurrente y de propósito general que se ejecuta en la máquina virtual BEAM que también se utiliza para implementar el lenguaje de programación Erlang. Elixir se basa en Erlang y comparte las mismas abstracciones para crear aplicaciones distribuidas tolerantes a fallas. Elixir también proporciona herramientas productivas y un diseño extensible. Este último es compatible con metaprogramación en tiempo de compilación con macros y polimorfismo a través de protocolos.
Elixir es utilizado por empresas como Ramp, PagerDuty, Discord, Brex, E-MetroTel, Pinterest, Moz, Bleacher Report, The Outline, Inverse, Divvy, FarmBot y para crear sistemas integrados. La comunidad organiza eventos anuales en los Estados Unidos, Europa y Japón, así como eventos y conferencias locales menores.
Historia
José Valim es el creador del lenguaje de programación Elixir, un proyecto de investigación y desarrollo creado en Plataformatec. Sus objetivos eran permitir una mayor extensibilidad y productividad en la máquina virtual de Erlang manteniendo la compatibilidad con el ecosistema de Erlang.
Elixir estaba destinado a sitios y aplicaciones a gran escala. Elixir utiliza características de Ruby, Erlang y Clojure para desarrollar un lenguaje de "alta concurrencia" y "baja latencia". Elixir fue diseñado para manejar grandes volúmenes de datos. Elixir se utiliza en las industrias de telecomunicaciones, comercio electrónico y finanzas.
El 12 de julio de 2018, Honeypot lanzó un mini documental sobre Elixir.
Versionado
Elixir sigue principalmente el control de versiones semántico y tiene solo 1 versión principal sin planes para una segunda. Cada una de las versiones secundarias admite un rango específico de versiones de Erlang/OTP. La versión de lanzamiento estable actual es 1.14.1.
Características
- Compila a código de bytes para la máquina virtual Erlang (BEAM)
- Todo es una expresión.
- Las funciones de Erlang se pueden llamar desde Elixir, y viceversa, sin impacto en el tiempo de ejecución, debido a la compilación en el código de bytes de Erlang
- Metaprogramación que permite la manipulación directa del árbol de sintaxis abstracta (AST)
- Polimorfismo a través de un mecanismo llamado protocolos. Al igual que en Clojure, los protocolos proporcionan un mecanismo de envío dinámico. Sin embargo, esto no debe confundirse con el envío múltiple, ya que los protocolos Elixir se envían en un solo tipo.
- Soporte para documentación a través de cadenas de documentos similares a Python en el lenguaje de formato Markdown
- Programación concurrente sin nada compartido a través del paso de mensajes (modelo Actor)
- Énfasis en la recursividad y funciones de orden superior en lugar de bucles basados en efectos secundarios
- Concurrencia ligera utilizando los mecanismos de Erlang
- Programación orientada al ferrocarril a través de la
with
construcción. - Herramientas integradas para administrar dependencias, compilación de código, ejecución de pruebas, formateo de código, depuración remota y más
- Colecciones perezosas y asíncronas con flujos
- Coincidencia de patrones para promover un código asertivo
- Compatibilidad con Unicode y cadenas UTF-8
Ejemplos
Los siguientes ejemplos pueden ejecutarse en un iex
shell o guardarse en un archivo y ejecutarse desde la línea de comando escribiendo. elixir <filename>
Ejemplo clásico de Hola mundo:
iex > IO . pone ("¡Hola Mundo!") ¡Hola Mundo!
Lista de comprensión:
iex> for n <- [ 1, 2, 3, 4, 5 ], rem (n, 2) == 1, do: n * n [1, 9, 25]
Coincidencia de patrones (desestructuración):
es decir > [ 1, un ] = [ 1, 2 ] es decir > un 2 iex> {:ok, [ hola: a ]} = {:ok, [ hola: "mundo" ]} iex> a "mundo"
Coincidencia de patrones (cláusulas múltiples):
iex> expediente del caso . read ("ruta/al/archivo") do iex> {:ok, contenidos } -> IO . puts ("archivo encontrado: #{ contenidos } ") iex> {: error, razón } -> IO . puts ("archivo faltante: #{ motivo } ") iex> end
Operador de tubería:
iex> "1" |> Cadena . to_integer () |> Núcleo .* (2) 2
Módulos:
defmodule Fun do def fib (0), do: 0 def fib (1), do: 1 def fib (n), do: fib (n - 2) + fib (n - 1) end
Generando secuencialmente mil procesos:
para num <- 1.. 1000, haga: spawn fn -> IO . pone (" #{ num * 2 } ") fin
Realización asincrónica de una tarea:
tarea = tarea . async fn -> perform_complex_action () end other_time_Consuming_action () Task . esperar tarea
Proyectos destacados de Elixir
- Mix es una herramienta de automatización de compilación que proporciona tareas para crear, compilar y probar proyectos de Elixir, administrar sus dependencias y más.
- Phoenix es un marco de desarrollo web escrito en Elixir que implementa el patrón Model View Controller (MVC) del lado del servidor.
Contenido relacionado
SHRDLU
Streaming de extensiones SIMD
Variedad (cibernética)