Elixir (limbaj de programare)

Elixir
Clasa de limba limbaj de programare funcțional , limbaj indentat [d] , software open source și limbaj de programare
Aparut in 9 ianuarie 2011 [2]
Dezvoltator Jose Walim [d]
Extensie de fișier .exsau.exs
Eliberare
A fost influențat Erlang , Ruby și Clojure
Licență Licență Apache 2.0 [3]
Site-ul web elixir-lang.org
Platformă GRANDĂ
OS multiplatformă
 Fișiere media la Wikimedia Commons

Elixir  este un limbaj de programare funcțional , distribuit , de uz general, care rulează pe mașina virtuală Erlang (BEAM). Construit pe baza Erlang, care oferă distribuție, toleranță la erori, execuție soft în timp real , metaprogramare cu macrocomenzi și polimorfism implementat prin protocoale [4] . Utilizează Erlang/OTP pentru a lucra cu arbori de proces [5] .

Creat de José Valim , fost unul dintre principalii dezvoltatori ai cadrului Ruby on Rails și co-fondator al Plataformatec [6] [7] . Scopul său a fost să permită o extensibilitate și o performanță mai ridicate în VM Erlang, menținând în același timp compatibilitatea cu instrumentele și ecosistemul Erlang [8] .

Caracteristici

Programele sunt compilate în bytecode pentru Erlang Virtual Machine (BEAM) [9] . Fiecare element al programului este o expresie [9] , funcțiile limbajului Erlang pot fi apelate fără a afecta timpul de execuție datorită compilării bytecode-ului în Erlang și invers.

Metaprogramarea permite manipularea directă a arborelui de sintaxă abstractă (ASD) [9] . Polimorfismul implementat printr-un mecanism de protocol care, la fel ca Clojure , oferă un mecanism de planificare (a nu fi confundat cu programarea multiplă). Programare paralelă  - fără partajare a resurselor, prin transmitere de mesaje ( model actor ) [10] . În practică, se pune accent pe recursivitate și funcții de ordin superior în loc de bucle cu efecte secundare . Pentru a implementa paralelismul simplu, se folosesc mecanisme Erlang cu o sintaxă simplificată (de exemplu, Sarcina ) [9] .

Evaluare leneșă implementată și colecții asincrone cu fluxuri, potrivire de modele [9] .

Limbajul acceptă șiruri Unicode și UTF-8 . S-a implementat suport pentru documentarea codului în sintaxă care amintește de docstring-urile Python , dar în format Markdown [9] .

Descrierea limbii

Tipuri de date

La un nivel scăzut, Elixir folosește tipurile primitive disponibile în mașina virtuală Erlang. Deci, o listă  este doar o colecție ordonată de valori.

Elixir are următoarele tipuri de date încorporate (vezi și tipurile de date Erlang ) [11] :

Pe baza acestor tipuri primitive din Elixir, în special, se construiesc șiruri și structuri [11] .

Module

Tipurile de date încorporate pot fi utilizate pentru a construi abstracții de nivel superior. Modulele sunt folosite pentru a construi abstracții de date în limbajul de programare funcțional Elixir . De exemplu, Keyword este un modul Elixir, iar implementarea lui se bazează pe o listă de tupluri și, bineînțeles, Keyword poate fi, de asemenea, tratată ca o listă [12] . Modulele sunt „ pure ” și nu conțin propria lor stare, cum ar fi, de exemplu, obiectele din limbaje care utilizează OOP [13] .

De exemplu, echivalentul "строка".downcasede la Ruby la Elixir ar fi: String.downcase("строка"). De obicei, o instanță de abstractizare este transmisă funcțiilor modulului ca prim argument.

Modulele conțin funcții care vă permit să creați o abstracție, să faceți cereri și, de asemenea, să o modificați (prin crearea unei instanțe noi). Trebuie remarcat faptul că abstracțiile nu pot conține date ascunse - sunt transparente pentru utilizatorii modulelor. În același timp, modulele pot conține funcții interne (definite cu defp) care nu sunt disponibile de la alte module [13] .

Comparație cu Erlang

Elixir a fost conceput ca o îmbunătățire a Erlangului, în special, o simplificare semnificativă a sintaxei. Una dintre diferențele principale este capacitatea de a reatribui valori variabile. În Elixir, nu este necesar să se încheie fiecare comandă cu un punct (ca în Prolog ), deoarece expresiile sunt separate printr-o linie nouă și un punct și virgulă (;). În Elixir, nu este necesară exportarea funcțiilor modulelor, în timp ce în Erlang, în mod implicit, toate funcțiile nu sunt disponibile din alte module decât dacă sunt menționate în -export . Astfel, sintaxa lui Elixir seamănă mai mult cu cea a lui Ruby [7] .

Utilizare

Limbajul de programare Elixir este folosit pentru a dezvolta aplicații web folosind ecosistemul de aplicații web complet funcțional Phoenix, precum și serverul HTTP Cowboy. [paisprezece]

Exemple

