Elixir (gjuhë programimi)

Elixir
Elixir
Paradigmsfunksionale, konkurrente, e shpërndarë, e orientuar drejt proceseve
Designed byJosé Valim
First appeared2012 (2012)
Typing disciplinedinamik, i fortë
PlatformErlang
LicenseApache License 2.0[1]
Filename extensions.ex, .exs
Websiteelixir-lang.org
Influenced by
Clojure, Erlang, Ruby
Influenced
Gleam, LFE


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.[2] 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.[3]

Komuniteti organizon ngjarje vjetore në Shtetet e Bashkuara,[4] Evropë,[5] dhe Japoni,[6] si dhe ngjarje dhe konferenca të vogla lokale.[7][8]

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.[9][10]

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ë.[11]

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.[12]

Versionet

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

Karakteristikat

  • Kompilohetkod bajtesh për makinën virtuale BEAM të Erlang.[14] 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.[14]
  • 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.[14]
  • Përputhja e modeleve[14] për të promovuar kodin pohues.[15]
  • 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).[16]
  • Koleksione të ngadalta dhe asinkrone me transmetime.
  • Programimi i orientuar drejt “hekurudhave” nëpërmjet konstruktit with.[17]
  • Metaprogramim higjienik me anë të aksesit të drejtpërdrejtë në pemën abstrakte të sintaksës (AST).[14] 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.[14]
  • 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

Referime

  1. "elixir/LICENSE at master · elixir-lang/elixir · GitHub". GitHub (në anglisht).
  2. "Most Popular Programming Languages of 2018 - Elite Infoworld Blog" (në anglisht). 2018-03-30. Arkivuar nga origjinali më 2018-05-09. Marrë më 2018-05-08.
  3. "Elixir". José Valim (në anglisht). Marrë më 2013-02-17.
  4. "ElixirConf" (në anglisht). Marrë më 2018-07-11.
  5. "ElixirConf" (në anglisht). Marrë më 2018-07-11.
  6. "Erlang & Elixir Fest" (në anglisht). Arkivuar nga origjinali më 2019-03-30. Marrë më 2019-02-18.
  7. "Elixir LDN" (në anglisht). Arkivuar nga origjinali më 2018-07-12. Marrë më 2018-07-12.
  8. "EMPEX - Empire State Elixir Conference" (në anglisht). Marrë më 2018-07-12.
  9. Elixir - A modern approach to programming for the Erlang VM (në anglisht). Marrë më 2013-02-17.
  10. José Valim - ElixirConf EU 2017 Keynote (në anglisht). Arkivuar nga origjinali më 6 tetor 2024. Marrë më 2017-07-14.
  11. "Behinde the code: The One Who Created Elixir" (në anglisht). Marrë më 2019-11-25.
  12. "Numerical Elixir (Nx)". GitHub (në anglisht). Marrë më 2024-05-06.
  13. Elixir is a dynamic, functional language designed for building scalable and maintainable applications: elixir-lang/elixir (në anglisht), Elixir, 2019-04-21, marrë më 2019-04-21
  14. 1 2 3 4 5 6 "Elixir" (në anglisht). Marrë më 2014-09-07.
  15. "Elixir". José Valim (në anglisht). Marrë më 2013-02-17.
  16. "ElixirConf" (në anglisht). Marrë më 2018-07-11.
  17. "ElixirConf" (në anglisht). Marrë më 2018-07-11.

Lexime të mëtejshme