Elixir (lenguaje de programación)

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] .

Características

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] .

Descripción del lenguaje

Tipos de datos

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] .

Módulos

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] .

Comparación con Erlang

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] .

Uso

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]

Ejemplos

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 ) # 6

Datos 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 # 14

donde 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 end

Generación de una gran cantidad de procesos en un bucle:

para num <- 1 .. 1000 , haga : spawn fn -> IO . pone ( " #{ num * 2 } " ) fin

Ejecución asíncrona:

tarea = tarea . async fn -> perform_complex_action () end other_action () Tarea . esperar tarea

Representació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 ]}]}

Caja de herramientas

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.exs

Donde 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.

Notas

  1. https://github.com/elixir-lang/elixir/releases/tag/v1.14.0
  2. https://elixir-lang.org/blog/2014/09/18/elixir-v1-0-0-released/
  3. https://elixir-lang.org/desarrollo.html
  4. Elixir . José Valim . Fecha de acceso: 17 de febrero de 2013. Archivado desde el original el 18 de abril de 2012.
  5. Thomas, 2014 , Cuando mueren los procesos.
  6. El equipo central (enlace descendente) . Consultado el 31 de octubre de 2015. Archivado desde el original el 14 de febrero de 2021. 
  7. 1 2 Mihalis Tsoukalos , "Elxir: Tome un trago funcional", formato Linux, número 203, 2015
  8. Elixir: un enfoque moderno de la programación para Erlang VM . Fecha de acceso: 17 de febrero de 2013. Archivado desde el original el 29 de noviembre de 2012.
  9. 1 2 3 4 5 6 Elixir . Consultado el 7 de septiembre de 2014. Archivado desde el original el 18 de abril de 2012.
  10. Loder, Wolfgang. Erlang y Elixir para programadores imperativos  (neopr.) . — "Capítulo 16: Conceptos de estructuración de código", título de la sección "Modelo de actor": Leanpub, 2015. Archivado el 9 de julio de 2015 en Wayback Machine .
  11. 1 2 Thomas, 2014 , Tipos integrados.
  12. Thomas, 2014 , Un aparte: ¿Qué son los tipos?.
  13. 1 2 Jurić, 2019 , Abstracciones de datos.
  14. Creación de una aplicación web en Phoenix y Elm . www.wunsh.ru _ 2017-12-22. Consultado el 10 de diciembre de 2020. Archivado desde el original el 9 de mayo de 2021.
  15. Jurić, 2019 , 3. Flujo de control.
  16. Tomás, 2014 .

Literatura

  • Senloren S., Eisenberg D. Introducción a Elixir = Introducción a Elixir. - DMK-Prensa , 2017. - 262 p. — ISBN 978-5-97060-518-9 .
  • David Thomas. Programación Elixir. - Estantería pragmática, 2014. - 280 p. — ISBN 978-1-937785-58-1 .
  • San Simón Laurent, J. David Eisenberg. Presentación de Elixir. - O'Reilly Media, 2014. - 210 p. — ISBN 978-1-4493-6999-6 .
  • Chris McCord. Elixir de metaprogramación. - Estantería pragmática, 2015. - 120 p. - ISBN 978-1-68050-041-7 .
  • Sasa Juric. Elixir en acción. — 2ª ed. - Publicaciones de Manning, 2019. - ISBN 9781617295027 .
  • Bruce A. Tate, Ian Dees, Frederic Daoud, Jack Moffitt. Elixir // Siete idiomas más en siete semanas. - Estantería pragmática, 2014. - 350 p. - ISBN 978-1-941222-15-7 .

Enlaces