Elixir (programmeringsspråk)

Elixir
Språkklass funktionellt programmeringsspråk , indraget [d] språk , programvara med öppen källkod och programmeringsspråk
Framträdde i 9 januari 2011 [2]
Utvecklaren Jose Walim [d]
Filtillägg _ .exeller.exs
Släpp
Blivit påverkad Erlang , Ruby och Clojure
Licens Apache License 2.0 [3]
Hemsida elixir-lang.org
Plattform BEAM
OS plattformsoberoende
 Mediafiler på Wikimedia Commons

Elixir  är ett funktionellt , distribuerat , allmänt programmeringsspråk som körs på Erlang Virtual Machine (BEAM). Byggd ovanpå Erlang, som tillhandahåller distribution, feltolerans, mjuk realtidsexekvering , metaprogrammering med makron och polymorfism implementerad genom protokoll [4] . Använder Erlang/OTP för att arbeta med processträd [5] .

Skapad av José Valim , tidigare en av huvudutvecklarna av Ruby on Rails-ramverket och medgrundare av Plataformatec [6] [7] . Dess mål var att möjliggöra högre utbyggbarhet och prestanda i Erlang VM samtidigt som kompatibiliteten med Erlangs verktyg och ekosystem bibehålls [8] .

Funktioner

Program kompileras till bytekod för Erlang Virtual Machine (BEAM) [9] . Varje element i programmet är ett uttryck [9] , Erlang språkfunktioner kan anropas utan att påverka exekveringstiden på grund av att bytekoden kompileras i Erlang och vice versa.

Metaprogrammering möjliggör direkt manipulation av det abstrakta syntaxträdet (ASD) [9] . Polymorfism implementerad genom en protokollmekanism som, liksom Clojure , tillhandahåller en schemaläggningsmekanism (inte att förväxla med multipel schemaläggning). Parallell programmering  - utan resursdelning, genom meddelandeförmedling ( aktörsmodell ) [10] . I praktiken ligger tonvikten på rekursion och högre ordningsfunktioner istället för sidoeffektslingor . För att implementera enkel parallellism används Erlang-mekanismer med en förenklad syntax (till exempel Task ) [9] .

Implementerat lat utvärdering och asynkrona samlingar med strömmar, mönstermatchning [9] .

Språket stöder Unicode och UTF-8- strängar. Implementerat stöd för att dokumentera kod i syntax som påminner om Python docstrings , men i Markdown -format [9] .

Beskrivning av språket

Datatyper

På en låg nivå använder Elixir de primitiva typerna som finns i den virtuella maskinen Erlang. Så en lista  är bara en ordnad samling av värden.

Elixir har följande inbyggda datatyper (se även Erlang datatyper ) [11] :

På basis av dessa primitiva typer i Elixir, i synnerhet, byggs strängar och strukturer [11] .

Moduler

Inbyggda datatyper kan användas för att bygga abstraktioner på högre nivå. Moduler används för att bygga dataabstraktioner i det funktionella programmeringsspråket Elixir . Till exempel är Keyword en Elixir-modul, och dess implementering är baserad på en lista med tupler , och naturligtvis kan Keyword också behandlas som en lista [12] . Moduler är " rena " och innehåller inte sitt eget tillstånd, som till exempel objekt på språk som använder OOP [13] .

Till exempel skulle motsvarigheten "строка".downcasefrån Ruby till Elixir vara: String.downcase("строка"). Vanligtvis skickas en abstraktionsinstans till modulfunktioner som det första argumentet.

Moduler innehåller funktioner som låter dig skapa en abstraktion, göra förfrågningar och även modifiera den (genom att skapa en ny instans). Det bör noteras att abstraktioner inte kan innehålla dolda data - de är transparenta för modulanvändare. Samtidigt kan moduler innehålla interna funktioner (definierade med defp) som inte är tillgängliga från andra moduler [13] .

Jämförelse med Erlang

Elixir var tänkt som en förbättring av Erlang, i synnerhet en betydande förenkling av syntaxen. En av de största skillnaderna är möjligheten att omtilldela variabelvärden . I Elixir är det inte nödvändigt att avsluta varje kommando med en punkt (som i Prolog ), eftersom uttryck separeras med en nyrad och ett semikolon (;). I Elixir är det inte nödvändigt att exportera modulfunktioner, medan i Erlang som standard inte alla funktioner är tillgängliga från andra moduler om de inte nämns i -export . Således är syntaxen för Elixir mer lik Rubys [7] .

Användning

Programmeringsspråket Elixir används för att utveckla webbapplikationer med hjälp av det fullt fungerande Phoenix-ekosystemet för webbapplikationer samt Cowboy HTTP-servern. [fjorton]

Exempel

Följande exempel kan köras i iex- skalet, eller kan sparas i en fil och köras med . elixir <имя файла>

Ett exempel på ett klassiskt Hello world-program :

I.O. _ sätter "Hello World!"

Att skapa en ny lista ( lista ) baserat på en befintlig lista med hjälp av lista inkluderar :

