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] .
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] .
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] .
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] .
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] .
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]
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 ) # 6Binä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 # 14dä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 ) slutslutSkapar ett stort antal processer i en loop:
för num <- 1 .. 1000 , gör : spawn fn -> IO . sätter ( " #{ num * 2 } " ) slutAsynkron exekvering:
uppgift = uppgift . async fn -> utför_komplex_åtgärd () avsluta annan_åtgärd () Uppgift . väntar på uppgiftenIntern representation av koden:
citat do : ( k = 1 ; k + 2 ) # resulterar i { :__block__ , [], [{ := , [], [{ :k , [], Elixir }, 1 ]}, { :+ , [ context : Elixir , import : Kernel ], [{ :k , [], Elixir }, 2 ]}]}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.exsDär config innehåller applikationskonfigurationen är lib källkoden, tests är testerna, mix.exs är projektkonfigurationen.
Programmeringsspråk | |
---|---|
|