Elixir (programming language): Difference between revisions

Content deleted Content added
Adding links to two books and Joe Armstrong's blog entry on Elixir
No edit summary
 
(354 intermediate revisions by more than 100 users not shown)
Line 1:
{{Short description|Programming language running on the Erlang virtual machine}}
{{Refimprove|date=March 2013}}
{{Primary sources|date=June 2023}}
{{Infobox programming language
| name = Elixir
| logo = [[File:Elixir Site Logo - May 24th 2013.png|Frameless|Elixir]]
| title =
| caption = Elixir
| logo = [[File:Elixir programming language logo.svg|frameless|170px|elixir programming language]]
| name = Elixir
| logo caption = Elixir
| paradigm = [[multi-paradigm programming language|multi-paradigm]]: [[concurrent programming|concurrent]], [[functional programming|functional]]
| paradigms = [[multi-paradigm programming language|multi-paradigm]]: [[functional programming|functional]], [[concurrent programming|concurrent]], [[distributed programming|distributed]], [[process-oriented programming|process-oriented]]
| year = 2011
| typing = [[type system|dynamic]], [[strong typing|strong]]
| influenced_by influenced = [[ErlangGleam (programming language)|ErlangGleam]], [[RubyLFE (programming language)|RubyLFE]], [[Clojure]]
| platform = [[Erlang (programming language)|Erlang]]
| creator = [[José Valim]]
| license = [[Apache License 2.0]]<ref>{{cite web|url=https://github.com/elixir-lang/elixir/blob/master/LICENSE|title=elixir/LICENSE at master · elixir-lang/elixir · GitHub|work=GitHub}}</ref>
| latest_release_version = 0.10.0
| website = {{URL|https://elixir-lang.org}}
| platform = [[Erlang]]
| year = {{start date and age|2012}}
| license = [[Apache License]]
| influenced_by = [[Clojure]], [[Erlang (programming language)|Erlang]], [[Ruby (programming language)|Ruby]]
| website = {{URL|http://www.elixir-lang.org/}}
| designer = José Valim
| file_ext = .ex, .exs
| origin = Brazil
| latest release version = {{wikidata|property|edit|reference|P348}}
| latest release date = {{start date and age|{{wikidata|qualifier|single|P348|P577}}}}
| latest preview version =
| latest preview date =
| file_ext = .ex, .exs
}}
{{Portal|Free software}}
 
'''Elixir''' is a [[functional languageprogramming|functional]], [[concurrent computing|concurrent]], [[High-level programming language|high-level]] [[General-purpose programming language|general-purpose]] [[programming language]] builtthat atopruns on the [[BEAM (Erlang virtual machine)|BEAM]] [[virtual machine]], which is also used to implement the [[Erlang (programming language)|Erlang]] Virtualprogramming Machinelanguage.<ref (BEAM)name=":0">{{Cite news|url=https://www.eliteinfoworld.com/blog/popular-programming-languages-2018/|title=Most Popular Programming Languages of 2018 - Elite Infoworld Blog|date=2018-03-30|access-date=2018-05-08|archive-date=2018-05-09|archive-url=https://web.archive.org/web/20180509080342/https://www.eliteinfoworld.com/blog/popular-programming-languages-2018/|url-status=dead}}</ref> Elixir builds on top of Erlang toand provideshares the same abstractions for building [[Distributed computing|distributed]], [[fault-tolerant,]] softapplications. real-time,Elixir non-stopalso applicationsprovides buttooling alsoand extendsan it[[extensible]] todesign. supportThe metalatter is supported by compile-programmingtime [[metaprogramming]] with [[Macro (computer science)|macros]] and [[polymorphism (computer science)|polymorphism]] via protocols.<ref>{{cite web |url=httphttps://elixir-lang.org|title=Elixir | work=José Valim | accessdateaccess-date=2013-02-17}}</ref>
 
The community organizes yearly events in the United States,<ref>{{Cite web|title = ElixirConf|url = http://elixirconf.com/|access-date = 2018-07-11}}</ref> Europe,<ref>{{Cite web|title = ElixirConf|url = http://elixirconf.eu/|access-date = 2018-07-11}}</ref> and Japan,<ref>{{Cite web|title = Erlang & Elixir Fest|url = https://elixir-fest.jp/|access-date = 2019-02-18}}</ref> as well as minor local events and conferences.<ref>{{Cite web|title = Elixir LDN|url = http://www.elixir.london/|access-date = 2018-07-12}}</ref><ref>{{Cite web|title = EMPEX - Empire State Elixir Conference|url = http://empex.co/|access-date = 2018-07-12}}</ref>
==History==
 
== History ==
[[José Valim]] is the creator of the Elixir programming language. His goals were to enable higher extensibility and productivity in the Erlang VM while keeping compatibility with Erlang's tools and ecosystem.<ref>{{ cite web |url=http://vimeo.com/53221562|title=Elixir - A modern approach to programming for the Erlang VM | accessdate=2013-02-17}}</ref>
José Valim created the Elixir programming language as a [[research and development]] project at Plataformatec. His goals were to enable higher extensibility and productivity in the Erlang VM while maintaining compatibility with Erlang's ecosystem.<ref>{{ cite AV media |url=http://vimeo.com/53221562|title=Elixir - A modern approach to programming for the Erlang VM | access-date=2013-02-17}}</ref><ref>{{ cite AV media |url=https://www.youtube.com/watch?v=IZvpKhA6t8A| archive-url=https://ghostarchive.org/varchive/youtube/20211117/IZvpKhA6t8A| archive-date=2021-11-17 | url-status=live|title=José Valim - ElixirConf EU 2017 Keynote | access-date=2017-07-14}}{{cbignore}}</ref>
 
Elixir is aimed at large-scale sites and apps. It uses features of [[Ruby (programming language)|Ruby]], Erlang, and [[Clojure]] to develop a high-concurrency and low-latency language. It was designed to handle large data volumes. Elixir is also used in telecommunications, e-commerce, and finance.<ref>{{ cite web |url=https://www.welcometothejungle.com/en/articles/btc-elixir-jose-valim/|title=Behinde the code: The One Who Created Elixir | access-date=2019-11-25}}</ref>
==Features==
 
In 2021, the Numerical Elixir effort was announced with the goal of bringing machine learning, neural networks, GPU compilation, data processing, and computational notebooks to the Elixir ecosystem.<ref>{{Cite web|title = Numerical Elixir (Nx)| website=[[GitHub]] |url = https://github.com/elixir-nx|access-date = 2024-05-06}}</ref>
* A language targeting [[Erlang (programming language)|Erlang]] Virtual Machine (BEAM)
 
* Seamless [[Erlang (programming language)|Erlang]] integration: zero-penalty Erlang function calls (and vice versa)
== Versioning ==
* Meta programming via [[Lisp macro|macros]] and a first-class AST
Each of the minor versions supports a specific range of Erlang/[[Open Telecom Platform|OTP]] versions.<ref>{{Citation|title=Elixir is a dynamic, functional language designed for building scalable and maintainable applications: elixir-lang/elixir|date=2019-04-21|url=https://github.com/elixir-lang/elixir|publisher=Elixir|access-date=2019-04-21}}</ref> The current stable release version is {{wikidata|property|edit|reference|P348}}.
* [[Polymorphism (computer science)|Polymorphism]] via protocols inspired by [[Clojure]]
 
* First-class documentation
== Features ==
* [[Shared nothing architecture|Shared-nothing concurrent programming]] via message passing ([[Actor model]])
* [[Compiler|Compiles]] to [[bytecode]] for the [[BEAM (Erlang virtual machine)|BEAM virtual machine]] of [[Erlang (programming language)|Erlang]].<ref name="elixirhome">{{ cite web |url=https://elixir-lang.org/|title=Elixir | access-date=2014-09-07}}</ref> Full interoperability with Erlang code, without [[Runtime (program lifecycle phase)|runtime]] impact.
* Emphasis on [[recursion (computer science)|recursion]] and [[higher-order function]]s instead of [[side-effect (computer science)|side-effect]]-based [[loop (computing)|looping]].
* Scalability and fault-tolerance, thanks to Erlang's lightweight concurrency mechanisms<ref name="elixirhome" />
* Everything is an expression
* [[Mix (build tool)|Built-in tooling]] for managing dependencies, code compilation, running tests, formatting code, remote debugging and more.
* [[Pattern matching]]
* An interactive [[Read–eval–print loop|REPL]] inside running programs, including [[Phoenix (web framework)|Phoenix]] web servers, with code reloading and access to internal state
* Everything is an [[Expression (computer science)|expression]]<ref name="elixirhome" />
* [[Pattern matching]]<ref name="elixirhome" /> to promote assertive code<ref>{{Cite web |date=24 September 2014 |title=Writing assertive code with Elixir |url=http://blog.plataformatec.com.br/2014/09/writing-assertive-code-with-elixir/ |access-date=2018-07-05}}</ref>
* Type hints for static analysis tools
* Immutable data, with an emphasis, like other [[Functional programming|functional]] languages, on [[recursion (computer science)|recursion]] and [[higher-order function]]s instead of [[side-effect (computer science)|side-effect]]-based [[loop (computing)|looping]]
* [[Shared nothing architecture|Shared nothing concurrent programming]] via message passing ([[actor model]])<ref>{{cite book |last1=Loder |first1=Wolfgang |url=https://leanpub.com/erlangandelixirforimperativeprogrammers |title=Erlang and Elixir for Imperative Programmers |date=12 May 2015 |publisher=Leanpub |___location="Chapter 16: Code Structuring Concepts", section title "Actor Model" |access-date=7 July 2015}}</ref>
* [[Lazy evaluation|Lazy]] and [[Futures and promises|async collections]] with streams
* Railway oriented programming via the <code>with</code> construct<ref>{{Cite web |last=Wlaschin |first=Scott |date=May 2013 |title=Railway Oriented Programming |url=https://fsharpforfunandprofit.com/rop/ |url-status=live |archive-url=https://web.archive.org/web/20210130221804/http://fsharpforfunandprofit.com/rop/ |archive-date=30 January 2021 |access-date=28 February 2021 |website=F# for Fun and Profit}}</ref>
* Hygienic [[metaprogramming]] by direct access to the [[abstract syntax tree]] (AST).<ref name="elixirhome" /> Libraries often implement small [[Domain-specific language|___domain-specific languages]], such as for databases or testing.
* Code execution at compile time. The Elixir compiler also runs on the BEAM, so modules that are being compiled can immediately run code which has already been compiled.
* [[Polymorphism (computer science)|Polymorphism]] via a mechanism called protocols. [[Dynamic dispatch]], as in [[Clojure]], however, without [[multiple dispatch]] because Elixir protocols dispatch on a single type.
* Support for documentation via Python-like docstrings in the [[Markdown]] formatting language<ref name="elixirhome" />
* [[Unicode]] support and [[UTF-8]] strings
 
== ReferencesExamples ==
The following examples can be run in an <code>iex</code> [[Shell (computing)|shell]] or saved in a file and run from the [[command line]] by typing <code>elixir ''<filename>''</code>.
{{reflist|1}}
 
Classic [["Hello, World!" program|Hello world]] example:
== External links ==
* [http://elixir-lang.org/ Elixir language website]
* [https://github.com/elixir-lang/elixir/ Code on GitHub]
* [http://vimeo.com/53221562 Elixir - A modern approach to programming for the Erlang VM video presentation]
* [http://pragprog.com/book/elixir/programming-elixir Dave Thomas: "Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun" (book)]
* [http://shop.oreilly.com/product/0636920030584.do Simon St. Laurent, J. David Eisenberg: "Introducing Elixir" (book)]
* [http://joearms.github.io/2013/05/31/a-week-with-elixir.html Joe Armstrong: "A Week with Elixir" (blog entry)]
 
<syntaxhighlight lang="iex">
[[Category:Programming languages]]
iex> IO.puts("Hello World!")
Hello World!
</syntaxhighlight>
 
Pipe operator:
<syntaxhighlight lang="iex">
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)
{{Prog-lang-stub}}
[2, 4, 6, 8, 10]
 
iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2) |> Enum.sum()
30
</syntaxhighlight>
[[Pattern matching]] (a.k.a. destructuring):
<syntaxhighlight lang="iex">
iex> %{left: x} = %{left: 5, right: 8}
iex> x
5
 
iex> {:ok, [_ | rest]} = {:ok, [1, 2, 3]}
iex> rest
[2, 3]
</syntaxhighlight>
 
Pattern matching with multiple clauses:
<syntaxhighlight lang="iex">
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
</syntaxhighlight>
 
[[List comprehension]]:
<syntaxhighlight lang="iex">
iex> for n <- 1..5, rem(n, 2) == 1, do: n*n
[1, 9, 25]
</syntaxhighlight>
 
Asynchronously reading files with streams:
<syntaxhighlight lang="elixir">
1..5
|> Task.async_stream(&File.read!("#{&1}.txt"))
|> Stream.filter(fn {:ok, contents} -> String.trim(contents) != "" end)
|> Enum.join("\n")
</syntaxhighlight>
 
Multiple function bodies with [[Guard (computer science)#Mathematics|guards]]:
<syntaxhighlight lang="elixir">
def fib(n) when n in [0, 1], do: n
def fib(n), do: fib(n-2) + fib(n-1)
</syntaxhighlight>
 
Relational databases with the Ecto library:
<syntaxhighlight lang="elixir">
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
</syntaxhighlight>
 
Sequentially spawning a thousand processes:
<syntaxhighlight lang=elixir>
for num <- 1..1000, do: spawn fn -> IO.puts("#{num * 2}") end
</syntaxhighlight>
 
[[Async/await|Asynchronously]] performing a task:
<syntaxhighlight lang=elixir>
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task
</syntaxhighlight>{{cn|date=June 2023}}
 
== See also ==
{{Portal|Free and open-source software}}
* [[Concurrent computing]]
* [[Distributed computing]]
* [[Parallel computing]]
 
== References ==
{{Reflist|30em}}
 
== Further reading ==
* {{Cite book |author1=Simon St. Laurent |author2=J. Eisenberg |date=December 22, 2016 |title=Introducing Elixir: Getting Started in Functional Programming 2nd Edition|publisher=[[O'Reilly Media]] |isbn=978-1491956779 |language=en}}
* {{Cite book |author=Sasa Juric |date=January 12, 2019 |title=Elixir in Action 2nd Edition |publisher=[[Manning Publications]] |isbn=978-1617295027 |language=en}}
 
{{Programming languages}}
{{Authority control}}
 
[[Category:Concurrent programming languages]]
[[Category:Functional languages]]
[[Category:Pattern matching programming languages]]
[[Category:Programming languages]]
[[Category:Programming languages created in 2012]]
[[Category:Software using the Apache license]]