för n <- [ 1 , 2 , 3 , 4 , 5 ], rem ( n , 2 ) == 1 , gör : n * n #=> [1, 9, 25]

Mönstermatchning:

[ 1 , a ] = [ 1 , 2 ] # a = 2 { :ok , [ hej : a ]} = { : ok , [ hej : "värld" ]} # a = "värld"

Rörledningsoperatör ( eng.  pipe ):

"3" |> Sträng . to_integer () |> Kärna .* ( 2 ) # 6

Binära data och bitsträngar [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

där bb är en variabel med binära data på tre byte b1, b2, b3 (mönstermatchningssyntaxen visas), och från talet 254 extraheras bitarna ett till fyra och fem till åtta till separata variabler a och med hjälp av mönstermatchning b.

Moduler:

defmodule Fun gör def fib ( 0 ), gör : 0 def fib ( 1 ) , gör : 1 def fib ( n ) gör fib ( n - 2 ) + fib ( n - 1 ) slutslut

Skapar ett stort antal processer i en loop:

för num <- 1 .. 1000 , gör : spawn fn -> IO . sätter ( " #{ num * 2 } " ) slut

Asynkron exekvering:

uppgift = uppgift . async fn -> utför_komplex_åtgärd () avsluta annan_åtgärd () Uppgift . väntar på uppgiften

Intern representation av koden:

citat do : ( k = 1 ; k + 2 ) # resulterar i { :__block__ , [], [{ := , [], [{ :k , [], Elixir }, 1 ]}, { :+ , [ context : Elixir , import : Kernel ], [{ :k , [], Elixir }, 2 ]}]}

Toolkit

För att arbeta med Elixir-projekt: skapa nya, hantera beroenden, kompilera, testa, köra för exekvering, det finns ett automatiseringsverktyg ( engelska  byggverktyg ) som heter Mix. Exempelvis skapar kommandot mix new myproject ett nytt projekt från en mall, vilket resulterar i en projektkatalog (Mix version 1.1.1) [16] :

mitt projekt/ ├── konfig │ └── config.exs ├── .gitignore ├── lib │ └── mittprojekt.ex ├── mix.exs ├── README.md └── test ├── mittprojekt_test.exs └── test_helper.exs

Där config innehåller applikationskonfigurationen är lib källkoden, tests är testerna, mix.exs är projektkonfigurationen.

Anteckningar

  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 . Datum för åtkomst: 17 februari 2013. Arkiverad från originalet den 18 april 2012.
  5. Thomas, 2014 , När processer dör.
  6. Kärnteamet (nedlänk) . Hämtad 31 oktober 2015. Arkiverad från originalet 14 februari 2021. 
  7. 1 2 Mihalis Tsoukalos , "Elxir: Take a functional swig", Linux Format, nummer 203, 2015
  8. Elixir - Ett modernt förhållningssätt till programmering för Erlang VM . Tillträdesdatum: 17 februari 2013. Arkiverad från originalet den 29 november 2012.
  9. 1 2 3 4 5 6 Elixir . Hämtad 7 september 2014. Arkiverad från originalet 18 april 2012.
  10. Loder, Wolfgang. Erlang och Elixir för imperativa programmerare  (neopr.) . — "Chapter 16: Code Structuring Concepts", avsnittstitel "Actor Model": Leanpub, 2015. Arkiverad 9 juli 2015 på Wayback Machine
  11. 1 2 Thomas, 2014 , Inbyggda typer.
  12. Thomas, 2014 , En sida — vad är typer?.
  13. 1 2 Jurić, 2019 , Dataabstraktioner.
  14. Bygga en webbapplikation på Phoenix och Elm . www.wunsh.ru _ 2017-12-22. Hämtad 10 december 2020. Arkiverad från originalet 09 maj 2021.
  15. Jurić, 2019 , 3. Kontrollflöde.
  16. Thomas, 2014 .

Litteratur

  • Senloren S., Eisenberg D. Introduktion till Elixir = Introducing Elixir. - DMK-Press , 2017. - 262 sid. — ISBN 978-5-97060-518-9 .
  • Dave Thomas. Programmering Elixir. - Pragmatisk bokhylla, 2014. - 280 sid. — ISBN 978-1-937785-58-1 .
  • Simon St. Laurent, J. David Eisenberg. Vi presenterar Elixir. - O'Reilly Media, 2014. - 210 sid. — ISBN 978-1-4493-6999-6 .
  • Chris McCord. Metaprogrammering Elixir. - Pragmatisk bokhylla, 2015. - 120 sid. - ISBN 978-1-68050-041-7 .
  • Sasa Juric. Elixir i aktion. — 2:a uppl. - Manning Publications, 2019. - ISBN 9781617295027 .
  • Bruce A. Tate, Ian Dees, Frederic Daoud, Jack Moffitt. Elixir // Sju fler språk på sju veckor. - Pragmatisk bokhylla, 2014. - 350 sid. - ISBN 978-1-941222-15-7 .

Länkar