Elixir (gjuhë programimi)

Elixir është një gjuhë programimi funksionale, konkurrente, e nivelit të lartë dhe me qëllim të përgjithshëm, që funksionon në makinën virtuale BEAM, e cila përdoret gjithashtu për të zbatuar gjuhën e programimit Erlang. Elixir ndërtohet mbi Erlang dhe ndan të njëjtat abstraksione për ndërtimin e aplikacioneve të shpërndara, tolerante ndaj gabimeve. Elixir gjithashtu ofron mjete dhe një dizajn të zgjerueshëm. Ky i fundit mbështetet nga metaprogramimi në kohë kompajlimi me makro dhe polimorfizëm nëpërmjet protokolleve.

Komuniteti organizon ngjarje vjetore në Shtetet e Bashkuara, Evropë, dhe Japoni, si dhe ngjarje dhe konferenca të vogla lokale.

 Historia 
José Valim krijoi gjuhën e programimit Elixir si një projekt kërkimi dhe zhvillimi në Plataformatec. Synimet e tij ishin të mundësonte zgjerim dhe produktivitet më të lartë në Erlang VM, duke ruajtur përputhshmërinë me ekosistemin e Erlang-ut.

Elixir është i destinuar për faqe dhe aplikacione në shkallë të gjerë. Ai përdor veçoritë e Ruby, Erlang dhe Clojure për të zhvilluar një gjuhë me njëkohësi të lartë dhe vonesë të ulët. Është projektuar për të trajtuar vëllime të mëdha të dhënash. Elixir përdoret gjithashtu në telekomunikacion, tregti elektronike dhe financë.

Në vitin 2021 u njoftua përpjekja Numerical Elixir me qëllimin për të sjellë në ekosistemin Elixir mësimin automatik, rrjetet nervore, përpilimin e GPU-ve, përpunimin e të dhënave dhe fletoret kompjuterike.

 Versionet 
Secili prej versioneve dytësore mbështet një gamë specifike të versioneve Erlang/OTP. Versioni aktual i qëndrueshëm është .

 Karakteristikat 

 Kompilohet në kod bajtesh për makinën virtuale BEAM të Erlang. Ndërveprim i plotë me kodin Erlang, pa ndikim në kohën e ekzekutimit.
 Shkallueshmëria dhe toleranca ndaj defekteve, falë mekanizmave të lehtë të njëkohshmërisë së Erlang-ut.
 Mjete të integruara për menaxhimin e varësive, përpilimin e kodit, ekzekutimin e testeve, formatimin e kodit, debugging në distancë dhe më shumë.
 Një REPL interaktive brenda programeve në ekzekutim, duke përfshirë serverat web Phoenix, me ringarkim të kodit dhe qasje në gjendjen e brendshme.
 Çdo gjë është një shprehje.
 Përputhja e modeleve për të promovuar kodin pohues.
 Këshilla për shkrimin e mjeteve të analizës statike.
 Të dhëna të pandryshueshme, me theks, si në gjuhët e tjera funksionale, në rekursion dhe funksione të rendit më të lartë në vend të cikleve me efekte anësore.
 Programim i njëkohshëm pa asgjë të përbashkët nëpërmjet kalimit të mesazheve (modeli i aktorit).
 Koleksione të ngadalta dhe asinkrone me transmetime.
 Programimi i orientuar drejt “hekurudhave” nëpërmjet konstruktit with.
 Metaprogramim higjienik me anë të aksesit të drejtpërdrejtë në pemën abstrakte të sintaksës (AST). Bibliotekat shpesh zbatojnë gjuhë të vogla specifike për domenin, si për bazat e të dhënave ose testimin.
 Ekzekutim i kodit në kohën e kompilimit. Kompiluesi Elixir funksionon në BEAM, kështu që modulet që po kompilohen mund të ekzekutojnë menjëherë kodin që është kompiluar tashmë.
 Polimorfizëm nëpërmjet një mekanizmi të quajtur protokolle. Shpërndarje dinamike, si në Clojure, por pa dërgim të shumëfishtë, sepse protokollet Elixir dërgohen në një lloj të vetëm.
 Mbështetje për dokumentim nëpërmjet docstrings të ngjashme me Python në gjuhën e formatimit Markdown.
 Mbështetje për Unicode dhe vargje UTF-8.

 Shembuj 
Shembujt e mëposhtëm mund të ekzekutohen në një shell iex ose të ruhen në një skedar dhe të ekzekutohen nga rreshti i komandës duke shtypur elixir <filename>.

Shembull klasik i “Hello World”:
iex> IO.puts("Hello World!")
Hello World!

Operatori i tubave:
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}

iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2)
[2, 4, 6, 8, 10]

iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2) |> Enum.sum()
30

Përputhja e modelit (e njohur edhe si destruksion):
iex> %{left: x} = %{left: 5, right: 8}
iex> x
5

iex> {:ok, [_ | rest]} = {:ok, [1, 2, 3]}
iex> rest
[2, 3]

Përputhja e modelit me klauzola të shumëfishta:
iex> case File.read("path/to/file") do
iex>   {:ok, contents} -> IO.puts("found file: #{contents}")
iex>   {:error, reason} -> IO.puts("missing file: #{reason}")
iex> end

Kuptimi i listës:
iex> for n <- 1..5, rem(n, 2) == 1, do: n*n
[1, 9, 25]

Leximi asinkron i skedarëve me rrjedha:
1..5
|> Task.async_stream(&File.read!("#{&1}.txt"))
|> Stream.filter(fn {:ok, contents} -> String.trim(contents) != "" end)
|> Enum.join("\n")

Trupa me funksione të shumëfishta me mbrojtëse:
def fib(n) when n in [0, 1], do: n
def fib(n), do: fib(n-2) + fib(n-1)

Bazat e të dhënave relacionale me bibliotekën Ecto:
schema "weather" do
  field :city     # Defaults to type :string
  field :temp_lo, :integer
  field :temp_hi, :integer
  field :prcp,    :float, default: 0.0
end

Weather |> where(city: "Kraków") |> order_by(:temp_lo) |> limit(10) |> Repo.all

Duke krijuar në mënyrë sekuenciale një mijë procese:
for num <- 1..1000, do: spawn fn -> IO.puts("#{num * 2}") end

Kryerja asinkrone e një detyre:
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task

 Shih edhe 
 Informatika e njëkohshme
 Informatika e shpërndarë
 Llogaritja paralele

 Referime 

 Lexime të mëtejshme 




Kategoria:Gjuhë programimi
Kategoria:Gjuhët e programimit të njëkohshëm
Kategoria:Gjuhët funksionale
Kategoria:Gjuhët e programimit që përputhen me modelin
Kategoria:Gjuhët e programimit të krijuara në vitin 2012
Kategoria:Softuer që përdor licencën Apache