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] .
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] .
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] .
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] .
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] .
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]
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 ) # 6Date 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 # 14unde 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 endGenerarea unui număr mare de procese într-o buclă:
pentru num <- 1 .. 1000 , do : spawn fn -> IO . pune ( " #{ num * 2 } " ) finalExecuție asincronă:
sarcină = sarcină . async fn -> perform_complex_action () end other_action () Sarcină . așteaptă sarcinaReprezentarea internă a codului:
citatul do : ( k = 1 ; k + 2 ) # rezultă în { :__block__ , [], [{ := , [], [{ :k , [], Elixir }, 1 ]}, { :+ , [ context : Elixir , import : Kernel ], [{ :k , [], Elixir }, 2 ]}]}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.exsUnde config conține configurația aplicației, lib este codul sursă, tests este testele, mix.exs este configurația proiectului.
Limbaje de programare | |
---|---|
|