Următoarele exemple pot fi executate în shell-ul iex sau pot fi salvate într-un fișier și rulate cu . elixir <имя файла>

Un exemplu de program clasic Hello world :

I.O. _ pune „Bună lume!”

Crearea unei noi liste ( Lista ) pe baza unei liste existente folosind lista include :

pentru n <- [ 1 , 2 , 3 , 4 , 5 ], rem ( n , 2 ) == 1 , do : n * n #=> [1, 9, 25]

Potrivire de model:

[ 1 , a ] = [ 1 , 2 ] # a = 2 { :ok , [ salut : a ]} = { :ok , [ salut : " lume " ]} # a = " lume "

Operator de conducte ( ing.  conductă ):

„3” |> String . to_integer () |> Kernel .* ( 2 ) # 6

Date binare și șiruri de biți [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

unde bb este o variabilă cu date binare de trei octeți b1, b2, b3 (este afișată sintaxa de potrivire a modelului), iar din numărul 254, folosind potrivirea modelului, biții de la unu la patru și de la cinci la opt sunt extrași în variabile separate a și b.

Module:

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

Generarea unui număr mare de procese într-o buclă:

pentru num <- 1 .. 1000 , do : spawn fn -> IO . pune ( " #{ num * 2 } " ) final

Execuție asincronă:

sarcină = sarcină . async fn -> perform_complex_action () end other_action () Sarcină . așteaptă sarcina

Reprezentarea internă a codului:

citatul do : ( k = 1 ; k + 2 ) # rezultă în { :__block__ , [], [{ := , [], [{ :k , [], Elixir }, 1 ]}, { :+ , [ context : Elixir , import : Kernel ], [{ :k , [], Elixir }, 2 ]}]}

Trusa de instrumente

Pentru a lucra cu proiecte Elixir: crearea altora noi, gestionarea dependențelor, compilarea, testarea, rularea pentru execuție, există un utilitar de automatizare ( instrument de construcție în engleză  ) numit Mix. De exemplu, comanda mix new myproject creează un nou proiect dintr-un șablon, rezultând un director de proiect (Mix versiunea 1.1.1) [16] :

proiectul meu/ ├── config │ └── config.exs ├── .gitignore ├── lib │ └── proiectul meu.ex ├── amestec.exs ├── README.md └── test ├── myproject_test.exs └── test_helper.exs

Unde config conține configurația aplicației, lib este codul sursă, tests este testele, mix.exs este configurația proiectului.

Note

  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/development.html
  4. Elixir . Jose Valim . Data accesului: 17 februarie 2013. Arhivat din original la 18 aprilie 2012.
  5. Thomas, 2014 , Când procesele mor.
  6. Echipa de bază (downlink) . Consultat la 31 octombrie 2015. Arhivat din original la 14 februarie 2021. 
  7. 1 2 Mihalis Tsoukalos , „Elxir: Take a functional swig”, Linux Format, numărul 203, 2015
  8. Elixir - O abordare modernă a programării pentru Erlang VM . Data accesului: 17 februarie 2013. Arhivat din original pe 29 noiembrie 2012.
  9. 1 2 3 4 5 6 Elixir . Preluat la 7 septembrie 2014. Arhivat din original la 18 aprilie 2012.
  10. Loder, Wolfgang. Erlang și Elixir pentru programatori imperative  (neopr.) . — „Capitolul 16: Concepte de structurare a codului”, titlul secțiunii „Model de actor”: Leanpub, 2015. Arhivat 9 iulie 2015 la Wayback Machine
  11. 1 2 Thomas, 2014 , Tipuri încorporate.
  12. Thomas, 2014 , An Aside—What Are Types?.
  13. 1 2 Jurić, 2019 , Abstracții de date.
  14. Construirea unei aplicații web pe Phoenix și Elm . www.wunsh.ru _ 22-12-2017. Preluat la 10 decembrie 2020. Arhivat din original la 09 mai 2021.
  15. Jurić, 2019 , 3. Control flow.
  16. Thomas, 2014 .

Literatură

  • Senloren S., Eisenberg D. Introduction to Elixir = Introducing Elixir. - DMK-Press , 2017. - 262 p. — ISBN 978-5-97060-518-9 .
  • Dave Thomas. Elixirul de programare. - Raft pragmatic, 2014. - 280 p. — ISBN 978-1-937785-58-1 .
  • Simon St. Laurent, J. David Eisenberg. Vă prezentăm Elixir. - O'Reilly Media, 2014. - 210 p. — ISBN 978-1-4493-6999-6 .
  • Chris McCord. Elixirul de metaprogramare. - Raft pragmatic, 2015. - 120 p. - ISBN 978-1-68050-041-7 .
  • Sasa Juric. Elixirul în acțiune. — Ed. a II-a. - Manning Publications, 2019. - ISBN 9781617295027 .
  • Bruce A. Tate, Ian Dees, Frederic Daoud, Jack Moffitt. Elixir // Alte șapte limbi în șapte săptămâni. - Raft pragmatic, 2014. - 350 p. - ISBN 978-1-941222-15-7 .

Link -uri