Elixir | |
---|---|
clase de idioma | lenguaje de programación funcional , lenguaje con sangría [d] , software de código abierto y lenguaje de programación |
Apareció en | 9 de enero de 2011 [2] |
Desarrollador | José Walim [d] |
extensión de archivo | .exo.exs |
Liberar |
|
sido influenciado | Erlang , rubí y clojure |
Licencia | Licencia Apache 2.0 [3] |
Sitio web | elixir-lang.org _ |
Plataforma | VIGA |
sistema operativo | multiplataforma |
Archivos multimedia en Wikimedia Commons |
Elixir es un lenguaje de programación funcional , distribuido y de propósito general que se ejecuta en la máquina virtual Erlang (BEAM). Construido sobre Erlang, que proporciona distribución, tolerancia a fallas, ejecución suave en tiempo real , metaprogramación con macros y polimorfismo implementado a través de protocolos [4] . Utiliza Erlang/OTP para trabajar con árboles de procesos [5] .
Creado por José Valim , anteriormente uno de los principales desarrolladores del framework Ruby on Rails y co-fundador de Plataformatec [6] [7] . Su objetivo era permitir una mayor extensibilidad y rendimiento en la máquina virtual de Erlang mientras se mantenía la compatibilidad con las herramientas y el ecosistema de Erlang [8] .
Los programas se compilan en bytecode para la máquina virtual Erlang (BEAM) [9] . Cada elemento del programa es una expresión [9] , las funciones del lenguaje Erlang se pueden llamar sin afectar el tiempo de ejecución debido a la compilación del código de bytes en Erlang y viceversa.
La metaprogramación permite la manipulación directa del árbol de sintaxis abstracta (ASD) [9] . Polimorfismo implementado a través de un mecanismo de protocolo que, como Clojure , proporciona un mecanismo de programación (que no debe confundirse con la programación múltiple). Programación paralela : sin compartir recursos, a través del paso de mensajes ( modelo de actor ) [10] . En la práctica, el énfasis está en la recursión y las funciones de orden superior en lugar de los bucles de efectos secundarios . Para implementar el paralelismo simple, se utilizan mecanismos Erlang con una sintaxis simplificada (por ejemplo, Task ) [9] .
Evaluación diferida implementada y colecciones asincrónicas con flujos, coincidencia de patrones [9] .
El lenguaje admite cadenas Unicode y UTF-8 . Compatibilidad implementada para documentar el código en una sintaxis que recuerda a las cadenas de documentación de Python , pero en formato Markdown [9] .
En un nivel bajo, Elixir usa los tipos primitivos disponibles en la máquina virtual Erlang. Entonces, una lista es solo una colección ordenada de valores.
Elixir tiene los siguientes tipos de datos incorporados (ver también tipos de datos de Erlang ) [11] :
Sobre la base de estos tipos primitivos en Elixir, en particular, se construyen cadenas y estructuras [11] .
Los tipos de datos incorporados se pueden usar para crear abstracciones de nivel superior. Los módulos se utilizan para crear abstracciones de datos en el lenguaje de programación funcional Elixir . Por ejemplo, Keyword es un módulo de Elixir, y su implementación se basa en una lista de tuplas y, por supuesto, Keyword también puede tratarse como una lista [12] . Los módulos son " puros " y no contienen su propio estado, como, por ejemplo, los objetos en lenguajes que usan OOP [13] .
Por ejemplo, el equivalente "строка".downcasede Ruby a Elixir sería: String.downcase("строка"). Por lo general, una instancia de abstracción se pasa a las funciones del módulo como primer argumento.
Los módulos contienen funciones que le permiten crear una abstracción, realizar solicitudes y también modificarla (mediante la creación de una nueva instancia). Cabe señalar que las abstracciones no pueden contener datos ocultos ; son transparentes para los usuarios del módulo. Al mismo tiempo, los módulos pueden contener funciones internas (definidas con defp) que no están disponibles en otros módulos [13] .
Elixir fue concebido como una mejora de Erlang, en particular, una simplificación significativa de la sintaxis. Una de las principales diferencias es la capacidad de reasignar valores de variables. En Elixir, no es necesario terminar cada comando con un punto (como en Prolog ), ya que las expresiones están separadas por una nueva línea y un punto y coma (;). En Elixir, no es necesario exportar las funciones del módulo, mientras que en Erlang, de forma predeterminada, todas las funciones no están disponibles desde otros módulos a menos que se mencionen en el -export archivo . Por lo tanto, la sintaxis de Elixir se parece más a la de Ruby [7] .
El lenguaje de programación Elixir se utiliza para desarrollar aplicaciones web utilizando el ecosistema de aplicaciones web Phoenix totalmente funcional, así como el servidor HTTP Cowboy. [catorce]
Los siguientes ejemplos se pueden ejecutar en el shell iex , o se pueden guardar en un archivo y ejecutar con la extensión . elixir <имя файла>
Un ejemplo de un programa clásico de Hola mundo :
IO _ pone "¡Hola mundo!"La creación de una nueva lista ( Lista ) basada en una lista existente usando la lista incluye :
for n <- [ 1 , 2 , 3 , 4 , 5 ], rem ( n , 2 ) == 1 , do : n * n #=> [1, 9, 25]La coincidencia de patrones:
[ 1 , un ] = [ 1 , 2 ] # un = 2 { :ok , [ hola : a ]} = { :ok , [ hola : "mundo" ]} # a = "mundo"Operador de tubería ( ing. tubería ):
"3" |> Cadena . to_integer () |> Núcleo .* ( 2 ) # 6Datos binarios y cadenas de bits [15] :
bb = << 20 , 19 , 3 >> # << 20, 19, 3>> << b1 , b2 , b3 >> = bb # << 20, 19, 3 >> b1 # 20 << a :: 4 , b :: 4 >> = << 254 >> # <<254>> a # 15 b # 14donde bb es una variable con datos binarios de tres bytes b1, b2, b3 (se muestra la sintaxis de coincidencia de patrones), y del número 254, usando coincidencia de patrones, los bits del uno al cuatro y del cinco al ocho se extraen en variables separadas a y b.
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 endGeneración de una gran cantidad de procesos en un bucle:
para num <- 1 .. 1000 , haga : spawn fn -> IO . pone ( " #{ num * 2 } " ) finEjecución asíncrona:
tarea = tarea . async fn -> perform_complex_action () end other_action () Tarea . esperar tareaRepresentación interna del código:
cita hacer : ( k = 1 ; k + 2 ) # resulta en { :__block__ , [], [{ := , [], [{ :k , [], Elixir }, 1 ]}, { :+ , [ contexto : Elixir , importación : Kernel ], [{ :k , [], Elixir }, 2 ]}]}Para trabajar con proyectos de Elixir: crear nuevos, administrar dependencias, compilar, probar, ejecutar para ejecución, existe una utilidad de automatización ( herramienta de compilación en inglés ) llamada Mix. Por ejemplo, el comando mix new myproject crea un nuevo proyecto a partir de una plantilla, lo que da como resultado un directorio de proyecto (Mix versión 1.1.1) [16] :
mi proyecto/ ├── configuración │ └── config.exs ├── .gitignore ├── libre │ └── miproyecto.ex ├── mix.exs ├── LÉAME.md └── prueba ├── miproyecto_prueba.exs └── test_helper.exsDonde config contiene la configuración de la aplicación, lib es el código fuente, tests son las pruebas, mix.exs es la configuración del proyecto.
Lenguajes de programación | |
---|---|
|